赞
踩
二叉排序树
二叉排序数(Binary Sort Tree)又称为二叉查找树,它或者是一棵空树,或者是具有下列性质的二叉树:
一若它的左子树不为空,则左子树上所有结点的值均小于它的根结构的值;
一若它的右子树不为空,则右子树上所有结点的值均大于它的根结构的值;
一它的左、右子树也分别为二叉排序树(递归)。
平衡二叉排序树
要么Ta是一棵空树,要么Ta的左子树和右子树都是平衡二叉树,且左子树和右子树的深度之差的绝对值不超过1。
平衡二叉排序树
不是平衡二叉排序树
多路查找树
多路查找树的特点是其每一个结点的孩子数可以多于两个,且每一个结点处可以存储多个元素。
多路查找树中的每一个结点都具有两个孩子或者三个孩子我们称之为2-3树。
一个结点拥有两个孩子和一个元素我们称之为2结点,Ta跟二叉排序树类似,左子树包含的元素小于结点的元素,右子树包含的元素大于结点的元素。不过与二叉排序树不同的是,这个2结点要么没有孩子,要有就应该有两个孩子,不能只有一个孩子。
B树(B-tree)是一种平衡的多路查找树,2-3树和2-3-4树都是B树的特例。
我们把结点最大的孩子树数目称为B树的阶(order),因此,2-3树是3阶B树,2-3-4树是4阶B树。
一个m阶的B树具有如下属性:
一如果根结点不是叶结点,则其至少有两棵子树一每一个非根的分支结点都有k-1个元素(关键字)和k个孩子,其中k满足:
一所有叶子结点都位于同一层次
一每一个分支结点包含下列信息数据:
n, A0,Kl,Al,K2,A2, K3,A3......
一其中K为关键字,且Ki<Ki+1
一Ai为指向子树根结点的指针
散列表(哈希表)查找
我们要在a[]中查找key关键字的记录:
一顺序表查找:挨个儿比较
一有序表查找:二分法查找
一散列表查找:记录的存储位置=f(关键字)
散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key)。
散列表的查找步骤
当存储记录时,通过散列函数计算出记录的散列地址
当查找记录时,我们通过同样的是散列函数计算记录的散列地址,并按此散列地址访尚该记录
构造散列函数的两个基本原则
直接定址法
我们可以取关键字的某个线性函数值为散列地址,即: f(key) = a * key + b
数字分析法
数字分析法通常适合处理关键字位数比较大的情况,例如我们现在要存储某家公司员工登记表,如果用手机号作为关键字,那么我们发现抽取后面的四位数字作为散列地址是不错的选择。
平方取中法
平方取中法是将关键字平方之后取中间若干位数字作为散列地址。适合位数不大
折叠法
折叠法是将关键字从左到右分割成位数相等的几部分,然后将这几部分叠加求和,并按散列表表长取后几位作为散列地址。
除留余数法
此方法为最常用的构造散列函数方法,对于散列表长为m的散列函数计算公式为:
-f(key)= key mod p(p<=m)
事实上,这个方法不仅可以对关键字直接取模,也可以通过折叠、平方取中后再取模。
例如下表,我们对有12个记录的关键字构造散列表时,就可以用f(key) = key mod 12的方法。
随机数法
选择一个随机数,取关键字的随机函数值为它的散列地址。
即: f(key) = random( key)。
这里的random是随机函数,当关键字的长度不等时,采用这个方法构造散列函数是比较合适的。
现实中,我们应该视不同的情况采用不同的散列函数,一些参考方向:
一计算散列地址所需的时间
一关键字的长度
一散列表的大小
一关键字的分布情况
一记录查找的频率
处理微列冲突的方法
开放定址法
所谓的开放定址法就是一旦发生了冲突,就去寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到,并将记录存入。
再散列函数法
链地址法
公共溢出区法
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。