二叉树(binary tree)和哈希表(hash table)都是很基本的数据结构,可是咱们要怎么从二者之间进行选择呢?他们的不一样是什么?优缺点分别是什么?数据结构
回答这个问题不是一两句话能够说清楚的,缘由是在不一样的状况下,选择的依据确定也不一样。首先来回顾一下这两个数据结构:wordpress
哈希表使用hash function来对输入的数据分配index到哈希表对应的槽中。假设有一个哈希表的size是100,而咱们输入的数据是从0~99,咱们要把输入数据储存到哈希表中。理论上来讲,该哈希表插入和查找操做的时间复杂度都是O(1)。排序
二叉树遵循右子树大于根节点,左子树小于根节点的原则进行数据的插入和保存。若是这个树的平衡的,那么,对于每一个元素的插入和查找操做的时间复杂度是O(log(n)),n是树的节点个数,log(n)一般是树的深度。固然,对于不平衡的状况,那就须要更复杂的数据结构的树(红黑树等)进行处理。get
上文彷佛得出结论哈希表要好于二叉树,可是it is not always the case。哈希表有如下几个突出的缺点:hash
当更多的数插入时,哈希表冲突的可能性就更大。对于冲突,哈希表一般有两种解决方案:第一种是线性探索,至关于在冲突的槽后创建一个单链表,这种状况下,插入和查找以及删除操做消耗的时间会达到O(n),且该哈希表须要更多的空间进行储存。第二种方法是开放寻址,他不须要更多的空间,可是在最坏的状况下(例如全部输入数据都被map到了一个index上)的时间复杂度也会达到O(n)。it
因此,在决定创建哈希表以前,最好能够估计输入的数据的size。不然,resize哈希表的过程将会是一个很是消耗时间的过程。例如,若是如今你的哈希表的长度是100,可是如今有第101个数要插入。这时,不只哈希表的长度可能要扩展到150,且扩展以后全部的数都须要从新rehash。io
哈希表中的元素是没有被排序的。然而,有些状况下,咱们但愿储存的数据是有序的。table
另外一方面,咱们讨论二叉树:function
二叉树不会有冲突(collision),这意味着咱们可以保证二叉树的插入和查找操做一直都是O(log(n))的时间复杂度。扩展
二叉树的空间占用跟输入的输入数据一致。因此咱们不须要为二叉树预先分配固定的空间。因此,你也不须要预先知道输入数据的size。
全部的元素在树中是排序好的。
若是你预先知道输入数据的大小,并且有足够的空间储存哈希表,且不须要对数据进行排序,那么哈希表老是好的。由于哈希表在插入,查找和删除操做中只须要常数时间。
另外一方面,若是数据是持续的加入,你预先不知道数据的大小,那么二叉树是一个折中的选择。
Reference:
Hash table vs Binary search tree