在 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 个元素进行排序,我们要对数组进行排序的主要内容,如果未能解决你的问题,请参考以下文章