【笔记】数据结构与算法 python-03-列表查找

列表查找

在一个数据结构中,通过一定的方法找出与给定关键字相同的数据元素的过程。

列表查找(线性表查找):从列表(一种线性数据结构,元素按照一定的顺序存储,每个元素都有一个唯一的位置索引)中查找指定元素在列表中的位置(索引),或者判断该元素是否存在列表中。(python内置函数index())

  • 输入: 列表、待查找元素
  • 输出: 元素下标(索引),未找到时返回None或-1

顺序查找

顺序查找(线性查找):从列表第一个元素开始逐个比较,直到找到目标元素或遍历完整个列表。

【笔记】数据结构与算法 python-03-列表查找_第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} 未找到")

二分查找

二分查找(折半查找):前提是列表有序,将列表分为两半,判断目标元素所在位置的那一半,在对应部分进行查找,知道找到目标元素或确定元素不存在。可以使候选区减少一半。

【笔记】数据结构与算法 python-03-列表查找_第2张图片

第一步:由左右指针(列表首位元素索引)的索引计算mid指针((0+8)/2=4),将目标元素与mid所指元素对比。如图所示,大于目标元素,所以将右指针移动到mid指针左侧(索引为3)。

第二步:左指针(索引0)、右指针(索引3),接着计算mid指针((0+3)/2=1.5)向下取整为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} 未找到")

哈希查找

插值查找

二叉树搜索查找

更新中......

你可能感兴趣的:(笔记)