目录
线性表查找技术:是指进行查找运行的查找表所采用的存储结构是线性表的存储结构。
在线性表查找技术中,对数据元素的查找包括:二分查找和顺序查找和分块查找。
1. 二分查找(Binary Search)
二分查找又称折半查找,是一种效率较高的查找方法。二分查找要求线性表是有序表,即表中结点按关键字有序排列,并且要用顺序表作为表的存储结构。
二分查找是一种在有序数组中查找某一特定元素的搜索算法。
过程:搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束,如果是某一个特定元素小于或大于中间元素,则在数组小于或大于中间元素的那一半中进行查找,然后重复这个过程(递归),直到元素被找到,或找不到(数组为空,return -1)。
python3取整函数:
- int()向下取整
- round()四舍五入
- ceil()向上取整
二叉判定树:深度为的满二叉树,折半二叉树,以中间值为结点。
--> python递归实现
# 二分查找-递归实现
def binarysearch(num_list, left, right, x):
# 需要判断left和right索引位置
if left <= right:
mid = int((left + right)/2)
# temp = num_list[mid]
if num_list[mid] == x:
return mid
elif num_list[mid] < x:
left = mid + 1
# 注意:使用递归调用的时候,要注意return返回,否则会出现None
return binarysearch(num_list, left, right, x)
else:
right = mid - 1
return binarysearch(num_list, left, right, x)
else:
return -1
if __name__ == '__main__':
num_list = [10, 20, 30, 40, 50, 60, 70, 75, 80, 90, 100]
index = binarysearch(num_list, 0, len(num_list)-1, 75)
print(index)
-->python循环实现
# 二分查找-循环实现
def binarySearch_loop(num_list, x):
left = 0
right = len(num_list)-1
while left <= right:
mid = int((left+right)/2)
if num_list[mid] == x:
return x
elif num_list[mid] < x:
left = mid + 1
else:
right = mid - 1
return -1
2. 顺序查找(Order Search)
顺序查找是最简单的查询方法,它的基本思想是:从表的一端开始,顺序扫描线性表,依次将扫描到的结点关键字与给定值Key相比较。
# 顺序查找
def orderSearch(num_list, x):
for i in range(len(num_list)):
if num_list[i] == x:
return i
return -1
if __name__ == '__main__':
num_list = [10, 20, 30, 40, 50, 60, 70, 75, 80, 90, 100]
index = orderSearch(num_list, 65)
print(index)
3. 哈希表查找技术
背景:由存储值查找位置索引时,在用线性查找和二分查找的过程中,需要依据关键词进行若干次的比较判断,确定数据集合中是否存在关键字等于某个给定关键字的记录以及该记录在数据表中的位置,查找的效率与比较的次数密切相关。
problem:在查找事需要不断进行比较的原因是建立数据表时,只考虑了个记录的关键字之间的相对大小,即记录在表中的关键字位置与关键字无直接关系。
-->线性查找或二分查找等方法需要顺序地搜索整个记录直到找到所需键值的记录。但该方法十分耗时,尤其当列表非常大时耗时严重。
solve:如果能在记录中的关键字位置与关键字之间建立某种直接关系,那么在进行查找时,就无须比较或只做很少的比较就能直接由关键字找到相应的记录。
一个有效解决方法是计算所需记录的偏移地址,并且在产生偏移地址处读取记录。
哈希函数:就是通过公式将关键字值对转换为偏移地址来检索记录。
哈希技术是查找和检索与唯一标识相关信息的最好方法之一。