一尘不染

您可以按O(n)摊销的复杂度对n个整数进行排序吗?

algorithm

在理论上是否可以以O(n)的摊余复杂度对n个整数数组进行排序?

试图创建O(n)复杂度最坏的情况怎么样?

如今,大多数算法都是基于O(nlogn)平均+ O(n ^ 2)最坏情况构建的。有些内存占用更多​​内存,但O(nlogn)最差。

您可以在内存使用方面不受限制地创建这样的算法吗?如果您的记忆力有限怎么办?这将如何伤害您的算法?


阅读 248

收藏
2020-07-28

共1个答案

一尘不染

Intertube上处理基于比较的排序的任何页面都将告诉您,排序
不能O(n lg n)使用比较排序快。也就是说,如果您的排序算法通过将2个元素彼此进行比较来确定顺序,那么您做得更好。示例包括快速排序,气泡排序,合并排序。

一些算法(例如计数排序或存储桶排序或基数排序)不使用比较。相反,它们依赖于数据本身的属性,例如数据中值的范围或数据值的大小。

这些算法 可能 具有更快的复杂度。这是一个示例方案:

您正在对10^6整数进行排序,并且每个整数都在0和之间10。然后,您可以只计算零,一,二等的数量,然后按排序顺序将其吐出。这就是countsort的工作原理,O(n + m)m您的基准可以采用的值数量(在这种情况下为m=11)在哪里。

另一个:

您正在对10^6所有最多为5字符的二进制字符串进行排序。您可以为此使用基数排序:首先根据它们的第一个字符将它们分成2个存储桶,然后对第二个字符(第三,第四和第五个)进行基数排序。只要每个步骤都是稳定的排序,您就应该在中得到一个排序完美的列表O(nm),其中m是数据中位数或位数(在这种情况下为m=5)。

但是在一般情况下,排序速度不能比O(n lg n)可靠排序(使用比较排序)快。

2020-07-28