机器学习1002_Python基础_数据结构与算法_查找

本文介绍了三种常见的查找算法:顺序查找、二分查找和哈希表查找。通过Python代码展示了它们的实现和效率分析。顺序查找在有序和无序列表中的时间复杂度为O(N);二分查找的时间复杂度为O(log n);哈希表查找理论上时间复杂度为O(1),但在处理哈希冲突时可能会增加到O(N)。
摘要由CSDN通过智能技术生成
我们只看常用的三种算法:顺序查找(sequential search)、二分查找(binary_search)、哈希表查找(hashing)。并简单分析三种算法的效率。
1. 顺序查找:从头向尾逐次查找,直到找到为止。我们使用Python实现顺序查找功能。
import time
def sequential_search(a_list,item):
    pos = 0  # 当前指针位置
    found = False
    # 如果指针未历遍列表,且当前位置以前未找到该元素,则
    while pos < len(a_list) and not found:
        if a_list[pos] == item:  # 如果当前位置是需要查找的元素
            found = True
        else:
            pos = pos + 1  # 否则指针指向下一个元素
    return found

test_list = [1,2,32,8,17,19,42,13,0]
print(sequential_search(test_list,3))
print(sequential_search(test_list,13))
上述是通用的顺序查找算法,针对于一些特殊的列表,如顺序列表(order list),顺序查找算法做出一些微小的调整: 如果当前位置的元素大于要查找的元素,则停止,不必再向后检索 ,因为后面的元素肯定都大于要查找的元素。下面我们来看一个例子。
import time
def ordered_sequential_search(a_list,item):
    pos = 0  # 当前指针位置
    found = False
    stop = False
    while pos < len(a_list) and not found and not stop:
        if a_list[pos] == item:
            found = True
        else:
            if a_list[pos] > item:
                stop = True  # 如果当前位置的元素大于要查找的元素,则停止
            else:
                pos = pos + 1  # 指针指向下一个元素
    return found

test_list = [0,2,3,8,13,17,19,32,42]
print(ordered_sequential_search(test_list,1))
print(ordered_sequential_search(test_list,32))

2. 二分查找: 在一个顺序列表中,从中位数开始查找,并比较所查找的元素与中位数的大小,将列表二分为含查找元素的区间C1,以及不含查找元素的区间C2。然后再对C1进行二分,直到找到为止。
例如有一个列表[0,2,3,8,13,17,19,32,42],假设需要查找到32,若使用顺序查找法,要先历遍0,2,3,8,13,17,19共7个元素。若使用二分法,则首先找到列表中点(0+9)//2=4(实际上是第5个元素13)。
此时中点为13,小于需要查找的32,所以32应该在区间[17,19,32,42]中。
再次查找中点(0+3)//2 = 1 (实际上是第2个元素)。此时中点为19,小于需要查找的32,所以32应该在区间[32,42]中。
再次查找中点(0+1)//2 = 0 (实际上是第1个元素)。此时中点为32,我们找到了需要的元素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值