到达指定间隔的整数流需要排序

Stream of Integers arriving at specified interval need to look sorted

本文关键字:整数 排序      更新时间:2023-10-16

面试问题:有一个整数流,每隔一段时间(比如每20秒)到达。您将使用哪个STL容器来存储它们,以便整数看起来有序?我的回答是map/set,当没有重复或multimap/multiset时,有重复。有更好的答案吗?

如果您想要保存副本,请使用multiset。如果您不想保留重复项,请使用set

如果它只是每20秒更新一次,那么它可能无关紧要(除非它持续很长时间,以至于整数集变得非常大)。

如果你有更快的数据传入,有一些替代方案可能值得考虑。一种是用一些向量。当数据到达时,把它推到其中一个向量上。当需要按顺序遍历时,对新到达的数据进行排序,并与现有(已经排序的数据)的其他向量合并。这将按顺序给出结果,然后你可以将结果写入另一个向量,并再次开始相同的循环。

这里的最大优点是您处理的是连续数据,而不是单独分配的节点。即使有可能一次使用三个向量,您的总内存使用量也可能与使用setmultiset大致相等(甚至可能小于)。

另一种可以考虑的可能性(介于两者之间)是类似B+树的东西。这仍然是一棵树,因此您可以按对数复杂度进行顺序插入,但是您将所有数据都放在叶节点中(这些节点相当大),因此您至少可以获得合理数量的连续访问。

要维护排序的整数流列表,我将使用std::priority_queue与任何底层容器(vector或deque取决于特定用途)。

您可以将push() ing保留到priority_queue中,并使用top()pop()按排序顺序检索

答案应为std::setstd::map<key, value>必须考虑当有<key, value>对数据时,需要根据key

的值进行排序

同样,如果您必须考虑重复,请根据数据类型使用std::multisetstd::multimap