一. 搜索
分情况:
-
如果数据集不变(或者变化很少)这种情况少之又少
最常见的算法 —— 二分查找(条件:数据中的值是有序的)
查找的时间复杂度:0(log(n));插入的时间复杂度:0(n);删除的时间复杂度:0(n) -
不但要追求查找效率,也要追求 插入/删除。比较常见
- 哈希表:
- 平衡搜索树:AVL树、红黑树(以上两个用户内存的平衡搜索树),B- 树家族(磁盘专用平衡搜索树)
二. 哈希原理
思考:在 500w 个数中去查找某个值不好查找?
解决思路:(1)可以开辟某个指定长度(假如是 10)的数组,将 500w 个数均匀的放在这个数组中,每个下标对应 50w 个数;(2)确定这个数在哪个小集合(时间复杂度0(1));(3)利用数组下标访问0(1)的特性找到小鸡和;(4)在大概 50w 个数中查找某个数。
所以 hash 的问题就是围绕转化后问题的“2,3,4”不来看 —— 无论是查找、删除、插入。
- 拿着 key 确定应该是哪个小集合的问题:
- 利用 key 求出 key 对应的 hash 值;
- 利用求出的 hash 值得到数组中合法的下标;
- 根据下标,找到小集合
问:一个 key 可以对应的唯一个下标么? —— 小集合中可以只有 key 一个数据吗?
回答:不可以。假设:数据的个数 N,数组的长度是 L,而为了提升空间利用率,N 往往是大于 L的,则必要有下标会出现多个 key。 - 不同的 key 对应相同下标的情况叫做 —— 哈希冲突
- 哈希冲突是必然的,无法消除
- 但是哈希冲突太高是不好的
- 如何尽可能地避免哈希冲突;
- 如果