【问题标题】:What is the easiest DS to a Sorted Sequence with fast inserts and fast searching?具有快速插入和快速搜索的排序序列最简单的 DS 是什么?
【发布时间】:2019-05-14 04:03:41
【问题描述】:

我正在寻找一种易于实现(在 C++ 中)的数据结构 D,它维护一个排序的整数序列(或任何可比较的对象),具有快速插入和快速搜索(即可以检查如果 XD 中,或者获取第 i 个元素)。 Fast 应该是 O(log(n))、O(1) 还是 O(sqrt(N))?

template<type T>
Class D {
  D(...) { ... }
  void insert(T x);
  int get_ith(int x);
  boolean check_x(T x);
}

目前,我了解 AVL 树、红黑树、跳过列表、尝试、散列。所有这些都需要非常复杂且难以编码的解决方案。尝试可能是最不复杂的。但是,删除元素和为 trie 选择字母表等操作很困难。

我希望探索新颖的解决方案,希望能够简短而快速。

提前谢谢你!

【问题讨论】:

  • 我认为满足要求的最简单的东西是基于treap (en.wikipedia.org/wiki/Treap) 的订单统计树(en.wikipedia.org/wiki/Order_statistic_tree),但听起来即使这样也会做太多工作。您可以在线找到订单统计树的实现。
  • 考虑到很多逻辑,从头开始编码仍然非常困难。 trie 更直观,是我目前拥有的最好的,但它也有其自身的挑战。
  • 你有整数的上限吗?你关心内存优化吗?因为听起来您可以简单地使用一个包含 1000000 个元素的数组,并将每个元素设置为 1 以指示整数存在。要确定整数3192 是否存在,只需检查arr[3192] &gt;= 0。要“插入”,请执行 arr[3192]++;。当然你会浪费内存,但我认为你不能更快(好吧,也许是 HashMap 而不是数组,但你明白了)。
  • 如果很难编码,那么你需要更多的练习。
  • 否则,根据您对问题的描述和简单性要求,二叉搜索树将是最容易实现的解决方案(平均为O(log(n),最坏的情况为O(n)),如@ MattTimmermans 表示,如果您真的需要有保证的O(log n),订单统计树将是下一个更容易实现的东西。

标签: algorithm data-structures


【解决方案1】:

如果您知道整数值的上限,则可以简单地占用一大块内存并使用集合中数字的位。

  • 如果 X 在 D 中:O(1)
  • 插入:O(1)
  • 删除:O(1)

如果整数在从最小值到最大值的范围内是稀疏的,则迭代很慢。在这种情况下,内存消耗也可能是不可接受的。

【讨论】:

    猜你喜欢
    • 2011-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-10
    • 2023-04-06
    相关资源
    最近更新 更多