数据结构总结

随便整理了一点点,唤醒记忆即可^^


一、线性表
1、定义: 仅仅通过节点之间的相对位置来确定它们之间的相互关系的数据结构
2、线性结构:线性表(list),时间有序表(队列),排序表,频率有序表
3、线性表的顺序存储结构:顺序表示-顺序表和链接表示-链表
4、顺序表类:高级语言中,数组在存储器中表现为一块连续的空间,因此用数组实现顺序表类
5、顺序表基本操作:查找-O(n),插入-O(n),删除-O(n),最大缺点是插入和删除时的时间代价是线性阶的。
6、线性表的链接存储结构:每个节点放在一个独立的存储单元中,节点间的逻辑关系依靠存储单元中附加的指针给出。这样的链接存储结构称为链表。链表中的节点包含两部分:数据场和指针场。指针场用于存放其他相关节点的指针值。
7、分类:单链表(每个节点附加了一个指针场),双链表(每个节点附加两个指针场)- 双向循环链表
8、链表的迭代器类:处理链表中的所有遍历、访问和更新操作。

二、时间有序表
1、定义:节点之间的关系不是由节点之间的相互位置决定的,而是由到达和离开时间这两种线性结构的时间决定的。
2、分类:栈(堆栈)和队(队列)
3、栈:线性结构,后进先出(LIFO)或(FILO)结构。操作受限的线性表,插入和删除总是在表的另一端进行。
4、栈的顺序存储:栈的顺序存储就是用连续的空间存储栈中的结点,这里的连续空间通常采用数组。顺序方式存储的栈又称顺序栈。一旦栈的空间耗尽,将调用函数DoubleArray(),系统分配比当前数组的规模大一倍的新的数组作为栈的存储结构。(均摊分析)
5、栈的链式存储:栈顶指针top用于指向外于栈顶的结点,即单链表的首结点。因为链式栈的进、出栈总是在栈顶结点处进行,因此设置类似于单链表中的头结点就没有必要。
6、队列:线性结构,先进先出(FIFO)。队列的删除造作只能在队首进行而插入操作只能在尾部进行,从而保证先进先出特点。
7、队列的顺序存储:存储队列最简单的办法是使用数组,即顺序存储。可使用队首指针front和队尾指针rear指示队首结点和队尾结点存放的下表地址。根据队首指针front和队尾结点rear的关系判断队满或队空。
8、队列的链式存储:队首指针front指向队首结点,队尾指针rear指向队尾结点,队空的条件为front==NULL(或rear==NULL)(可认为不存在堆满的情况)
9、优先队列:队列是以先进先出的原则处理它的结点的数据结构,结点之间的关系是由到达队列的时间决定的,但有时要求进入队列中的结点具有优先级,队列中结点优先级越高出队越早,优先级越低出队越晚,优先级相同者采用先进先出的原则处理。应用:操作系统进程管理

三、树及二叉树
1、树的定义和术语:树是n>=1个结点的有限集合T,并且满足:
1)、有一个被称之为根的结点
2)、其余的结点可分为m>=0个互不相交的集合T1,T2,……,Tm,这些集合本身也是一棵树,并称它们为根节点的子树,每棵子树同样有自己的根节点。
2、树中每个节点具有的子树的数目称为该结点的度。度数为0的结点被称为叶子结点或终端结点,度数不为0的结点称为内部结点,或者非终端结点。一棵树中各结点度数的最大值定义为这棵树的度数。通常规定树的根结点的层次为1,其余结点的层次等于它的父亲结点的层次加1.一棵树中的最大层次定义为树的高度。
3、有序树:如果在一棵树中规定了所有结点的儿子结点的次序,即这些儿子结点都被指明是其父结点的第几个儿子结点,那么这棵树被称之为有序树。否则无序树。
4、森林:n棵互不相交的树的集合称为森林。

四、二叉树
1、定义:二叉树是结点的有序集合,它或者为空,或者由一个根结点以及两棵互不相交的左、右子树构成,而其左右子树都是二叉树。二叉树不是树的特殊情况,它们是两种不同的数据结构。若将二叉树的左右子树颠倒,就成为另一棵不同的二叉树。即使二叉树中的根结点只有一棵子树也要说明该子树是左子树还是右子树。二叉树可以为空,树不为空。
2、如果二叉树的任意一层的结点个数都达到了最大值,那么这棵二叉树被称为满二叉树或丰满树。
3、完全二叉树:一棵满二叉树同时又被称为完全二叉树。在满二叉树的最底层自右至左一次去掉若干个结点得到的二叉树也被称之为完全二叉树。
4、特点:所有的叶节点都出现在最低的两层上,对任一结点,如果其右子树的高度为k,则其左子树的高度为k或k+1。
5、二叉树性质
1)、一棵非空二叉树的第i层上最多有2^(i-1)个结点
2)、一棵高度为k的二叉树,最多具有2^k-1个结点
3)、对于一棵非空二叉树,如果叶子结点树为n0,度数为2的结点数为n2,则有n0=n2+1。
4)、具有n个结点的完全二叉树的高度为k=[logn]+1
6、二叉树的存储结构
1)、顺序存储结构:用数组存储一棵二叉树是一种常见的形式。这种方法适用于静态并已知结点个数的场合。缺点:需要估计数组的大小,往往会造成空间的浪费或者空间的不够使用。
2)、链式存储结构:两种连接存储结构
2.1)、标准形式:每个结点由三个场组成,数据场以及左右儿子的指针场。
2.2)、广义标准形式:在标准形式的基础上,再增加一个指向其父亲结点的指针场,称之为结点的广义标准形式

五、二叉树的遍历
1、二叉树常见的的遍历有六种:NLR,LNR,LRN,NRL,RNL,RLN
2、前序遍历(栈):前序遍历的递归定义:若二叉树为空,操作为空,否则:访问根结点,前序遍历左子树,前序遍历右子树。
3、中序遍历: 中 序遍历的递归定义:若二叉树为空,操作为空,否则:中序遍历左子树,访问根结点,中序遍历右子树。
4、后序遍历: 后 序遍历的递归定义:若二叉树为空,操作为空,否则:后序遍历左子树,后序遍历右子树,访问根结点。
5、已知二叉树的前序(后序)和中序之后,可唯一确定一棵二叉树。
6、中序穿线树: 我们把放置指向前驱结点和后继结点的指针叫线索,把原来指向左、右孩子的指针仍叫指针。具有这种结构的二叉链表称为线索二叉树或穿线二叉树。

六、最优二叉树
1、树的长度:树的路径长度是指从根结点到达树中的任何一个结点的路径长度的总和。
2、树的加权路径长度:树中的所有叶子结点的加权路径长度之和。若加权路径长度取最小值,那么这棵二叉树通常称之为最优二叉树。
3、哈夫曼算法
1)、给定一个具有n个权值的结点{w1,...,wn}的结点的集合F={T1,...,Tn}
2)、初始时,设集合A=F
3)、执行i=1至n-1次循环,每次循环执行如下操作:
从当前集合中选取权值最小,次最小的两个结点,以及这两个结点作为内部结点bi的左右儿子,bi的权值为其左右儿子权值之和。在集合中除去至两个权值最小,次最小的结点,并将内部结点bi加入其中。

七、二叉排序树
1、在平均情况下,在查找,插入,删除时,时间代价都是O(nlogn),在最坏情况下,时间代价仍然会达到O(n),但是在对二叉排序树改进后,得到的平衡二叉排序树(AVL树)、红黑树即使在最坏情况下时间代价仍然是O(nlogn)
2、二叉排序树是一棵二叉树,它或者为空,或者具有如下性质,对于任意一个结点p而言:
1)、若结点p的左子树不空,则左子树上所有结点的值均小于结点p的值
2)、 若结点p的右子树不空,则右子树上所有结点的值均大于结点p的值
3)、结点p的左右子树也都是二叉排序树
3、对二叉排序树进行中序遍历,将得到一个按关键字值有序的结点序列。需要注意的是,即使是相同的结点序列,构造的二叉排序树可能是完全不同的
4、删除:1)没有子结点,2)只有左子结点或右子结点,3)找到中序遍历此结点的上一个结点来替代它,再删除那个结点

八、平衡二叉排序树(AVL树)
1、结点的平衡度:结点左子树的高度减去右子树的高度。
2、如果一棵二叉树上的所有结点的平衡度只有0,+1,-1三种情况,那么这样一棵二叉树就称为平衡树(AVL树)
3、插入结点:新插入结点与危机结点的关系:(左子树的左子树上LL,LR)->左改组,(RR,RL)->右改组等四种可能
4、具有N个结点的平衡树,高度h满足log(N+1) <= h <= 1.44log(N+1) - 0.328。

九、红黑树(相比AVL树,实现程序简单高效)
1、特点:每个结点被染成红色或黑色;根结点是黑色的;如果一个结点是红色的,那么它的儿子结点必须是黑色的;从任何一个结点出发到空结点(即叶子结点的儿子结点,它们都为空,因此称为空结点,另外,通常认为空结点为黑色结点)的路径上必须包含相同数目的黑色结点。

十、B-树,B+树
1、如何减少访问硬盘的次数?使用B-树作为索引组织文件(类似于二叉排序树除去叶子结点的剩余部分)的方法。
2、一棵m阶B-树或者为空,或者满足以下条件:
1)、根结点要么是叶子,要么至少有两个儿子,至多有m个儿子
2)、除根结点和叶子结点之外,每个结点的儿子个数s满足[m/2] <= s <= m。
3)、有s个儿子的非叶结点具有n=s-1个关键字,故s=n+1。这些结点的数据信息为(n,A0,K1,R1,A1,K2,R2,A2..., Kn,Rn,An),其中n为关键字的个数;K1...,Kn为节点的关键字且K1<K2<...<Kn;A0=:小于K1的结点的地址;Rj:关键字值等于Kj的数据记录在硬盘中的地址;Aj:大于Kj且小于K(j+1)的结点的地址;An:大于Kn的结点的地址
4)所有的叶子结点都出现在同一层上,即它们的深度相同,并且不带信息
3、由于B-树包含有指向具体给定关键字值的指针Rj,在待查关键字值KEY等于kj时,立即就可以根据指针Rj给出的地址,读出关键字值等于KEY的数据记录,虽然方便一些,但是大大降低了B-树的阶数,B+树做了改进:
1)、 根结点要么是叶子,要么至少有两个儿子,至多有m个儿子
2)、 除根结点和叶子结点之外,每个结点的儿子个数s满足[m/2] <= s <= m。
3)、 有k个儿子的非叶结点具有k个关键字
4)、外部结点,保存信息。而叶节点可以认为是索引部分,结点中含其子树中的最大(或最小)关键字。
5)、叶子结点包含关键字信息和指向包含该关键字记录的指针,且按关键字顺序相链接。

十一、哈希方法
1、常用的散列函数:散列地址尽可能均匀,使得冲突机会尽可能少
1)、直接定址法H(x) = a * x + b
2)、除留余数法:H(x) = x mod p
3)、数字分析法
4)、平方取中法
5)、折叠法:如果关键字相当长,以至于和散列表的单元总数相比大得多
6)、基数转换法:将给定关键字的进位基数人为的看做为另一种进位的基数,然后求其大小
2、需要考虑因素:
1)、计算时间
2)、关键字长度
3)、散列表长度(散列地址范围)
4)、关键字分布情况
5)、记录的查找频率
3、处理溢出:线性探测法,随机探测法,二次探测法,链法 
























































  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值