当前位置: 首页 > news >正文

湘潭做网站 磐石网络大数据培训

湘潭做网站 磐石网络,大数据培训,实训报告网页设计,爱站工具网1、散列表数据结构 在Linux内核中,散列表(哈希表)使用非常广泛。本文将对其数据结构和核心函数进行分析。和散列表相关的数据结构有两个:hlist_head 和 hlist_node //hash桶的头结点 struct hlist_head {struct hlist_node *first…

1、散列表数据结构

  • 在Linux内核中,散列表(哈希表)使用非常广泛。本文将对其数据结构和核心函数进行分析。和散列表相关的数据结构有两个:hlist_headhlist_node

    //hash桶的头结点
    struct hlist_head {struct hlist_node *first;//指向每一个hash桶的第一个结点的指针
    };
    //hash桶的普通结点
    struct hlist_node {struct hlist_node *next;//指向下一个结点的指针struct hlist_node **pprev;//指向上一个结点的next指针的地址
    };
    
  • 对应的结构如下
    在这里插入图片描述

    • hash_table 为散列表(数组),其中的元素类型为 struct hlist_head 。以 hlist_head 为链表头的链表,其中的节点hash值是相同的(也叫冲突)。first指针指向链表中的节点①,然后节点①的 pprev 指针指向 hlist_head 中 的 first ,节点①的 next 指针指向节点②,以此类推。
    • hash_table 的列表头仅存放一个指针,也就是 first 指针,指向的是对应链表的头结点,没有tail指针,也就是指向链表尾节点的指针,这样的考虑是为了节省空间——尤其在 hash bucket (数组size)很大的情况下可以节省一半的指针空间。
    • pprev是一个二级指针, 它指向前一个节点的next指针的地址 。为什么我们需要这样一个指针呢?它的好处是什么?
      • 哈希表的目的是为了方便快速的查找,所以哈希表中hash桶的数量通常比较大,否则“冲突”的概率会非常大,这样也就失去了哈希表的意义。如何做到既能维护一张大表,又能不使用过多的内存呢?就只能从数据结构上下功夫了。所以对于哈希表的每个hash桶,它的结构体中只存放一个指针,解决了占用空间的问题。现在又出现了另一个问题:数据结构不一致。显然,如果hlist_node采用传统的nextprev指针,对于第一个节点和后面其他节点的处理会不一致。hlist_node巧妙地将pprev指向上一个节点的next指针的地址,由于hlist_headfirst域指向的结点类型和hlist_node指向的下一个结点的结点类型相同,这样就解决了通用性!
      • 下面讲解结点相关操作的时候会有更详细的解释。

2、散列表删除结点

  • 如果要删除hash桶对应链表中的第一个普通结点
    在这里插入图片描述对应的程序代码如下:

    static inline void __hlist_del(struct hlist_node *n) 
    { struct hlist_node *next = n->next;//获取指向第二个普通结点的指针 struct hlist_node **pprev = n->pprev;//保留待删除的第一个结点的pprev域(即头结点first域的地址),此时 pprev = &first *pprev = next; /*因为pprev = &first,所以*pprev = next,相当于 first = next即将hash桶的头结点指针指向原来的第二个结点,如上图中的黑线1*/if (next) //如果第二个结点不为空next->pprev = pprev;//将第二个结点的pprev域设置为头结点first域的地址,如上图中的黑线2 
    }
    
  • 如果要删除hash桶对应链表中的非第一个结点
    在这里插入图片描述对应的程序代码如下:

    static inline void __hlist_del(struct hlist_node *n) 
    { struct hlist_node *next = n->next;//获取指向待删除结点的下一个普通结点的指针 struct hlist_node **pprev = n->pprev;//获取待删除结点的pprev域 *pprev = next; //修改待删除结点的pprev域,逻辑上使待删除结点的前驱结点指向待删除结点的后继结点,如上图中的黑线1if (next) //如果待删除结点的下一个普通结点不为空next->pprev = pprev;//设置下一个结点的pprev域,如上图中的黑线2,保持hlist的结构 
    }
    

    可以看到删除第一个普通结点和删除非第一个普通结点的代码是一样的。

  • 下面再来看看如果hlist_node中包含两个分别指向前驱结点和后继结点的指针。
    在这里插入图片描述很明显删除hash桶对应链表中的非第一个普通结点,只需要如下两行代码:

    n->next->prev = n->prev;
    n->prev->next = n->next;
    

    可是,如果是删除的hash桶对应链表中的第一个普通结点:此时 n->prev->next = n->next 就会出问题,因为hash桶的表头结点没有next域,所以,明显在这种情况下删除hash桶对应链表的第一个普通结点和非第一个普通结点的代码是不一样的。 同理结点插入操作也存在同样的问题。

http://www.bjxfkj.com.cn/article/105454.html

相关文章:

  • 芒市网站建设公司网站制作app免费软件
  • idc新人如何做自己的网站百度关键词搜索指数查询
  • 中交路桥建设网站优质友情链接
  • 做网站用哪个服务器黑马培训机构
  • 王者荣耀做网站宁波正规seo推广
  • 电子商务网站建设教程 pdf2021十大网络舆情案例
  • wordpress 本地 慢西安seo优化排名
  • 怎么做营销型网站设计2023年5月疫情爆发
  • 彩票计划网站怎么做seo搜索引擎优化人员
  • 合肥论坛深圳网站关键词优化公司
  • php做网站登陆验证青岛seo服务哪家好
  • 网站设计模式有哪些静态网页设计与制作
  • 建设部网站网上大厅google应用商店
  • 做网站优化给业务员提成网站收录申请
  • 常熟网站建设哪家好网络销售靠谱吗
  • 嘉兴秀洲区建设局网站平台推广渠道
  • 贵阳市做网站公司seo查询网站
  • 从客户—管理者为某一公司做一份电子商务网站管理与维护的方案成都推广系统
  • 免费做网站的公司啦啦啦资源视频在线观看8
  • 甘肃网络公司网站建设google adwords
  • 广告推广策划方案seo综合查询工具
  • 秀屿莆田交友网站网络营销现状分析
  • 简易网站制作全球最牛的搜索引擎
  • 帮人管理网站做淘宝客怎么优化自己网站
  • 赛事网站开发sem与seo的区别
  • 阿里云服务器如何上传网站武汉seo首页优化报价
  • 该如何建设和优化一个网站站群优化公司
  • asp做的网站频繁报错 参数错误seo自动刷外链工具
  • 镇江网站建设优化案例分析东莞关键词排名提升
  • 网站建设试用独立站seo是什么