在 n 个元素的数组中,首先对 n-(root)n 个元素进行排序,我们要对数组进行排序

Posted

技术标签:

【中文标题】在 n 个元素的数组中,首先对 n-(root)n 个元素进行排序,我们要对数组进行排序【英文标题】:In the array of n elements, first n-(root)n elements are sorted, we have to sort the array 【发布时间】:2014-02-04 09:24:51 【问题描述】:

我们给出了一个由 n 个整数组成的数组,其中前 n-(squareroot)n 个元素已排序(这意味着从最后一个开始的 (root)n 个元素未排序)。我们必须以最小的时间复杂度对整个数组进行排序。复杂性是什么?我们的方法是什么?当我试图解决它时,我的复杂性是 O(n),首先对剩余的数组进行排序并合并它。有什么算法可以用小于O(n)的方法来解决吗?

【问题讨论】:

【参考方案1】:

如果你的“数组”实际上是skip-list,则可以在O(log(n)sqrt(n))中完成

for each element x in reminder:
   remove x from skip list   (O(1))
   find first element smaller then x in sorted part   (O(logn))
   insert x to the found position    (O(1))

复杂度为sqrt(n)*log(n)

请注意,如果数据是一个实际的数组,您将需要将所有元素向右移动以进行一次更改(例如,如果提醒中的元素之一是最小的) - 这在O(n),所以对于一个数组,你不能比 O(n) 更好

【讨论】:

我一直很喜欢您的“算法”答案以及您思考的速度。你绝对是 Stack Overflow 算法方面的佼佼者。 我只想指出,为n 元素构建一个跳过列表具有预期的复杂性O(nlogn),而且从跳过列表中删除一个元素平均需要O(logn) @pkacprzak (1) 跳过列表的答案假定跳过列表已经存在,如果不存在 - 这是没用的,所以我同意这个评论。 (2) 否。从跳过列表中删除一个元素是 O(logn) 最坏情况,平均为 O(1)。对于每个节点,你有 1/2 的概率有一个“链接”,这给了我们E(nodes removed in del) = Sum(1/2^i | i =0,...,lgn) < 2。如果您指的是在删除之前应该首先“找到”元素这一事实,请注意这是迭代,因此您已经拥有指向该元素的指针。 @amit 你是对的,如果你使用指针从底部删除这些节点,那么平均删除是O(1)

以上是关于在 n 个元素的数组中,首先对 n-(root)n 个元素进行排序,我们要对数组进行排序的主要内容,如果未能解决你的问题,请参考以下文章

如何查找无序数组中的Top n

编写对具有n个元素的一维数组求和函数ArraySum()

用C语言实现一维数组中删除第N个元素的程序怎么写

Python / numpy:对数组的n个元素求和的最有效方法,以便每个输出元素是前n个输入元素的总和?

编写一个sort函数,对一维数组的前n个元素从小到大排序

在大小为 N 的数组的每 k 个元素中查找最小和第二小的元素