1.关键字定义
查找(Searching)就是根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素。
查找表(Search Table):由同一类型的数据元素构成的集合
关键字(Key):数据元素中某个数据项的值,又称为键值
主键(Primary Key):可唯一的标识某个数据元素或记录的关键字
2.查找表按照操作方式可分为:
①静态查找表
a)查询某个“特定的”数据元素是否在表中
b)检索某个“特定的”数据元素和各种属性
②动态查找表
a)查找时插入数据
b)查找时删除数据
3.按查找的数据可分为:
①无序查找
也就是数据不排序的线性查找,遍历数据元素
②有序查找
查找表中的数据必须按某个主键进行某种排序!
4.顺序查找/线性查找(无序)
①定义
顺序查找又称为线性查找,是一种最简单的查找方法。适用于线性表的顺序存储结构和链式存储结构。该算法的时间复杂度为O(n)。
②基本思路
因为时无序的,所以没有任何的计算规则,只能从头到末尾,一个个遍历。
从第一个元素m开始逐个与需要查找的元素x进行比较,当比较到元素值相同(即m=x)时返回元素m的下标,如果比较到最后都没有找到,则返回-1。
③优缺点
优点:是对表中数据元素的存储没有要求
缺点:是当n 很大时,平均查找长度较大,效率低
④算法实现
#线性查找/顺序查找
def linear_search(list,key):
result ={}
for i in range(len(list)):
if list[i] == key:
result["iddex"] = i
result["value"] = key
return result
5.二分法查找(有序)
①算法简介:
二分查找(Binary Search),是一种在有序数组中查找某一特定元素的查找算法。查找过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则查找过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。
这种查找算法每一次比较都使查找范围缩小一半。
②算法描述
给与一个有序的列表
1.取列表索引的最小索引low和最大的索引high,然后算平均值mid
2.把查找的key与list[mid]比较
3.如果key大于list[mid],则key在list[mid]和list[high]之间,low=mid-1,继续切片list,重复1,2步骤
4.如果key小于list[mid],则key在list[low]和list[mid]之间,high=mid+1,继续切片list,重复1,2步骤
5.如果key等于list[mid],则找到key
③算法实现
#二分查找
def binary_searcH(list,key):
print(list,key)
result ={}
low = 0
high = len(list)-1
times = 0
while low <high:
times +=1
mid = int((low+high)/2)
print(mid,times)
if key < list[mid]:
high = mid -1
elif key > list[mid]:
low = mid +1
else:
result["index"] = list[mid]
result["value"] = key
return result
else:
print('total times:', times)
return result
6.插值查找(有序)
①算法简介
插值查找是根据要查找的关键字key与查找表中最大最小记录的关键字比较后的 查找方法,其核心就在于插值的计算公式 (key-a[low])/(a[high]-a[low])*(high-low)。
时间复杂度o(logn)但对于表长较大而关键