这种排序算法的效率是多少?

时间:2016-08-21 16:25:55

标签: algorithm performance

最近我想到了一种不同的排序方式。基本上它涉及将一系列数字视为一系列向上和向下的变化。例如,1 3 2将被翻译为上下,因为从1到3有增加,从3到2有减少。

列表中的每个数字(不包括重复元素)都可以表示为从1到列表大小的数字,其中此数字表示其在有序列表中的位置。因此,任何大小为n的列表都可以表示为1-n范围内的一系列数字。鉴于第一个元素有n个可能的条目,第二个元素为n-1,第三个元素为n-2,依此类推,我们看到有n个!列表大小为n的可能性。然后可以根据它们表现出的上下行为对这些可能性进行分组。

3412和2413可以分为上下。

现在我们按行为分组排列,我们找到每个组的特定转换,以便在转换后创建最多种类的分组。在此上下文中的转换意味着移位置换的索引并且被写为大小为n的列表。例如,如果我们将3214应用于置换4213,则我们得到置换1243.第一个索引成为第一个,第二个成为第二个,第一个成为第三个,第四个保持第四个。在该示例中,置换4213具有规则向下 - 向下并且在变换变为向上向下之后。只要在一个或多个转换之后多于一个排列属于遵循给定规则的组,则需要应用更多变换。详细说明:如果我们有4种类型向上翻转的排列,我们将转换a应用于它们并获得两种类型向下 - 向下和两种类型向上 - 向下,我们需要将转换b应用于向下 - 下行组和转换c到下行组。最后,我们有一个来自b的变换,它变为向下变换,一个从b变为向上 - 向下,一个从c变为向下 - 向下,一个从c变为向下 - 向下 - 起来。一旦每个排列只属于一个组,我们就会存储转换所遵循的规则字符串,直到成为自己的组。此外,我们发现什么转换导致这种排列被排序,或者在up-up-up-up中。在这个例子中,最后作为向下 - 向上的那个将被写为(向上 - 向下) - (向下 - 向下) - (向下 - 向下)。

一旦我们知道在给定一系列变换的情况下每个排列行为如何,我们就可以对任何大小为n的列表进行排序。请记住,准备过程只需要进行一次。将它保持在一起的数据结构(我想是一个地图,其中键是u的字符串用于up和d s用于向下和用于遵循这些规则的排列的值)需要只创建一次,然后可以无限次地使用多次排序任何大小为n的列表。

为了使用数据结构对列表进行排序,我们首先查看列表,以确定它最初遵循的规则。然后我们应用我们之前为此规则选择的转换,并查看它更改的规则。我们重复这个过程,直到我们达到只有一个排列的规则。此时我们得到排序转换并将其应用到我们的列表中以获得排序列表。

我意识到这个算法的准备阶段是o(n!)但是因为它只需要完成一次,之后它就会在最坏情况下工作o(nlogn)(或者甚至更好,老实说不是确定效率是多少)它可能是值得的。鉴于那个!变得越来越快,我意识到后备数据结构所需的内存是一个相当大的问题。但是,也许它只能用于小清单。

1 个答案:

答案 0 :(得分:0)

我不了解这比简单的机制更有效。你做 N!准备工作;你现在有一个上下(UD)序列的图表;每个节点都有一个与该UD模式匹配的序数序列列表以及该节点的首选变换。最终,您可以从任何地方找到已排序(所有U)节点的路径。

我没有看到任何使这个好主意的魔力。要对列表进行排序,

repeat until done
    - traverse the elements to determine its UD pattern: O(n)
    - if the pattern is all U, quit; the list is sorted: O(n)
    - find the node that matches that pattern: O(1) hash function
    - apply the node's transformation to the list elements: O(n)

我看到准备工作将迭代次数减少到O(log n),给出一个O(n log n)的算法。但是,这似乎比任何一种经典的O(n log n)算法都要慢,例如 quicksort

我是否错过了预期实施中的某些内容?