检索(一)线性表检索、集合检索

来源:互联网 发布:ws源码 编辑:程序博客网 时间:2024/05/17 09:33

检索是指在数据中找到关键码满足特定条件的某些记录。

一,效率

检索的销率非常重要,特别是对于海量的数据。下面介绍提高检索效率的方法:

1)预排序 (适用于少量数据):在检索前完成,利用有序性,进行有序表的查找。比如二分查找。缺点:排序算法比较耗时

2)索引:对于经常查找的情况,利用辅助的索引信息,提高检索的销量。

缺点:要浪费空间存储辅助的索引信息,是以空间换时间的做法。且,需要维护索引表和查找表的一致,查找表改变时,要相应的改变索引表。

3)散列(适用于数据量大的情况,检索效率高):数据存储于散列表中,根据关键码,确定数据在散列表中的位置。

缺点:只能针对一个关键值的查找,不适合范围查找。一般也不允许重复的关键字

二、衡量标准

1)时间标准:平均检索长度 ASL=∑c(i)*p(i)

2)需要的存储量

3)算法的繁杂度

三、线性表的检索

1)顺序检索:适用于链表和顺序表

检索成功的ASL=(n+1)/2; 检索失败的比较次数是n+1;

假设成功检索的概率是p,失败检索的概率是1-p,ASL2=p*(n+1)/2+(1-p)(n+1)=(n+1)(1-p/2) ASL2=Θ(n)

优点:插入数据可以插入末尾 时间为O(1)

缺点:检索时间长为O(n)

2) 二分检索

intbsearchWithoutRecursion(intarray[],intlow,inthigh,inttarget){while(low<=high){intmid=(low+high)/2;if(array[mid]>target)high=mid-1;elseif(array[mid]<target)low=mid+1;else//findthetargetreturnmid;}//thearraydoesnotcontainthetargetreturn-1;}

二分查找的时间复杂度
基于BST
这里写图片描述
最大的成功查找比较次数⌈log2(n+1)⌉
失败查找比较次数⌈log2(n+1)⌉或⌊log2(n+1)⌋
这里写图片描述

优点:查找效率为logn
缺点:插入元素不方便,需要先排序

3)分块检索
思想:按块有序
前一块的最大关键码必须小于后一块的最小关键码
每一块中的关键码不一定有序
用二分查找找到数据块,再用顺序查找块内的数据。
顺序检索和二分检索的折中,既有较快的检索速度,又方便插入。
这里写图片描述
分块检索时间复杂度分析:
b块,每块长度为s。b=n/s
这里写图片描述
优点:插入删除方便,没有大量记录的移动
缺点:增加一个辅助的存储数组。
检索前需先对分块进行排序。
当大量插入删除,至使块满或块空时,需要重新组织数组。

四、集合的检索

1)集合的表示方式
用位向量来表示集合:适合于密集型集合
这里写图片描述
2)集合的数据结构
这里写图片描述
3)集合的插入删除
这里写图片描述

0 0