【发布时间】:2013-08-04 18:50:00
【问题描述】:
希望保持一组数字排序(升序或降序,但下面的示例仅显示升序)。最大速度的数据结构表示是个问题。
假设一个聚合程序不断地从许多不同的监控代理(例如通过网络)获取数字包。我们的想法是让它们始终快速分类。例如,您可能会按顺序获取这些数据包(使用整数,但实际情况是双精度):
A = [1, 3, 4, 6]
B = [1, 2, 3]
C = [2, 3, 5]
A = [2, 4, 7, 8]
等等。在第一个数据包之后,聚合器中的数据结构将已经排序(数据结构会记住排序中每个数字所指的来源):
[1, 3, 4, 6] => 事件
在下一个数据包之后,由于是新的来源,数据结构会是这样的
[1, 1, 2, 3, 3, 4, 6] => 事件
在下一个数据包之后,
[1, 1, 2, 2, 3, 3, 3, 4, 5, 6] => 事件
现在由于 A 发送了新数据包,我们必须找到 A 的旧值,并用新值替换它们,最后以新排序结束。替换和排序可以单独发生也可以不发生(就地),目标是极速:
[1, 2, 2, 2, 3, 3, 4, 5, 7, 8] => 事件
请注意,当您获得第二个 A 时,所有旧 As 都必须被新 As 数据包“替换”,同时保持排序。在每个数据包被排序到数据结构中后,它被复制并需要作为“事件”发送。这些数据包每隔几微秒就会在合并排序算法中疯狂而连续地到来。
* 最好的数据结构是什么?也许是 Splay 树或 AVL 树? *
【问题讨论】:
-
如果您投反对票,请至少发表评论,以便 OP 改进问题。
-
最快的算法是quantum bogosort。
-
每个数据包中的数字会一直排序吗?又名:您的示例 A、B、C 和 A 均按从低到高排序。 (如果是这样,你可以在你的排序中利用它)。
-
@CollinJSimpson
double满足key模板参数的所有要求,默认比较std::lessAFAIK。 -
为什么最后需要排序?例如,什么是观察数据结构,我们可以利用哪些属性以及如何利用?有几个排序数组并给观察者一个花哨的迭代器有什么问题?
标签: performance algorithm sorting c++11 real-time-updates