我应该使用哪个容器来快速找到一个元素,知道它已经通过构造订购了?

Which container should I use to quickly find an element, knowing that by construction it's already ordered?

本文关键字:元素 一个 我应该      更新时间:2023-10-16

我必须使用一个已经通过构造订购的容器,我需要一个快速查找功能。

我的想法是使用集合来利用它的set.find,这应该足够快,但是用set.insert构造我的集合可能会很慢,因为我已经知道元素是有序的!

对于这部分,我可以只使用带有 vector.push_back 的向量,但是我应该自己编写 find 函数,它也比set::find慢......你对我有什么建议?

编辑:

  • 容器需要修改,但将始终被订购,并且其大小将始终相同(但我不知道先验)
  • 没有重复的值。
  • 发现比插入多得多。
  • 我只需要知道它是否存在,而不是它的位置。
  • 我找到了标准::binary_search。好不好?

如果输入范围已经排序,则从一对迭代器构造set可以保证为 O(N),因此您可以使用它。(参见例如 http://en.cppreference.com/w/cpp/container/set/set。

后续插入为 O(log N)。

尽管如果总大小不是那么大,排序vector往往会击败其他所有内容,因为它对缓存非常友好。 std::binary_search是 O(log N),与 set::find 相同。

std::unordered_set不在乎你的排序,但会给你O(1)查找(平均而言,没有保证)。

std::vector std::make_heap()push_heap()pop_heap()sort_heap()可以帮助您尽快处理它std::set。但是,您需要手动使用 std::binary_search。