查找(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
