我一般更喜欢AVL树而不是哈希表。 我知道哈希表的预期时间复杂度为O(1),优于AVL树的保证时间复杂度O(log n),但实际上,常数因素使得这两种数据结构通常具有竞争力,并且没有什么关于某些意外数据会引起糟糕行为的困扰。 此外,在程序的维护生命周期中,我经常发现在初始选择哈希表时看起来合适的情况下,需要按排序顺序使用数据,因此我最终会重写程序以使用AVL树而不是哈希表。 不断这样做,你会发现最好直接从AVL树开始。如果您的键是字符串,则三进制搜索尝试是AVL树或哈希表的一个合理替代品。
显然,AVL树(以及其他平衡树)与哈希表的一个明显区别是:你可以拥有持久性:你可以在O(log N)的时间和空间内向树中插入/删除元素,并最终得到不仅是新树,还能保留旧树。 使用哈希表,通常无法在少于O(N)的时间和空间内完成此操作。 另一个重要的区别是键所需的操作:AVL树需要键之间的<=比较,而哈希表需要=比较以及哈希函数。