数据结构_查找.pptVIP

  • 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)

1亿VIP精品文档

相关文档