一、查找表
元素关系:离散
查找索引:关键字,表示数据元素或记录
类型:动态查找表(查找的同时进行插入删除)和静态查找表
数据结构:线性表、树表、散列表。
二、基于线性表(顺序表、链表:即存储结构:顺序存储、链式存储 )的查找方法:
顺序查找
优点:适用于顺序结构、链式结构。
缺点:平均查找长度较大,查找效率低,n很大时不采用。
实例:顺序表的实现算法
(1)数据元素类型定义:
typedef struct{ Keytype key; Infotype info; }Elemtype; typedef struct{ Elemtype *p; int length;
}SSTable;
p数组图示:
(2)算法步骤——哨兵标记法:
优点:省去步骤——”判断搜索是否越界“。
int Search_Seq(SSTable ST,KeyType key){ ST.p[0].key=key; for(i=ST.length;ST.p[i].key!=key;--i); return i; }
折半查找
(1)算法步骤
int Search_Bin(SSTable ST,KeyType key) { low=1; high=ST.length; while(low<=high) { mid=(low+high)/2; if(key==ST.p[mid].key) return mid; else if(key<ST.p[mid].key) high=mid-1; else low=mid+1; } return 0; }
二、基于树表:二叉排序树、平衡二叉树、B-树、B+树
二叉排序树:关键字比大小
查找算法:
BSTree SearchBS (BSTree T,Keytype key)
{
if(T==NULL || key=->data.key) return T;
else if(key<T->data.key)
return SearchBST((T->lchild),key);
return SearchBST((T->rchild),key);
}
插入算法:
BSTree InsertBST (BSTree &T,ElemType e) { if(T==NULL) S=new BSTNode; S->data=e; S->lchild=S->rchild=NULL; T=S; else if(e.key=T->data.key) cout<<e.key; //这一步是我自己看书的时候想把查找+插入结合在一起的步骤 else if(e.key<T->data.key) return InsertBST((T->lchild),key); else if(e.key>T->data.key) return InserBtBST((T->rchild),key); }
创建——从空树不断插入结点的过程
三、散列表(哈希)
区别:关键字和关键字地址存在函数关系。
数据结构:存储空间通常是一维数组,散列地址是数组的下标
研究问题:
1、如何构造散列函数
除留余数法
该方法为最常用的构造哈希函数方法,对于散列表长为m的散列函数公式为
f(key) = key mod p (p<=m)
使用除留余数法的一个经验是,若散列表表长为m,通常p为小于或等于表长的最小质数。
2、处理冲突的方法
开放地址、链地址法
(1)散列表的查找
int SearchHash(HashTable HT,KeyType key) { H0=H(key); if(HT[H0].key==NULLkey) return -1;//此时为空说明后面的元素也不能为key else if(HT[H0].key==key) return H0; else { for(i=1;i<m;++i) { Hi=(H0+i)%m; if(HT.[Hi]==NULLkey) return -1;//此时为空说明后面的元素也不能为key else if(HT[Hi].key==key) return Hi; } } }
四、总结过去,计划未来
(1)本学期学的所有数据结构特别是树在这一章充分运用,在学习的过程中,发现了在树的递归上书写的技巧——停留在本层,逐层返回。!!!递归函数的返回值的类型尤其重要(过去容易忽略)。
(2)近期临近期末考,未来这段时间要多练习综合应用类的题目,复习以往的概念。