考的少,近五年只考过1-2分的折半查找
顺序查找
将待查找的关键字为key的元素从头到尾与表中元素进行比较,如果中间存在关键字为key的元素,则返回成功;否则,则查找失败。时间复杂度为O(n)。
10 | 20 | 30 | 40 | 50 | 60 | 70 |
顺序查找就是从左到右(从10到70一个一个的进行比较查找),最好的情况就是第一个,最坏的情况就是最后一个才找到。时间复杂度考虑的是最坏的情况。
折半(二分)查找
只能对有序的数组进行查找
设查找表的元素存储在一维数组[1…n]中,在表中元素已经按照关键字递增方式排序的情况下,进行折半查找的方法是:
1、首先将待查元素的关键字(key)值与表r中间位置上(下标为mid)记录的关键字进行比较,若相等,则查找成功;
2、若key>r[mid].key,则说明待查记录只可能在后半个子表r[mid+1…n]中,下一步应在后半个子表中查找;
3、若key<r[mid].key,说明待查记录只可能在前半个子表r[1.mid-1]中,下一步应在r的前半个子表中查找:
4、重复上述步骤,逐步缩小范围,直到查找成功或子表为空失败时为止。
如图查找30
1)先找到mid=3的值是40。L=0,R=7,M=7/2=3
2)30<40,舍弃40右侧的数据,找到中间值mid=1的值是20。L=0,R=M-1=3-1=2,M=2/2=1
3)30>20,舍弃20左侧的数据。L=M+1=1+1=2,R=2,M=(2+2)/2=2
要注意两点:
- 中间值位置求出若为小数,应该向下取整,即4.5=4,非四舍五入;
- 中间值已经比较过不相等,在划分下一次比较区间时,无需将中间值位置再纳入下一次比较区间。当查找的数据越多时,二分查找的效率越高。
折半查找的时间复杂度为O(log2n)
哈希查找
需要先进行哈希存储
前面的查找方法,由于记录在存储结构中的相对位置是随机的,所以查找时都要通过一系列与关键字的比较才能确定被查记录在表中的位置。也就是说,这类查找都是以关键字的比较为基础的,而哈希表则通过一个以记录的关键字为自变量的函数(称为哈希函数)得到该记录的存储地址,所以在哈希表中进行查找操作时,
需要用同一哈希函数计算得到待查记录的存储地址,然后到相应的存储单元去获得有关信息再判定查找是否成功。
即我们要进行的哈希查找,要查找的元素首先使用哈希函数运算出结果放到哈希表里面;然后要查找的元素也使用哈希函数进行运算,运算的函数在哈希表里查找
散列(哈希)表:根据设定的哈希函数H(key)和处理冲突的方法,将一组关键字映射到一个有限的连续的地址集上,并以关键字在地址集中的“像”作为记录在表中的存储位置。
在上图中,很明显,哈希函数产生了冲突,使用的是线性探测法解决冲突,还有其他方法如下:
- 线性探测法:按物理地址顺序取下一个空闲的存储空间。
- 伪随机数法:将冲突的数据随机存入任意空闲的地址中。查找效率会很低
- 再散列法:原有的散列函数冲突后,继续用此数据计算另外一个哈希函数,用以解决冲突。
在上图查找13,只要将13取模运算=2。在哈希表地址2的位置就是要查找的元素
查找12,12取模运算=1, 地址1的值是34,然后往后不断的查找
在CPU里加减乘除是最基本的运算,时间可以忽略≈0,所以这种查找还是很快的
练习题
例:在13个元素构成的有序表M[1.13]中进行折半查找(向下取整),若找到的元素为M[4],则被比较的元素依次为
A.M[7]、M[3]、M[5]、M[4]
B.M[7]、M5]、M[4]
C.M[7]、M[61、M[4]
D.M[7]、M[4]
答案A
例:以下关于哈希Hash,散列查找叙述中,正确的是()
A.哈希函数应尽可能复杂些,以消除冲突
B.构造哈希函数时应尽量使关键字的所有组成部分都能起作用
C.进行哈希查找时,不再需要与查找表中的元素进行比较
D.在哈希表中只能添加元素不能删除元素
答案B
例如java里的对象Book(id=1001,name=english,price=29),将Book放入哈希表需要将Book的所有属性id,name,price运算得到一个值,再将该值进行哈希运算
C,例如哈希查找图例中的查找12
【2022年】以下关于散列表(哈希表),及其查找特点的叙述中,正确的是()
A.在散列表中进行查找时,只需要与待查找关键字及其同义词进行比较
B.只要散列表的装填因子不大于1/2,就能避免冲突
C.用线性探测法解决冲突容易产生聚集问题
D.用链地址法解决冲突可确保平均查找长度为1
答案C
A:线性探测法,发生冲突后要一直往后查找
B:冲突不能避免,只能减少。可以将哈希长度加大,减少冲突
D:查找长度为1就是1次就能找到。一旦发生冲突就不能只查找一次
【2023年】对某有序表进行折半查找(二分查找)时,进行比较的关键字序列不可能是()。
A.42,61,90,85,77
B.42,90,85,61,77
C.90,85,61,77,42
D.90,85,77,61,42
答案C
画二叉树,每次折半,右边的数都比前面大;左边的数据币前面小。满足该规则不发生冲突即可。如下图61,90,85,77的值都是比42大的。90,85,77的值都是比61大的
B:90,85,61,77都比42大;85,61,77比90小;61,77比85小;满足规则
C:42比61小,不满足规则