我有一个缓冲区接收数据,这意味着数据就像'流',并在'IO'有延迟。我现在的做法是当缓冲区已满时,使用qsort对缓冲区进行排序并将结果写入磁盘。但是在执行qsort时存在明显的延迟,所以我正在寻找其他一些排序算法,这些排序算法可能会在数据添加到缓冲区时开始排序,以减少总体消耗的时间。什么排序算法适合这种“流式”条件?
不知道有没有说清楚,如果需要留下任何意见,感谢
我有一个缓冲区接收数据,这意味着数据就像'流',并在'IO'有延迟。我现在的做法是当缓冲区已满时,使用qsort对缓冲区进行排序并将结果写入磁盘。但是在执行qsort时存在明显的延迟,所以我正在寻找其他一些排序算法,这些排序算法可能会在数据添加到缓冲区时开始排序,以减少总体消耗的时间。什么排序算法适合这种“流式”条件?
不知道有没有说清楚,如果需要留下任何意见,感谢
堆排序可将数据永久保存在部分排序条件中,因此可与插入排序相比较。但是它比O(n )的插入排序快得多并且具有O(n log n)的最坏情况。
这是怎么回事?据推测,在某些时候,你必须停止阅读流,存储你已经排序,并开始阅读一组新的数据?
+1堆排序,你不需要它被完全排序,以便在写入之间进行缓冲 – 2012-03-09 15:06:39
是的,在我的情况下,我必须停止从流中读取并对缓冲区进行排序并将结果写入磁盘,然后再次开始读取并且重复,直到流结束 – 2012-03-09 23:48:04
然后堆排序是你想要的。从流中读取数据到堆中,直到必须停止为止,然后从堆中读取并写入磁盘,直到它为空。从堆中读取的数据按排序顺序排列。 – Borodin 2012-03-10 09:52:59
我认为合并排序或树排序可以有很大的帮助。看看why on wikipedia。
你想要实现一个在线排序算法,即在流线型接收数据时运行的算法。通过网络搜索online algorithms,您可能会发现其他不错的算法。
在你的情况下,我会使用树排序。它没有比快速排序更好的复杂性(大多数情况下都是O(nlog n)
,在很少的情况下都是O(n²)
)。但它会摊销每个输入的成本。这意味着添加最后一个数据后,您必须等待的延迟时间不是订单O(nlog n)
,而是O(log n)
您可以尝试使用我的Link Array结构。顺序添加随机数据并保持排序应该是可以的(查看表中的数字)。这是Skip list方式的变化,但有更简单的实现和逻辑(尽管跳跃列表的表现应该会更好)
插入排序。真的;-)然而,“O(n lg n)”排序可以很快地对大量数据进行排序......并且如果它“大多数排序”则不一定更快(在这种情况下,快速排序实际上可能非常堕落!)。 ..所以建立一个快速的性能分析可能是值得的。 – 2012-03-09 13:39:14