• 链表-哈希表 详解


    链表

    链表是由一系列节点组成的元素集合。每个节点包含两部分,数据域item指向一下个节点的指针next
    通过节点之间相互连接,最终串联成一个链表。

    链式存储结构就是 两个相邻的元素在内存中可能不是相邻的,每一个元素都有一个指针域,指针域一般是存储着到下一个元素的指针。

    优缺点

    优点:

    1. 插入和删除的时间复杂度为O(1);
    2. 动态地进行存储分配,可以适应数据动态地增减的情况,节约内存

    缺点:

    1. 查找效率低,需要从头依次查找链表的每一项。 [访问的时间复杂度最坏为O(n),关于查找的算法很少一般只能遍历]
    2. 频繁的申请和释放内存也会消耗时间。
    3. 插入和删除中间位置时要重头找到对应的数据

    链表分类

    【单向链表】

    链表中最简单的一种是单向链表,每个元素包含两个域,值域和指针域,我们把这样的元素称之为节点。每个节点的指针域内有一个指针,指向下一个节点,而最后一个节点则指向一个空值。
    在这里插入图片描述)

    【双向链表】

    双向链表的指针域有两个指针,每个数据结点分别指向直接后继和直接前驱。
    在这里插入图片描述

    循环链表

    循环链表就是让链表的最后一个节点指向第一个节点,这样就形成了一个圆环,可以循环遍历。(单向循环链表,双向循环链表

    在这里插入图片描述

    哈希表

    能够具备 数组的快速查询 的优点又能融合 链表方便快捷的增加删除元素 的优势。

    所谓的hash,简单的说就是散列,即将输入的数据通过hash函数得到一个key值,输入的数据存储到数组中下标为key值的数组单元中去,这个映射函数叫做散列函数,存放记录的数组叫做散列表

    · insert(key, value):插入键值对(key,value)
    · get(key): 如果存在键为key的键值对则返回其value, 否则返回空值
    · delete(key): 删除键为key的键值对

    优缺点

    优点: 插入/查询/删除效率非常高

    缺点:

    1. 空间利用率不高,底层使用的是数组,并且使用的某些单元是没有被利用的;
    2. 哈希表中的元素是无序的,不能按照固定的顺序来遍历哈希表中的元素;
    3. 不能快速的找出哈希表中的最大值或者最小值;

    HASH冲突

    不相同的数据通过hash函数得到相同的key值。这时就产生了hash冲突。解决hash冲突的方式有两种:

    1.开放寻址法

    开放寻址法也称再散列法,其基本思想是:当关键字key的哈希地址p=H(key)出现冲突时,以p为基础,产生另一个哈希地址p1,如果p1仍然冲突,再以p为基础,产生另一个哈希地址p2,…,直到找出一个不冲突的哈希地址pi ,将相应元素存入其中。
    就是说当发生冲突时,就去寻找下一个空的地址把数据存入其中,只要哈希表足够大,就总能找到这样一个空的地址。

    线性探查:如果位置i被占用,则探查i+1, i+2,……
    二次探查:如果位置i被占用,则探查i+12,i-12,i+22,i-22,……
    二度哈希:有n个哈希函数,当使用第1个哈希函数h1发生冲突时,则尝试使用h2,h3,……

    2.拉链法

    拉链法:哈希表每个位置都连接一个链表,当冲突发生时,冲突的元素将被加到该位置链表的最后。
    在这里插入图片描述

    3.再哈希法

    在发生冲突的时候再用另外一个哈希函数算出哈希值,直到算出的哈希值不同为止。

    4.建立公共溢出区

    在创建哈希表的同时,再额外创建一个公共溢出区,专门用来存放发生哈希冲突的元素。查找时,先从哈希表查,查不到再去公共溢出区查。

  • 相关阅读:
    百趣代谢组学资讯:慢性肾病的延缓方法有了!
    208. 开关问题 - 异或方程组
    OpenSSL自签名证书
    【152.乘积最大子数组】
    Mybatis-Plus配置性能分析插件
    RabbitMQ有什么优缺点
    【【萌新的SOC学习之自定义IP核 AXI4接口】】
    docker&kubernets篇(二十二)
    一例MFC文件夹病毒的分析
    天软特色因子看板(2023.10 第04期)
  • 原文地址:https://blog.csdn.net/qq_43205267/article/details/127789254