| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> Linux内核数据结构之哈希表 -> 正文阅读 |
|
[数据结构与算法]Linux内核数据结构之哈希表 |
一、内核中的哈希表哈希表在内核位置/include/linux/types.h
今天,我们带着问题去理解Linux内核中的哈希表结构。 1.那么为什么哈希表中头节点hlist_head与其他节点hlist_node不同,而没有采用相同的结构体呢?因为哈希表中一般采用单散列的形式,并不需要双链表的双向循环功能,所以Linux内核为了减少开销,并没有用hlist_node来指定哈希表头结点,而是采用了hlist_head结构,以减少存储空间的占用。头结点的数量与数据的总量在同一个数量级。 2.为什么在hlist_node中prev采用了二级指针,而没有采用单链表,或双向链表的形式呢?(1)若使用单链表结构,在插入节点的时候可以采用在哈希表的头结点之后插入节点,此时时间复杂度为O(1)。但在删除节点的时候必须要遍历链表来寻找待删除节点的前一个节点,此时效率较低。 ?为了间接改变表头中hlist_node类型first指针的值,使用了二级指针,因此在node节点中pprev中保存的为前一个结点中第一个元素的地址,头结点中即为first指针,其余节点则为next。 删除一个节点? 删除第一个节点的操作方式如下:
删除其余节点的操作方式如下(以node2节点为例):
插入第一个节点:
插入其余节点(以node2为例): 头插法
尾插法
这样一来所有节点的删除和插入操作方式都是完全一样的。 哈希表中的宏定义
内核中的哈希表结构? |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 23:47:09- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |