是否有任何可用的数据结构可以提供O(1) – 即恒定插入复杂度和O(log(n))搜索复杂度,即使在最坏的情况下?
排序后的矢量可以进行O(log(n))搜索,但插入将采用O(n)(事实上我并不总是在前面或后面插入元素).虽然列表会进行O(1)插入但不能提供O(log(n))查找.
我想知道这样的数据结构是否可以实现.
最佳答案 是的,但你必须以两种方式改变规则:
1)您可以使用具有O(1)插入和O(1)搜索的结构(例如CritBit树,也称为bitwise trie)并添加人工成本以将搜索转换为O(log n).
关键字树就像二进制radix tree一样.它通过沿着键的位(例如32位)行走来存储键,并使用该位来决定是在每个节点处向左(‘0’)还是向右(‘1’)导航.搜索和插入的最大复杂度都是O(32),它变为O(1).
2)我不确定这是严格的理论意义上的O(1),因为只有当我们限制值范围(比如32位或64位)时O(1)才有效,但是出于实际目的,这似乎是一个合理的限制.
注意,在插入可能的密钥排列的重要部分之前,感知的性能将是O(log n).例如,对于16位密钥,您可能必须插入2 ^ 16 = 65563个密钥的重要部分.