维护排序列表与插入所有值然后排序的复杂性

时间:2013-06-24 04:50:29

标签: algorithm

时间和空间的复杂性是按照排序的顺序维护一个数字列表(即从第一个插入它开始,第二个出现在你按照排序顺序插入它等等)与插入它们相同因为它们出现了,然后在所有插入后进行排序?

我该如何做出这个决定?你能说明'n'元素的时间和空间复杂性吗?

我正在考虑电话簿,将它存储在一组中并将每次将记录插入到电话簿VS中时将分类数据呈现给用户有什么不同之处在于VS按照树集中的排序顺序存储电话簿记录。 n个元素会是什么?

4 个答案:

答案 0 :(得分:3)

每次插入排序列表并保持其排序时,都会进行O(logn)比较,找到放置它的位置,但放置O(n)运动。因为我们插入n个元素,所以这是O(n ^ 2)。但是,我认为如果你使用一个专门用于插入排序数据的数据结构(例如二叉树),那么在末尾做一个传递把它变成一个列表/数组,它只是O(nlogn)。另一方面,使用这种更复杂的数据结构将使用大约O(n)个额外空间,而所有其他方法可以就地完成并且不使用额外空间。

每次插入未排序的列表时,它都是O(1)。最后对它进行排序是O(nlogn)。这意味着它总体上是O(nlogn)。

但是,如果你不打算制作许多元素(1000或更少)的列表,它可能无关紧要是什么大的O,你应该专注于小数据集的运行速度,或者不如果不是性能问题,请担心。

答案 1 :(得分:2)

这取决于您插入的数据结构。如果您要求插入数组,答案是否定的。它需要O(n)空间和时间来存储n个元素,然后O(n log n)对它们进行排序,因此O(n log n)总计。插入数组时可能需要移动\ Omega(n)元素,因此需要\ Theta(n ^ 2)。对于大多数“顺序”数据结构,同样的问题也是如此。遗憾。

另一方面,一些优先级队列(如懒惰的左侧堆,斐波纳契堆和Brodal队列)具有O(1)插入。同时,一个手指树给出了O(n log n)插入和线性访问(手指树与链表一样好,链表有利于什么,和平衡二叉搜索树一样好,二进制搜索树适合哪些 - 他们有点惊人。)

答案 2 :(得分:1)

算法选择会有特定于应用程序的权衡。在Insertion Sort维基百科页面上列举了可能使用插入排序而不是某种离线排序算法的原因。

此处的决定因素不太可能是渐近的复杂性,更可能是您对数据的了解(例如,它是否可能已经排序?)

我会走得更远,但我不相信这不是一个逐字逐句的问题。

答案 3 :(得分:-1)

选项1

按排序顺序插入正确的位置。

找到第i + 1个元素的位置所需的时间:O(logi)

插入和维护第i + 1个元素的顺序所需的时间:O(i)

空间复杂性:O(N)

总时间:(1*log 1 +2*log 2 + .. +(N-1)*logN-1) = O(NlogN)

明白这只是时间的复杂性。运行时间可能与此截然不同。

选项2:

插入元素O(1)

排序元素O(NlogN)

根据您使用的排序,空间复杂度会有所不同,但您可以使用类似快速排序的东西,无论如何都不需要太多空间。

总之虽然时间复杂度都是相同的,但是边界很弱并且在数学上你可以得到更好的界限。同时请注意,在实际情况下可能永远不会遇到最坏情况的复杂性,可能你只会看到所有的平均情况如果性能在你的应用程序中是一个至关重要的问题,你应该在随机抽样上测试两组代码。告诉我在你的测试后哪一个工作得更快。我猜是选项1.