当前位置: 首页 > 编程日记 > 正文

第六章:内核数据结构

6.1链表
链表表示一种存放和操作的可变数据元素的数据结构。
链表与静态数组不同的是它包含的元素是动态创建并且插入链表的,在编译时不必知道具体需要多少个元素。
另外链表中每个元素的创建时间各不相同,所以它们在内存中无需占用连续的空间。
链表中每个元素都包含指向下一元素的指针,当有新元素加入链表时,可以简单的调整指向下一节点的指针就可以了。
6.1.2环形链表
通常链表中最后一个元素不在指向下一个元素,所以链表结尾元素的下一指针为NULL,以此表示它是链表的最后一个元素。
但是有些链表中,末尾元素并不指向特殊值,相反,它指回链表的首元素,这种收尾相连的链表叫环形链表。
因为环形链表提供了最大的灵活性,所以Linux内核的标准链表是环形链表。
6.2队列
任何操作系统内核中都少不了一种编程模型:生产者和消费者。该模型可以使用队列来时实现。
消费者获得数据的顺序与生产者推入队列的顺序一致。
队列时FIFO,先进先出。
Linux内核通用队列实现称为Kfifo。Kfifo对象维护了两个偏移量:入口偏移和出口偏移。入口偏移时指向下一次入队的位置。出口偏移是指向下一次出队的位置。
6.3映射
一个映射,也常称为关联数组,其实是一个由唯一键组成的集合,而每个键必然关联一个特定的值,映射至少包含三个操作:add、remove、Look。
虽然散列表时一种映射,但并非所有的映射都需要通过散列表实现。除了散列表外,映射也可以通过自平衡二叉搜索树存储数据。
通过散列表实现的映射可以提供更好的平均的渐进复杂度。
二叉搜索树可以在最坏的情况下有更好的表现。
二叉搜索树满足顺序保障,这将给用户的按序遍历带来很好的性能。
二叉搜索树最后一个优势是它不需要散列函数,需要的键类型只要可以定义<=操作算子便可以。
6.4二叉树
树是一种能提供分层的树型结构的特定数据结构。
一个二叉树是每个节点最多只有两个出边的树。
一个二叉搜索树是一个节点有序的二叉树,其顺序通常遵守以下规则:
根的左分支节点值都小于根节点值
右分支节点值都大于根节点值
所有的子树也都是二叉搜索树。
根据以上规则,在树种搜索一个指定值或者按顺序遍历树相当快。
一个平衡二叉搜索树是一个所有节点深度差不超过1的二叉搜索树。
一个自平衡二叉搜索树是指其操作都试图维持平衡的二叉搜索树。
红黑树是一种自平衡二叉搜索树,Linux主要的平衡二叉树数据结构就是红黑树。
红黑树具有以下规则:
所有节点要么是黑色,或者是红色
叶子节点都是黑色
叶子节点不包含数据
所有非叶子节点都有两个子节点
如果一个节点时红色,则它的子节点一定是黑色
在一个节点到子节点的路径中,如果总是包含相同数目的黑色节点,则其路径相比其他路径是最短的。
根据以上条件,可以保证最深的叶子节点深度不会大于两倍的最浅叶子节点的深度,所以红黑树是半平衡的。
6.5数据结构以及选择
当你对数据结构的操作主要是遍历,就使用链表,没有数据结构可以可以提供比线性算法复杂度更好的算法遍历元素。
如果你的代码符合生产者-消费者模型,则使用队列。
如果你需要存储大量数据,并且检索迅速,则使用红黑树最好。
6.6时间复杂度
1 衡量
logN 对数
n 线性
n的2次方 平方
n的3次方 立方
2的N次方 指数
n! 阶乘

转载于:https://www.cnblogs.com/use-D/p/10575807.html

相关文章:

【C++】【七】栈的实现

栈的线性表实现 stack_liner_stack.h #ifndef STACK_LINER_H #define STACK_LINER_H #include <stdlib.h> #define MAX_SIZE 1024 #define stack_liner_false 0 #define stack_liner_true 1typedef struct STACK_LINER_H {void* data[MAX_SIZE];int size; }stack_liner…

推荐两款简单好用的图片放大jquery插件

一、zoomfiy.js 推荐可以从这里下载 使用说明&#xff1a; 使用该jquery 插件引入该插件的js:zoomfiy.js 或 min引入该插件的css:zoomfiy.css 或 min前后顺序都可js里加入 调用插件的函数 $(这里写要放大的图片).zoomify();如果有ajax 新生成的图片&#xff0c;要在ajax里再次调…

对图像的缩放与旋转

#include "opencv2/imgproc/imgproc.hpp" #include "opencv2/highgui/highgui.hpp" int main( ) {// 读取图像cv::Mat srcImage cv::imread("..\\images\\flower3.jpg");// 图像读取是否成功if( !srcImage.data ) return 1; // 对图像的缩放与旋…

工具库 --- Validator (JS正则)

工具库 --- Validator 今天写的是一个正则验证类 单例模式 工具库地址&#xff1a;github.com/WeForStudy/… npm地址&#xff1a;www.npmjs.com/package/slm… 单例模式 减少不必要的对象生存&#xff0c;减少资源的占用 由于只需要new一次&#xff0c;项目中其他项目共用一个…

【C++】【九】栈的应用

【C】【九】栈的应用 就近匹配原理及其步骤&#xff1a; 中缀转后缀&#xff1a;

linux中错误日志等级

info&#xff1a;仅是一些基本的讯息说明而已&#xff1b;notice&#xff1a;比 info 还需要被注意到的一些信息内容&#xff1b;warning 或 warn&#xff1a;警示讯息&#xff0c;可能有问题&#xff0c;但是还不至于影响到某个 daemon 作。err 或 error &#xff1a;一些重大…

Mat类简略结构

class CV_EXPORTS Mat { public&#xff1a;int flags; // 标志位 int dims ; // 数组的维数int rows,cols; uchar *data ; // 指向数据的指针int * refcount ; // 指针的引用计数器 阵列指向用户分配的数据时&#xff0c;当指针为 NULL };

数据结构之快速排序

首先快速排序&#xff1a;就是选择一个基数&#xff0c;然后从两端依次进行比较&#xff0c;若右边大于基数&#xff0c;则不进行交换&#xff0c;直到右边的数据小于基数&#xff0c;然后冲左边开始和基数比较&#xff0c;若左边的小于基数&#xff0c;则进行下一个比较&#…

【C++】【十】二叉树

树的基本概念&#xff1a; 树具有递归性&#xff0c;非线性 完全二叉树 &#xff1a;所有节点都在 举例&#xff1a; 递归遍历二叉树&#xff1a; #include <stdlib.h> #include <stdio.h> #include <iostream> #include<string.h>typedef struct B…

记一次网络共享打印机故障

刚开始去到办公室发现电脑之间的环境是XP跟WIN10查看共享主机发现没有监听139和445端口 然后在网卡属性把Microsoft网络客户端和Microsoft网络的文件和打印机共享删除重启 重新安装这两个客户端 发现虽然共享主机有监听端口 但是其他主机还是不能访问 最后检查发现主机之间的工…

Mat 类常用函数用法示例

#include "opencv2/imgproc/imgproc.hpp" #include "opencv2/highgui/highgui.hpp" #include <iostream> int main( ) {cv::Mat Image1( 10, 8, CV_8UC1, cv::Scalar(5) );// 矩阵行列数获取std::cout << "Image1 row: " << I…

记录智能指针使用shared_ptr使用错误

shared_ptr为智能指针&#xff0c;今天一次在使用shared_ptr时&#xff0c;错误的将其初始化方式写为shared_ptr<T> test shared_ptr<T>(),随后导致崩溃 正确做法是shared_ptr<T> test make_shared<T>() 或shared_ptr<T> test shared_ptr<…

【C++】【十一】二叉树递归遍历与非递归遍历的实现及思路

非递归遍历实现思路&#xff1a; #include <stdlib.h> #include <stdio.h> #include <iostream> #include <string.h>typedef struct LINKNODE {struct LINKNODE* next; }linknode;typedef struct LINKLIST {linknode head;int size; }stack_list;#…

定时调度模块:sched

定时调度模块:sched """A generally useful event scheduler class. 事件调度器类Each instance of this class manages its own queue. 类的每一个实例独立管理自己的队列 No multi-threading is implied; you are supposed to hack that yourself, or use a s…

Mat转换为IplImage 类型和CvMat 类型

cv::Mat img; CvMat cvMatImg img; IplImage IplImg img;转载&#xff1a;http://blog.csdn.net/zhuwei1988

大数据学习思路

学习大数据已经有一段时间了&#xff0c;抽空回顾一下自己学习的一些内容。下图主要为自己学习大数据的一个过程。 阶段一&#xff1a;Java基础 掌握JAVA基本语法、面向对象、集合、IO流、多线程、网络编程 阶段二&#xff1a;MySQL CRUD 阶段三&#xf…

【C++】【十二】排序实现及思路

掌握核心知识点&#xff1a; 1.插入排序在一下2种情况效率较高&#xff1a;1&#xff09;数据基本有序 2&#xff09;数据序列较少 希尔排序是在插入排序的基础上的改进。 2.快速排序 3.归并排序 4.堆排序&#xff1a;数据初始化为数据&#xff0c;根据完全二叉树&#…

Centos 不小心删除了openssl,导致无法使用sshd、yum、wget、curl 等软件的问题。。...

2019独角兽企业重金招聘Python工程师标准>>> 1、如果安装了FTP&#xff0c;可以使用FTP上传rpm到服务器进行安装&#xff1b; 2、挂载光驱cdrom到mnt文件夹下&#xff0c;进入package文件夹rpm进行安装&#xff1b; 3、有源码包进行源码安装&#xff1b; 4、自求多福…

IplImage 类型和 CvMat 类型转换为 Mat 类型

IplImage *IplImg cvLoadImage("fruits.jpg"); Mat img(IplImg, true);转载&#xff1a;http://blog.csdn.net/zhuwei1988

麦当劳数字化转型中获得的6个数据科学经验

摘要 美国大数据公司Civis Analytics于2017年底与麦当劳北美市场营销和数据科学团队建立了数据技术合作伙伴关系&#xff0c;经过一年半的努力&#xff0c;近期在纽约广告周上共同展示了一些重要的学习成果。 麦当劳客户数据科学总监David Galinsky和麦当劳媒体科学经理Emma Hi…

操作系统(三)

学习记录&#xff08;3&#xff09; 线程 1.线程的优势在哪&#xff1f; 1.1 多线程之间会共享同一块地址空间和所有可用数据的能力&#xff0c;这是进程所不具备的。 1.2 线程要比进程更轻量级&#xff0c;由于线程更轻&#xff0c;所以它比进程更容易创建&#xff0c;也更容…

【Kubernetes】两篇文章 搞懂 K8s 的 fannel 网络原理

近期公司的flannel网络很不稳定&#xff0c;花时间研究了下并且保证云端自动部署的网络能够正常work。 1.网络拓扑 拓扑如下&#xff1a;&#xff08;点开看大图&#xff09; 容器网卡通过docker0桥接到flannel0网卡&#xff0c;而每个host对应的flannel0网段为 10.1.x.[1-255…

图像读取、转为灰度图像、均值平滑、显示保存操作

#include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <iostream> int main( ) {// 读取图像源cv::Mat srcImage cv::imread("..\\images\\pool.jpg");if( srcImage…

python 查询 elasticsearch 常用方法(Query DSL)

2019独角兽企业重金招聘Python工程师标准>>> 1. 建立连接 from elasticsearch import Elasticsearch es Elasticsearch(["localhost:9200"])2. 查询所有数据 # 方式1&#xff1a; es.search(index"index_name", doc_type"type_name"…

OpenCV 【十一】—— 图像去畸变,对极约束之undistort,initUndistortRectifyMap,undistort

目录 0.极限约束&#xff0c;对极校正 1.摄像机成像原理简述 2.成像畸变 2.1. 畸变数学模型 2.2. 公式推导 3.畸变校正 3.1. 理论推导 4. 图像去畸变** 5. 图像尺度缩放与内参的关系** 5.1 undistortPoints() 5.2 initUndistortRectifyMap() 5.3 undistort() 6.Un…

Ubuntu14.04 Mininet中将Openvswitch升级步骤

2019独角兽企业重金招聘Python工程师标准>>> 首先下载Mininet apt-get install mininetservice openvswitch-controller stopupdate-rc.d openvswitch-controller disablemn --test pingall 这里可能会出现以下错误sudo mn --mac --controllerremote,port6653 --top…

(转)软件测试的分类软件测试生命周期

软件测试的分类&软件测试生命周期 软件测试的分类&#xff1a; 按测试执行阶段&#xff1a;单元测试、集成测试、系统测试、验收测试、&#xff08;正式验收测试&#xff0c;Alpha 测试-内侧&#xff0c;Beta 测试-公测&#xff09; 按测试技术分类&#xff1a;黑盒测试、白…

OpenCV 【十二】OpenCV如何扫描图像、利用查找表和计时

目录 OpenCV如何扫描图像、利用查找表和计时 1.函数计算时间测试case 2. Mat图像的存储机理 3. 像素遍历的3--4种方式 4. 实例 OpenCV如何扫描图像、利用查找表和计时 如何计算函数运行时间&#xff1f; Mat图像如何存储&#xff1f; 如何高效遍历图像像素&#xff1f; …

Java String.split()用法小结

2019独角兽企业重金招聘Python工程师标准>>> 在java.lang包中有String.split()方法,返回是一个数组 我在应用中用到一些,给大家总结一下,仅供大家参考: 1、如果用“.”作为分隔的话,必须是如下写法,String.split("\\."),这样才能正确的分隔开,不能用Strin…

217. 验证码 demo

2019独角兽企业重金招聘Python工程师标准>>> 1.效果 2.准备&#xff1a; 下载相关的jar 这里我使用的是ValidateCode 这个jar https://my.oschina.net/springMVCAndspring/blog/1815719 &#xff08;1&#xff09;相关jar下载路径 链接&#xff1a;https://pan.…