数据结构基础笔记(二)【严蔚敏】


动态存储管理:伙伴系统

分配内存算法思想:

当程序提出大小为n的内存分配请求时,首先在可利用表中查找大小与n相匹配的子表.

◆ 若存在2^(k-1)< n ≤ 2^k-1的空闲子表结点:则将子表中的任意一个结点分配之;

◆ 若不存在2^(k-1) < n ≤ 2^k-1的空闲子表结点:则从结点大小为2^k的子表中找到一个空闲结点,将其中一半分配给程序,剩余的一半插入到结点大小为2k-1的子表中。

注:在进行大小为n(2^(k-i-1) < n ≤ 2^(k-i)-1,i=1,2,…,k-1) 的内存分配请求时,若所有小于2^k的子表均为空(没有空闲结点),则同样需要从大小为2^k的子表中找到一个空闲结点,将其中2^(k-i)一小部分分配给用户,而将剩余部分分割成若干个结点分别插入对应的子表。

回收算法:

当程序释放所占用的块时,系统将该新的空闲块插入到可利用空闲表中,需要考虑合并成大块问题。在伙伴系统中,只有“互为伙伴”的两个子块均空闲时才合并;即使有两个相邻且大小相同的空闲块,如果不是“互为伙伴” (从同一个大块中分裂出来的)也不合并。

  1. 伙伴空闲块的确定:

    设p是大小为2^k的空闲块的首地址,且p MOD 2^(k+1) =0,则首地址为p和p+2^k的两个空闲块“互为伙伴”。

    首地址为p大小为2^k的内存块的,其伙伴的首地址为:

    若p MOD 2^(k+1) = 0【前一个】, 则buddy(p,k)=p+2^k;

    否则p MOD 2^(k+1) = 2^k【后一个】, 则buddy(p,k)=p-2^k;

  2. 回收算法思想

    ⑴ 判断其 “互为伙伴”的两个空闲块是否为空:

    若不为空,仅将要回收的空闲块直接插入到相应的子表中;否则转⑵;

    ⑵ 按以下步骤进行空闲块的合并:

    ◆ 在相应子表中找到其伙伴并删除之;

    ◆ 合并两个空闲块;

    ⑶ 重复⑵,直到合并后的空闲块的伙伴不是空闲块为止。

平衡二叉树

设深度为h的平衡二叉排序树所具有的最少结点数为Nh,则由平衡二叉排序树的性质知:

N0=0,N1=1,N2=2,… ,Nh= Nh-1+Nh-2

索引查找:B树

平衡二叉排序树便于动态查找,因此用平衡二叉排序树来组织索引表是一种可行的选择。当用于大型数据库时,所有数据及索引都存储在外存,因此,涉及到内、外存之间频繁的数据交换,这种交换速度的快慢成为制约动态查找的瓶颈。若以二叉树的结点作为内、外存之间数据交换单位,则查找给定关键字时对磁盘平均进行㏒2n次访问是不能容忍的,因此,必须选择一种能尽可能降低磁盘I/O次数的索引组织方式。树结点的大小尽可能地接近页的大小。

B_树主要用于文件系统中,在B_树中,每个结点的大小为一个磁盘页,结点中所包含的关键字及其孩子的数目取决于页的大小。一棵度为m的B_树称为m阶B_树

一棵m阶B_树,或者是空树,或者是满足以下性质的m叉树:

⑴ 根结点或者是叶子,或者至少有两棵子树,至多有m棵子树;

⑵ 除根结点外,所有非终端结点至少有m/2【向上取整】棵子树,至多有m棵子树;

⑶ 所有叶子结点都在树的同一层上;

设n是结点中关键字的个数,且m/2【取下限】-1≤n≤m-1,n+1为子树的棵数。

  • B树删除

    在B_树上删除一个关键字K,首先找到关键字所在的结点N,然后在N中进行关键字K的删除操作。

    1). 若N不是叶子结点,设K是N中的第i个关键字,则将指针Ai-1所指子树中的最大关键字(或最小关键字)K’放在(K)的位置,然后删除K’,而K’一定在叶子结点上。如图9-15(b),删除关键字h,用关键字g代替h的位置,然后再从叶子结点中删除关键字g。

    2). 从叶子结点中删除一个关键字的情况是:

    ⑴ 若结点N中的关键字个数>m/2-1【取上限】:在结点中直接删除关键字K;

    ⑵ 若结点N中的关键字个数=m/2-1【取上限】:若结点N的左(右)兄弟结点中的关键字个数>m/2-1【取上限】,则将结点N的左(或右)兄弟结点中的最大(或最小)关键字上移到其父结点中,而父结点中大于(或小于)且紧靠上移关键字的关键字下移到结点N;

    ⑶ 若结点N和其兄弟结点中的关键字数=m/2-1【取上限】:删除结点N中的关键字,再将结点N中的关键字、指针与其兄弟结点以及分割二者的父结点中的某个关键字Ki,合并为一个结点,若因此使父结点中的关键字个数

B+树

在实际的文件系统中,基本上不使用B_树,而是使用B_树的一种变体,称为m阶B+树。 它与B_树的主要不同是叶子结点中存储记录。在B+树中,所有的非叶子结点可以看成是索引,而其中的关键字是作为“分界关键字”,用来界定某一关键字的记录所在的子树。一棵m阶B+树与m阶B_树的主要差异是:

⑴ 若一个结点有n棵子树,则必含有n个关键字;

⑵ 所有叶子结点中包含了全部记录的关键字信息以及这些关键字记录的指针,而且叶子结点按关键字的大小从小到大顺序链接;

⑶ 所有的非叶子结点可以看成是索引的部分,结点中只含有其子树的根结点中的最大(或最小)关键字。

与B_树相比,对B+树不仅可以从根结点开始按关键字随机查找,而且可以从最小关键字起,按叶子结点的链接顺序进行顺序查找。在B+树上进行随机查找、插入、删除的过程基本上和B_树类似。

在B+树上进行随机查找时,若非叶子结点的关键字等于给定的K值,并不终止,而是继续向下直到叶子结点(只有叶子结点才存储记录) , 即无论查找成功与否,都走了一条从根结点到叶子结点的路径。

B+树的插入仅仅在叶子结点上进行。当叶子结点中的关键字个数大于m时,“分裂”为两个结点,两个结点中所含有的关键字个数分别是(m+1)/2【取下限】和 (m+1)/2【取上限】 ,且将这两个结点中的最大关键字提升到父结点中,用来替代原结点在父结点中所对应的关键字。提升后父结点又可能会分裂,依次类推。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-26 00:34:49

数据结构基础笔记(二)【严蔚敏】的相关文章

小猪的数据结构学习笔记(二)

小猪的数据结构学习笔记(二) 线性表中的顺序表 本节引言: 在上个章节中,我们对数据结构与算法的相关概念进行了了解,知道数据结构的 逻辑结构与物理结构的区别,算法的特性以及设计要求;还学了如何去衡量一个算法 的好坏,以及时间复杂度的计算!在本节中我们将接触第一个数据结构--线性表; 而线性表有两种表现形式,分别是顺序表和链表;学好这一章很重要,是学习后面的基石; 这一节我们会重点学习下顺序表,在这里给大家一个忠告,学编程切忌眼高手低,看懂不代表自己 写得出来,给出的实现代码,自己要理解思路,自己

数据结构基础笔记(一)【严蔚敏】

广义表 广义表相关概念: ◆ a1(表中第一个元素)称为表头: ◆ 其余元素组成的子表称为表尾:(a2,a3,-,an) ◆ 广义表中所包含的元素(包括原子和子表)的个数称为表的长度. ◆ 广义表中括号的最大层数称为表深 (度). 根据对表头.表尾的定义,任何一个非空广义表的表头可以是原子,也可以是子表, 而表尾必定是广义表. 只要广义表非空,都是由表头和表尾组成,即一个确定的表头和表尾就唯一确定一个广义表. 广义表数据结点定义: typedef struct GLNode { int tag

JavaScript基础笔记二

一.函数返回值1.什么是函数返回值    函数的执行结果2. 可以没有return // 没有return或者return后面为空则会返回undefined3.一个函数应该只返回一种类型的值 二.可变参(不定参)arguments function sum (a,b) { var result=0; var i=0; for(i=0;i<arguments.length;i++) { result+=arguments(i); } alert(resulet); } sum(12,5,7,5,5

数据结构基础(二)

二叉树 二叉树的性质 1.非空二叉树上的叶节点数等于双分支节点数加1.2.非空二叉树上第i层上至多有2^(i-1)个节点,这里应有1>=1.3.高度为h的二叉树至多有2^h - 1 个节点 (h>=1).4.在二叉树中,如果所有分支节点都有左孩子和右孩子节点,并且叶子节点都集中在二叉树的最下一层,这样的二叉树称为满二叉树. 只有度为0和度为2的节点 叶子节点都在最下一层 5.完全二叉树:二叉树中最多只有最下面两层的节点的度数可以小于2,并且最下面一层的叶子节点都依次排列在该层最左边的位置上,则

redis 数据结构基础 (二) 链表

redis中的链表恐怕是最简单的数据结构了,redis链表中总共有3个数据结构: listNode: 1 typedef struct listNode { 2 struct listNode *prev; //前向节点指针 3 struct listNode *next; //后续节点指针 4 void *value; //存储的值,采取void*类型,万能类型,但是少了类型信息 5 } listNode; 从这个上面可以看出,redis的链表是双向链表 list: typedef struc

JavaSE基础笔记二

第二章 基本语法 一.关键字&标识符 关键字:被java语言赋予了特殊含义,用做专门用途的字符串(单词) 保留字: 标识符:java对各种变量.方法和类等要素命名是使用的字符序列,即凡可以自己命名的地方都叫标识符 命名规则:(一定要遵守,否则会报编译异常) 由26个英文字母大小写,0-9,_或$组成 数字不可以开头 不可以使用关键字和保留字,但是能包含关键字和保留字. java严格区分大小写,长度无限制. 标识符不能包含空格. java中的命名规范:(不遵守也不会出异常) 包名:多单词组成时所有

C数据结构学习笔记二 循环和递归打印fibonacci函数

//循环方式实现 #include <stdio.h> int main(int argc, char *argv[]) { int f1=0,f2=1,f3; printf("%d ",f1); printf("%d ",f2); while(f1<15) { f3=f1+f2; printf("%d ",f3); f1=f2; f2=f3; } return 0; } //递归方式实现 #include <stdio.

网络基础笔记二

1.[ICMP] 1.   ICMP是因特网的标准协议,但ICMP不是高层协议,而是IP层的协议.通常ICMP报文被IP层或更高层协议(TCP或UDP)使用.一些ICMP报文把差错报文返回给用户进程. ICMP允许主机或路由报告差错情况和提供有关异常情况. 2.   ICMP报文作为IP层数据报的数据,加上数据报的首部,组成数据报发送出去. 3.   ICMP报文的种类有两种,即ICMP差错报告报文和ICMP询问报文. 2.[三次握手]accept发生在三次握手之后.第一次握手:客户端发送syn

jquery基础 笔记二

动态创建元素 关于使用HTML DOM创建元素本文不做详细介绍, 下面举一个简单的例子: //使用Dom标准创建元素 var select = document.createElement("select"); select.options[0] = new Option("加载项1", "value1"); select.options[1] = new Option("加载项2", "value2");