高阶数据结构之哈希表

一. 搜索

分情况:

  • 如果数据集不变(或者变化很少)这种情况少之又少
    最常见的算法 —— 二分查找(条件:数据中的值是有序的)
    查找的时间复杂度: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 对应相同下标的情况叫做 —— 哈希冲突
    • 哈希冲突是必然的,无法消除
    • 但是哈希冲突太高是不好的
    1. 如何尽可能地避免哈希冲突;
    2. 如果
发布了98 篇原创文章 · 获赞 5 · 访问量 6450

猜你喜欢

转载自blog.csdn.net/weixin_43580746/article/details/105142194