- 10
- 0
- 约1.02万字
- 约 80页
- 2021-08-09 发布于广东
- 举报
1、静态查找表2、动态查找表3、哈希查找表;术语:
查找(检索)——根据给定的某个值,在表中确定一个关键字等于给定值的记录或数据元素
关键字——是记录某个数据项的值,它可以唯一标识 一个记录。
次关键字——不能唯一的确定一个记录,但能确定表的一个子表。子表的元素个数应远少于表中元素数。
为简化问题,将表中元素看成简单的整型数据,理解为关键字部分。;8.1 静态查找表 ;顺序查找的平均时间为表长的一半。;bin_search(st[],key,n)
{ low=0;
high=n-1;
while(low=high){
mid=(low+high)/2;
if( st[mid] = = key)
return mid;
else if(st[mid]key)
high=mid-1;
else low=mid+1;}
return -1;
};3、分块查找;1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18;分块查找方法评价;小结:
时间:顺序查找最差,二分最好,分块介于两者之间
空间:分块最大,需要增加索引数据的空间
特点:
1)顺序查找对表没有特殊要求
2)分块时数据块之间在物理上可不连续。所以可以达到插入、删除数据只涉及对应的块;另外,增加了索引的维护。
3)二分查找要求表有序,所以若表的元素的插入与删除很频繁,维持表有序的工作量极大。
4)在表不大时,一般直接使用顺序查找。;二分查找的C/C++接口;#include iostream.h
#include stdlib.h
cmp(const void *a, const void *b)
{
if(*(int *)a*(int *)b) return -1;
else if(*(int *)a==*(int *)b) return 0;
else return 1; }
void main()
{
int ar[]={-2,3,6,9,10,21,22,34,56};
int *p;
int t;
t=9;
p=(int *)bsearch(t,ar,sizeof(ar)/sizeof(int),sizeof(int), cmp);
if(p!=NULL) cout*pendl;
};8.2 动态查找;45;2、查找:
步骤:若根结点的关键字值等于查找的关键字,成功。
否则,若小于根结点的关键字值,递归查左子树。
若大于根结点的关键字值,递归查右子树。
若子树为空,查找不成功。;3、插入算法:
首先执行查找算法,找出被插结点的父亲结点。
判断被插结点是其父亲结点的左、右儿子。将被插结点作为叶子结点插入。
若二叉??为空。则首先单独生成根结点。
注意:新插入的结点总是叶子结点。;void InsertBST(*t,key)
//在二叉排序树中插入查找关键字key
{
if(t= = NULL){
t=new BiTree;
t-lchild=t-rchild=NULL;
t-data=key;
return; }
if(keyt-data ) InsertBST(t-lchild,key);
else InsertBST (t-rchild, key );
}
void CreateBiTree(tree,d[ ],n)
//n个数据在数组d中,tree为二叉排序树根
{ tree=NULL;
for(i=0;in;i++)
InsertBST(tree,d[i]);
};4.二叉排序树中一个结点的删除
在二叉排序树中删除结点的原则是:删除结点后仍是二叉排序树。;(3)x即有左子树xL 也有右子树xR;二叉排序树的删除操作例子 ;122;被删结点的左、右子树皆不空;void delete(*p)
{
if(p-rchild = = NULL)
{ q=p;
p=p-lchild;
delete q; }
else if(p-lchild= =NULL)
{ q=p; p=p-rchild;
d
原创力文档

文档评论(0)