1.静态查找表 (线性表):
操作:
1)查询某个“特定的”数据元素是否在查找表中;
2)检索某个“特定的”数据元素的各种属性;
顺序查找:
即用逐一比较的办法顺序查找关键字,
这显然是最直接的办法。
技巧:
把待查关键字key存入表头或表尾(俗称“哨兵”),这样可以加快执行速度。
我们看一下程序就知道哨兵的好处:
int Search_Seq(SSTable ST,
KeyType key) {
// 在顺序表ST中顺序查找其关键字等于
// key的数据元素。若找到,则函数值为
// 该元素在表中的位置,否则为0。
ST.elem[0].key = key; // “哨兵”
for (i=ST.length; ST.elem[i].key!=key; --i);
// 从后往前找
return i; // 找不到时,i为0
} // Search_Seq
如果不设哨兵 for(i=1;ST.elem[i!=key&&i>=0;--i])多了
n个i>=0判断比较,设了
哨兵后,往前--i 肯定会有==情况所以有哨兵可以降低程序复杂度。
折半查找:
折半查找只适用于有序顺序表( 顺序存储结构),如果链式计算地址 (low+high)/2不好算没优势。
分块查找:
分块查找表是基于索引的。 块内无序,块间有序。
看下图:
哈希表:
1.开散列表(链地址法) 2.闭散列表 (开放定址法) 。
哈希是基于计算的思想,其他都是基于比较的思想。
二叉排序树
二叉排序树主要注意删除算法如下图:
每个问题都有关键点和突破点对既有左子树又有右子树的二叉排序树就是(以前驱替代之,然后在删除该前驱结点),可以看到上图40代替了50,并且把以前的40删了。
平衡二叉树
平衡二叉树主要注意左右手原则和以哪个节点为旋转轴两点。
注意这是以B为旋转轴。
再看LR,RL情况:
这是以C为旋转轴,这两种情况要搞清楚,不然容易混淆。
B-树
B-树主要应用于文件系统当中。
结构如下:
1) B-树是一种 平衡的多路查找树:
2) 非终端结点的结构如下:
n
|
p0
|
k1
|
p1
|
k2
|
p2
|
…
|
ki
|
pi
|
…
|
kn
|
pn
|
(1)根结点或者为叶子,或者至少有两棵子树,至多有m棵子树。
(2)除根结点外,所有非终端结点至少有ceil(m/2)棵子树,至多有m棵子树。
(3)所有叶子结点都在树的同一层上。
(4)每个结点的结构为:
(n,A0,K1,A1,K2,A2,… ,Kn,An)( A0从0开始所以子树可以m,关键字最多m-1)。
其中,Ki(1≤i≤n)为关键字,且Ki<Ki+1(1≤i≤n-1)。
Ai(0≤i≤n)为指向子树根结点的指针。且Ai所指子树所有结点中的关键字均小于Ki+1。An所指子树中所有结点的关键字均大于Kn。
n为结点中关键字的个数,满足 ceil(m/2)-1≤n≤m-1。
一颗4阶B-树如下:
![](http://hi.csdn.net/attachment/201110/7/0_1317973105AZo1.gif)
可以看到每个节点第一个数字n代表关键字个数。认清这个结构B-树的一些性质就能够想到。
B-树在 查找方面特性为( 平衡多路查找树):
B+树:
![](http://hi.csdn.net/attachment/201110/7/0_1317978570G3fw.gif)
注意B+树很大不同就是所有关键字都在叶子结点出现。所以
B+树的搜索:B+的搜索与B-树也基本相同,区别
1.是B+树只有达到叶子结点才命中(B-树可以在非叶子结点命中),其性能也等价于在关键字全集做一次二分查找;
2.为所有叶子结点增加一个链指针所以可以顺序搜索。
B+的特性:
1.所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关键字恰好
是有序的;
2.不可能在非叶子结点命中;
3.非叶子结点相当于是叶子结点的索引(稀疏索引),叶子结点相当于是存储(关键字)数据的数据层;
4.更适合文件索引系统;
要具体了解B 族类的树参考:http://www.cnblogs.com/oldhorse/archive/2009/11/16/1604009.html。
关于B树、B-树、B+树、B*树的一些规定是根据效率来规定的。
(如:B-树中要规定非终端接点的关键字数目必须大于m/2(m是树的阶)必须<m-1。
最常使用B树的地方是数据库,把数据和索引都放在块设备上,需要的时候再读出来,这时候,通常用一个或几个块存放B树的一个节点,访问的时候,从根开始依次往子节点访问,显然访问的节点数越少越好,也就是没一个节点上的关键字越多越好...这样可以减少读写存储设备的次数,提高检索效率..>m/2是为了保证树的高度尽可能的小)。