查找算法:順序查找與二分法查找


查找(Search)

描述順序查找與二分法(折半搜索)的概念以及用python實現其查找流程

筆記中二分法記錄簡單的檢索方法,更詳細方法傳送門:二分法查找的python案例

順序查找

算法原理:遍歷數據元素

查找表類型:無序表查找,也就是數據不sort的線性查找,遍歷數據元素

算法分析:

 

由此最終算法時間復雜度為O(n)

 

# 最常見的就是for遍歷列表的順序查找算法
# 時間復雜度O(n)
#Question: Given a sorted list of numbers, find the index of a specific value in the list. If no such value, return -1.

def sequential_search(lis, key):
    for i in range(len(lis)):
        if lis[i] == key:
            return i
    else:               #注意else的縮進位置,與if並列的話都會返回False return False

alist = [1, 5, 8, 123, 22, 54, 7, 99, 300, 222] 
result = sequential_search(alist, 123)
print(result)

#輸出結果
3

 

二分法

算法原理:在查找表中不斷取中間元素與查找值進行比較,以二分之一的倍率進行表范圍的縮小。

查找表類型:有序表查找,查找表中的數據必須按某個主鍵進行某種排序。

算法分析:

由此可得算法時間復雜度為O(logn),比O(n)更優

 

'''
簡單方法
二分法查找在列表中的用戶輸入值,返回index
三種情況跳出循環體: LR相鄰    LR位置重合   RL
算法時間復雜度為O(logn)

''' def bi_search(lis,num): if len(lis) == 0: #判斷邊界條件 return -1    left, right = 0, len(lis)-1 #列表的起始點和終點 while left <= right: mid = (left + (right - left)) // 2 #取二分中心點,或 mid = (left + right) // 2 if num < lis[mid]: #右點左移 right = mid - 1 elif num > lis[mid]: #左點右移 left = mid + 1 else: #num == lis[mid] return mid return -1 num = int(input('please input a num:')) alist = [1,2,3,4,5,6,7,8] bi_search(alist,num) 輸出結果: please input a num:3 2

改進方案:如果我要找一個數組中相同數字最前面的那個數字。比如lis = [1,2,2,2,2,3,3,5,6],用上面的代碼會返回index為4,下面代碼解決如何返回相同元素的最前一個

'''
改進版本經典方法,這種方法更加好寫
把常規方法的right = mid -1 和left = mid +1修改
找不到返回-1
'''

def bi_search2(lis, num):
   
    #這個程序中這一條判斷邊界非常重要
    if len(lis) == 0:
        return -1
    
    #判斷二分條件
    left, right = 0, len(lis) - 1
    while left + 1 < right:
        mid = left + (right - left) // 2
        if lis[mid] == num:
            right = mid
        elif lis[mid] < num:
            left = mid
        elif lis[mid] > num:
            right = mid
    
    #在這里返回
    if lis[left] == num:
        return left
    if lis[right] == num:
        return right
    
    return -1


num = int(input('please input a num:'))
alist = [1,2,2,2,2,6,7,8]
bi_search2(alist,num)

#輸出結果
please input a num: 2
1


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM