python資料結構 搜尋演算法

2021-09-25 05:32:57 字數 2613 閱讀 7375

下面是幾種搜尋列表的幾種演算法和它的複雜度分析。

python的min函式返回列表中的最小的項。下面是為了研究它的複雜度開發出來的演算法。

#!/usr/bin/python

#coding:utf-8

def indexofmin(lyst):

minindex = 0

currentindex = 1

while currentindex < len(lyst):

if lyst[currentindex] < lyst[minindex]:

minindex = currentindex

currentindex += 1

return minindex

if __name__ == '__main__':

lyst = [3,2,1,4,5,6]

a = indexofmin(lyst)

print("最小項為:",lyst[a])

演算法分析:在indexofmin()函式中它返回了乙個最小項的索引。這個演算法假設列表不為空,並且其中的項的順序是任意的。該演算法先將列表中的第1個位置當作最小項。然後,向右搜尋以找到乙個更小的2項,如果找到了,將最小的位置重新設定為當前位置。當搜尋到末尾時它就返回最小值的位置。

複雜度分析:迴圈外的三條指令執行相同的次數,不用管列表的大小是多少。因此可以忽略它們。這個演算法必須訪問列表中的每一項,以確保它找到了最小項的位置。因此,對於大小為n的列表,該演算法必須進行n-1次比較。因此,演算法複雜度為o(n)。

順序搜尋又叫線性搜尋,用於搜尋乙個列表中的特定的項。下面是順序搜尋的**:

#!/usr/bin/python

#coding:utf-8

def sequentialsearch(target,lyst):

position = 0

while position < len(lyst):

if target == lyst[position]:

return position

position += 1

return -1

if __name__ == '__main__':

target = 5

lyst = [1,2,3,4,10]

a = sequentialsearch(target,lyst)

if a != -1:

print("目標為:",lyst[a])

else:

print("沒有找到目標!")

演算法分析:先從第乙個位置的項開始,將其與目標項進行比較。如果這兩個項相等,該方法返回索引。否則,該方法移動到下乙個位置並且將其項與目標項進行比較。如果該方法到達了最後乙個位置,卻仍然找不到目標項,它就返回-1。

複雜度分析:這個演算法的複雜度要分為三種情況:

當搜尋排序的資料的是時候可以使用二叉搜尋。下面是實現**:

#!/usr/bin/python

#coding:utf-8

def binarysearch(target,sortedlyst):

left = 0

right = len(sortedlyst) - 1

while left <= right:

midpoint = (left + right) // 2

if target == sortedlyst[midpoint]:

return midpoint

elif target < sortedlyst[midpoint]:

right = midpoint - 1

else:

left = midpoint + 1

return -1

if __name__ == '__main__':

target = 10

sortedlyst = [1,2,3,4,9,10]

a = binarysearch(target,sortedlyst)

if a != -1:

print("目標為:", sortedlyst[a])

else:

print("沒有找到目標!")

演算法分析:首先假設列表中的每一項都是按照公升序排列的。搜尋演算法直接找到列表中間位置,並且將該位置的項和目標項進行比較。如果它們是一致的,返回該位置。否則,如果目標項小於當前項,演算法搜尋列表中間位置以前的部分。如果目標項大於當前項,演算法搜尋列表中間位置以後的部分。如果找到目標,或者當前的開始位置比當前的結束位置要大的時候,停止搜尋過程。

複雜度分析:當目標項不在列表中的時候,會發生最壞情況,這等於列表的大小除以2直到得到的商為1的次數。對於大小為n的列表,實際上執行了n/2/2…/2的連續除法,直到結果為1。假設k是用n除以2的次數。要求解n/2

k2^k

2k=1,即k=log

2n

log_2

log2​n

。因此最壞情況的複雜度為o(log

2n}lo

g2​n

)。

基於Python的資料結構(二) 搜尋演算法

搜尋是在項集合中查詢特定項的演算法過程。搜尋通常對於項是否存在返回 true 或 false。有時它可能返回項被找到的地方。在python中使用in即可完成對元素的查詢,但是 演算法原理 在項集合中按照順序對元素進行比較,即順序查詢,其時間為o n 優缺點 如果查詢的元素位置在中間,則時間只有n 2...

資料結構與演算法之四 搜尋演算法

目標在本章中,你將學習 使用線性搜尋技術搜尋資料和二叉搜尋技術搜尋資料 線性搜尋 是最簡單的搜尋方法,也稱作順序搜尋,包括將用該條目逐一與列表中的條目進行比較,線性搜尋通過比較所需的元素與列表中第乙個元素進行。如果值不匹配 則所需的元素將與列表中的第二個元素作比較。如果值還是不匹配 則所需的元素將與...

python演算法與資料結構 搜尋

搜尋是指查詢乙個數列中乙個元素是否存在 條件 要求處理的數列是經過排序的,操作物件支援下標索引,也就是說元素要連續,那麼也就是只能處理順序表 演算法過程 一,將游標定位到中間位置,判斷目標數字 與當前的數字 的大小,如果 大於 則向右查詢,反之,向左迭代查詢 時間複雜度 最壞情況 o log n 對...