列表查找
在一个数据结构中,通过一定的方法找出与给定关键字相同的数据元素的过程。
列表查找(线性表查找):从列表(一种线性数据结构,元素按照一定的顺序存储,每个元素都有一个唯一的位置索引)中查找指定元素在列表中的位置(索引),或者判断该元素是否存在列表中。(python内置函数index())
- 输入: 列表、待查找元素
- 输出: 元素下标(索引),未找到时返回None或-1
顺序查找
顺序查找(线性查找):从列表第一个元素开始逐个比较,直到找到目标元素或遍历完整个列表。
按顺序进行查找,直至找到目标元素或遍历所有元素。
代码如下:
def linear_search(ls,target):
for i, val in enumerate(ls):
if val == target:
return i
else:
return -1
my_list = [10, 20, 30, 40, 50, 60, 70]
target_element = 40
result = linear_search(my_list, target_element)
if result != -1:
print(f"目标元素 {target_element} 在列表中的索引为: {result}")
else:
print(f"目标元素 {target_element} 未找到")
二分查找
二分查找(折半查找):前提是列表有序,将列表分为两半,判断目标元素所在位置的那一半,在对应部分进行查找,知道找到目标元素或确定元素不存在。可以使候选区减少一半。
第一步:由左右指针(列表首位元素索引)的索引计算mid指针(),将目标元素与mid所指元素对比。如图所示,大于目标元素,所以将右指针移动到mid指针左侧(索引为3)。
第二步:左指针(索引0)、右指针(索引3),接着计算mid指针()向下取整为1,比较mid所指元素与目标元素,目标元素大于mid元素,故将左指针移动到mid指针右侧(索引为2)。
第三步:重复上述操作,得到mid为2,找到目标元素,返回结束。
注:如果列表中"3"替换为“4”,那么在移动左右指针时,会发生左指针在右指针右侧的情况,这种情况为非法情况。可以返回-1。
代码如下:
def binary_search(ls,target):
left = 0
right = len(ls) - 1
while left <= right: #候选区存在
mid = (left + right) // 2 #向下取整
if ls[mid] == target:
return mid
elif ls[mid] > target:
right = mid - 1 #目标元素在左半部,更新右边界
else:
left = mid + 1 #目标元素在右半部,更新左边界
return -1 #未找到目标元素,返回-1
my_list = [10, 20, 30, 40, 50, 60, 70]
target_element = 40
result = binary_search(my_list, target_element)
if result != -1:
print(f"目标元素 {target_element} 在列表中的索引为: {result}")
else:
print(f"目标元素 {target_element} 未找到")
哈希查找
插值查找
二叉树搜索查找
更新中......