国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

詳解常用查找數據結構及算法(Python實現)

2020-02-23 04:09:03
字體:
來源:轉載
供稿:網友

一、基本概念

查找(Searching)就是根據給定的某個值,在查找表中確定一個其關鍵字等于給定值的數據元素(或記錄)。

查找表(Search Table):由同一類型的數據元素(或記錄)構成的集合

關鍵字(Key):數據元素中某個數據項的值,又稱為鍵值。

主鍵(Primary Key):可唯一地標識某個數據元素或記錄的關鍵字。

查找表按照操作方式可分為:

靜態查找表(Static Search Table):只做查找操作的查找表。它的主要操作是: 查詢某個“特定的”數據元素是否在表中 檢索某個“特定的”數據元素和各種屬性 動態查找表(Dynamic Search Table):在查找中同時進行插入或刪除等操作: 查找時插入數據 查找時刪除數據

二、無序表查找

也就是數據不排序的線性查找,遍歷數據元素。

算法分析:最好情況是在第一個位置就找到了,此為O(1);最壞情況在最后一個位置才找到,此為O(n);所以平均查找次數為(n+1)/2。最終時間復雜度為O(n)

# 最基礎的遍歷無序列表的查找算法# 時間復雜度O(n)def sequential_search(lis, key):  length = len(lis)  for i in range(length):    if lis[i] == key:      return i    else:      return Falseif __name__ == '__main__':  LIST = [1, 5, 8, 123, 22, 54, 7, 99, 300, 222]  result = sequential_search(LIST, 123)  print(result)

三、有序表查找

查找表中的數據必須按某個主鍵進行某種排序!

1. 二分查找(Binary Search)

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

# 針對有序查找表的二分查找算法# 時間復雜度O(log(n))def binary_search(lis, key):  low = 0  high = len(lis) - 1  time = 0  while low < high:    time += 1    mid = int((low + high) / 2)    if key < lis[mid]:      high = mid - 1    elif key > lis[mid]:      low = mid + 1    else:      # 打印折半的次數      print("times: %s" % time)      return mid  print("times: %s" % time)  return Falseif __name__ == '__main__':  LIST = [1, 5, 7, 8, 22, 54, 99, 123, 200, 222, 444]  result = binary_search(LIST, 99)  print(result)

2. 插值查找

二分查找法雖然已經很不錯了,但還有可以優化的地方。

有的時候,對半過濾還不夠狠,要是每次都排除十分之九的數據豈不是更好?選擇這個值就是關鍵問題,插值的意義就是:以更快的速度進行縮減。

插值的核心就是使用公式:

value = (key - list[low])/(list[high] - list[low])

用這個value來代替二分查找中的1/2。

上面的代碼可以直接使用,只需要改一句。

# 插值查找算法# 時間復雜度O(log(n))def binary_search(lis, key):  low = 0  high = len(lis) - 1  time = 0  while low < high:    time += 1    # 計算mid值是插值算法的核心代碼    mid = low + int((high - low) * (key - lis[low])/(lis[high] - lis[low]))    print("mid=%s, low=%s, high=%s" % (mid, low, high))    if key < lis[mid]:      high = mid - 1    elif key > lis[mid]:      low = mid + 1    else:      # 打印查找的次數      print("times: %s" % time)      return mid  print("times: %s" % time)  return Falseif __name__ == '__main__':  LIST = [1, 5, 7, 8, 22, 54, 99, 123, 200, 222, 444]  result = binary_search(LIST, 444)  print(result)            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 全州县| 历史| 莒南县| 榆中县| 米泉市| 蓝山县| 建阳市| 海伦市| 汨罗市| 博客| 盐山县| 苍南县| 安仁县| 林州市| 扶绥县| 那坡县| 平顺县| 金平| 庄浪县| 合江县| 三河市| 西华县| 仪陇县| 霍林郭勒市| 宁南县| 乐清市| 聊城市| 巴里| 晋宁县| 马公市| 竹山县| 肇庆市| 莱阳市| 桃园市| 株洲县| 泗水县| 靖边县| 乌兰察布市| 当雄县| 电白县| 唐河县|