【发布时间】:2019-05-14 04:03:41
【问题描述】:
我正在寻找一种易于实现(在 C++ 中)的数据结构 D,它维护一个排序的整数序列(或任何可比较的对象),具有快速插入和快速搜索(即可以检查如果 X 在 D 中,或者获取第 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] >= 0。要“插入”,请执行arr[3192]++;。当然你会浪费内存,但我认为你不能更快(好吧,也许是 HashMap 而不是数组,但你明白了)。 -
如果很难编码,那么你需要更多的练习。
-
否则,根据您对问题的描述和简单性要求,二叉搜索树将是最容易实现的解决方案(平均为
O(log(n),最坏的情况为O(n)),如@ MattTimmermans 表示,如果您真的需要有保证的O(log n),订单统计树将是下一个更容易实现的东西。