基于关键码的搜索,搜索结果唯一。基于属性的搜索,搜索结构可能不唯一。
静态搜索结构/动态搜索结构
为了提高搜索速度,需要用特殊的组织方式来组织需要的搜索信息。
衡量一个搜索算法时间效率的标准是ASL
静态搜索结构
判定树
判定树包括内部节点和失败节点(描述两个相邻元素不在表中的数据值的集合),如果搜索达到失败节点,说明搜索不成功
可以用来辅助计算ASL到达失败节点的关键码比较次数等于层次编号-1
顺序搜索
A S L s u c c = ∑ i = 0 n − 1 p i ( i − 1 ) ASL_{succ}=\sum^{n-1}_{i=0}p_{i}(i-1) ASLsucc=i=0∑n−1pi(i−1)
如果是等概率的,则ASL=(n+1)/2
可以按照概率从高到低排队,ASL最小
缺点:平均搜索长度较长,n较大时效率低
优点:对表的特性没有要求,无论元素怎样存放都可以
基于有序顺序表的顺序搜索算法在搜索不成功时不需要遍历表中所有元素。
A[i-1].key<x<=A[i].key的时候就可以停止搜索了
int SortrdList<E,K>::SequentSearch(const K x)const
{
for(int i=1;i<=CurrentSize;i++)
if(Element[i-1].key==x)
return i;
else if(Element[i-1].key>x)
break;
return 0;
}
基于有序顺序表的顺序搜索
A S L s u c c = n + 1 2 ASL_{succ}=\frac{n+1}{2} ASLsucc=2n+1
A S L u n s u c c = 1 n + 1 ( 1 + 2 + . . . + n + n ) = n 2 + n n + 1 ASL_{unsucc}=\frac{1}{n+1}(1+2+...+n+n)=\frac{n}{2}+\frac{n}{n+1} ASLunsucc=n+11(1+2+...+n+n)=2n+n+1n
折半搜索
O ( l o g 2 n ) O(log_{2}n) O(log2n)
//迭代算法
int SortedList<E,K>::BinarySearch(const K x)const
{
int high=CurrentSize-1,low=0,mid;
while(low<=high)
{
mid=(low+high)/2;
if(x>Element[mid].key)
low=mid+1;
else if(x<Element[mid].key)
high