维护和排序固定大小的数组(或链表?)的最佳方法是什么?为了清楚地说明情况,假设100个数据样本存储在一个缓冲区中(假设它们是为了简单而排序),那么当下一个样本进入时,最旧的一个出去,新的样本必须放入缓冲区中。位置使其排序。
存储这些样本,数组或链表的最佳方法是什么?以及如何为最新的样本块排序列表?
[最初缓冲区可以初始化为0]
答案 0 :(得分:5)
数组和链表都很难保存每次更新后必须保持排序的数据。要么必须在更新后求助列表(O(nlogn)),要么将新元素插入/移除/移动到排序列表中的适当位置(O(n))。
更好的想法是使用本质排序的数据结构,并在O(log(n))中的每次更新后维护该属性。 binary search trees和skip 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子例程进行一些修改。