有许多算法可用于生成给定值集的所有可能排列。通常,这些值表示为一个数组,具有O(1)随机访问。
但是,假设要置换的元素表示为双向链表。在这种情况下,您不能在O(1)时间内随机访问列表中的元素,因此许多排列算法将经历不必要的减速。
是否有一种算法可以在尽可能少的时间和空间开销的情况下生成链表的所有可能的排列?
答案 0 :(得分:4)
尝试考虑你如何在一张纸上生成所有排列。
从最右边的数字开始,向左移动一个位置,直到看到小于其邻居的数字。比你在那里放置下一个数字的数字,并在它之后按顺序排列所有剩余的数字。这样做直到没有其他事可做。仔细考虑一下,您可以按照数字的线性时间对数字进行排序。
据我所知,这实际上是用于下一个排列的典型算法。我认为没有理由为什么这在阵列上比在列表上更快。
答案 1 :(得分:2)
您可能需要查看Steinhaus–Johnson–Trotter algorithm。它仅通过交换相邻元素来生成序列的所有排列;你可以在双重链表中的O(1)中做些什么。
答案 2 :(得分:1)
您应该将链表的数据读入一个数组,该数组需要O(n)
,然后使用堆的排列(http://www.geekviewpoint.com/java/numbers/permutation)来查找所有排列。
答案 3 :(得分:0)
您可以使用Factoradic Permutation Algorithm,并相应地重新排列节点指针,以便在没有递归的情况下生成所得到的排列。
伪描述:
element_to_permute = list
temp_list = new empty list
for i = 1 in n!
indexes[] = factoradic(i)
for j in indexes[]
rearrange pointers of node `indexes[j]` of `element_to_permute` in `temp_list`