目录
5、 hello world 程序开始到打印到屏幕上的全过程?
1、 红黑树的性质
性质1.节点是红色或黑色。
性质2.根节点是黑色。
性质3.每个叶子节点都是黑色的空节点(NIL节点)。
性质4.每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)
性质5.从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
这些约束强制了红黑树的关键性质:从根到叶子的最长的可能路径不多于最短的可能路径的两倍长。结果是这个树大致上是平衡的。因为操作比如插入、删除和查找某个值的最坏情况时间都要求与树的高度成比例,这个在高度上的理论上限允许红黑树在最坏情况下都是高效的,而不同于普通的二叉查找树。
下图就是一个很典型的红黑树:
2、 红黑树的插入与旋转
1、添加的节点必须为红色
2、变色的情况:当前结点的父亲是红色,且它的叔结点也是红色:
2.1 把父节点设置为黑色
2.2 把叔节点设置为黑色
2.3 把祖父节点设置为红色
2.4 把当前指针定义到祖父节点,设为当前要操作的
3、左旋的情况:当前父节点是红色,叔节点是黑色,且当前的节点是右子树。
3.1 以父节点作为左旋。
4、右旋的情况:当前父节点是红色,叔节点是黑色,且当前的节点是左子树。
4.1 把父节点变成黑色
4.2 把祖父节点变为红色
4.3 以祖父节点右旋转
lsy注:
https://blog.csdn.net/qq_41687938/article/details/119634248
3、 红黑树与平衡二叉树
1、红黑树放弃了追求完全平衡,追求大致平衡,在与平衡二叉树的时间复杂度相差不大的情况下,保证每次插入最多只需要三次旋转就能达到平衡,实现起来也更为简单。
2、平衡二叉树追求绝对平衡,条件比较苛刻,实现起来比较麻烦,每次插入新节点之后需要旋转的次数不能预知。
lsy注:https://blog.csdn.net/qq_41687938/article/details/119634248
4、 二叉平衡树、红黑树、B树、B+树的区别与联系
1.二叉树的查找的时间复杂度是O(log2N),其查找效率与深度有关,而普通的二叉树可能由于内部节点排列问题退化成链表,这样查找效率就会很低。
2.平衡二叉树是更好的选择,因为它保持平衡,即通过旋转调整结构保持最小的深度。其查找的时间复杂度也是O(log2N)。
索引的结构也并非AVL树或更优秀的红黑树,尽管它的查询的时间复杂度很低。作为索引的结构应该是尽可能少的执行磁盘IO操作,因为执行磁盘IO操作非常的耗时。所以需要利用上磁盘的预读功能。平衡二叉树没利用上。
3.B树(多路搜索树)是为了充分利用磁盘预读功能来而创建的一种数据结构,也就是说B树就是为了作为索引才被发明出来的。
红黑树这种结构,h明显要深的多。由于逻辑上很近的节点(父子)物理上可能很远,无法利用局部性,所以红黑树的I/O渐进复杂度也为O(h),效率明显比B-Tree差很多。
4. 比B树更适合作为索引的结构是B+树
B树:有序数组+平衡多叉树;
B+树:有序数组链表+平衡多叉树;
B+树的关键字全部存放在叶子节点中,非叶子节点用来做索引,而叶子节点中有一个指针指向一下个叶子节点。做这个优化的目的是为了提高区间访问的性能。而正是这个特性决定了B+树更适合用来存储外部数据。
lsy注:B树和B-树都是指B-Tree
详解平衡二叉树、红黑树、B树、B+树在索引中的应用_子木呀的博客-CSDN博客
5、 hello world 程序开始到打印到屏幕上的全过程?
1.用户告诉操作系统执行HelloWorld程序(通过键盘输入等)
2.操作系统:找到helloworld程序的相关信息,检查其类型是否是可执行文件;并通过程序首部信息,确定代码和数据在可执行文件中的位置并计算出对应的磁盘块地址。
3.操作系统:创建一个新进程,将HelloWorld可执行文件映射到该进程结构,表示由该进程执行helloworld程序。
4.操作系统:为helloworld程序设置cpu上下文环境,并跳到程序开始处。
5.执行helloworld程序的第一条指令,发生缺页异常
6.操作系统:分配一页物理内存,并将代码从磁盘读入内存,然后继续执行helloworld程序
7.helloword程序执行puts函数(系统调用),在显示器上写一字符串
8.操作系统:找到要将字符串送往的显示设备,通常设备是由一个进程控制的,所以,操作系统将要写的字符串送给该进程
9.操作系统:控制设备的进程告诉设备的窗口系统,它要显示该字符串,窗口系统确定这是一个合法的操作,然后将字符串转换成像素,将像素写入设备的存储映像区
10.视频硬件将像素转换成显示器可接收和一组控制数据信号
11.显示器解释信号,激发液晶屏
12.OK,我们在屏幕上看到了HelloWorld