是否存在线性时间就地浅滩混洗算法?这是一些特别灵巧的手能够执行的算法:均匀划分偶数大小的输入数组,然后交织两半的元素。
Mathworld上有一个关于浅滩混洗的简短页面。特别是,我对混洗类型感兴趣,该混洗类型将输入数组1 2 3 4 5 6转换为1 4 2 5 3 6。请注意,在其定义中,输入长度为。
如果我们有第二个大小为或更大的数组,则可以在线性时间内直接执行此操作。首先将最后元素复制到数组中。然后,假设为基础的0索引,复制所述第一元件从索引至。然后复制从第二阵列回输入数组元素,映射索引到。(我们可以做的工作比这少一点,因为输入中的第一个和最后一个元素不会移动。)
一种尝试就地执行此操作的方法包括将置换分解为不相交的循环,然后根据每个循环重新排列元素。同样,假设基于0的索引,则6元素情况下涉及的置换为
正如预期的那样,第一个和最后一个元素是固定点,如果我们置换中间的四个元素,我们将获得预期的结果。
不幸的是,我对排列数学的理解(以及它们的)主要基于维基百科,我不知道是否可以在线性时间内完成。也许这种混洗所涉及的排列可以迅速分解?同样,我们甚至不需要完全分解。仅确定每个不相交周期的一个元素就足够了,因为我们可以从其一个元素中重建周期。也许需要一种完全不同的方法。
相关数学上的大量资源与算法一样有价值。谢谢!