固定大小数组/列表的在线排序算法

时间:2011-07-15 16:07:23

标签: algorithm sorting data-structures

维护和排序固定大小的数组(或链表?)的最佳方法是什么?为了清楚地说明情况,假设100个数据样本存储在一个缓冲区中(假设它们是为了简单而排序),那么当下一个样本进入时,最旧的一个出去,新的样本必须放入缓冲区中。位置使其排序。

存储这些样本,数组或链表的最佳方法是什么?以及如何为最新的样本块排序列表?

[最初缓冲区可以初始化为0]

4 个答案:

答案 0 :(得分:5)

数组和链表都很难保存每次更新后必须保持排序的数据。要么必须在更新后求助列表(O(nlogn)),要么将新元素插入/移除/移动到排序列表中的适当位置(O(n))。

更好的想法是使用本质排序的数据结构,并在O(log(n))中的每次更新后维护该属性。 binary search treesskip lists都有该属性。许多语言都有一个容器,它被实现为一个快速排序的数据结构(例如C ++中的set和Java中的TreeSet

答案 1 :(得分:3)

这是家庭作业吗?

无论哪种方式,听起来你正在寻找的答案是堆支持的优先级队列。正如MAK所指出的,数组和链表都有线性时间插入。链接列表似乎更好,因为它们会有恒定时间提取,但提取和插入过程无论如何都需要渐近线性时间。堆(和其他树结构)允许对数提取和插入。

答案 2 :(得分:1)

基本上,这里有两种排序 - 一种是按值排序,一种是按时间排序。您可以考虑使用值排序的平衡BST,并为基于时间的排序维护一个简单的指针/引用队列(取决于语言)(假设您在添加时删除了“最旧”值,不是一些外部时间戳。)

插入物:   添加到BST   添加到队列   if queue.size()> MAX_SIZE:     node_to_remove = queue.dequeue()     BST.remove_node(node_to_remove)

添加到BST = O(lg n),添加到队列= O(1),从BST = O(lg n)中删除 - 所以你的插入仍然是O(lg n),这基本上是你能做到的最好无论如何,为排序的插入做。

答案 3 :(得分:0)

堆树可能会很好。您可以使用Merge sort中的Merge子例程进行一些修改。