下面是幾種搜尋列表的幾種演算法和它的複雜度分析。
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
log2n
。因此最壞情況的複雜度為o(log
2n}lo
g2n
)。
基於Python的資料結構(二) 搜尋演算法
搜尋是在項集合中查詢特定項的演算法過程。搜尋通常對於項是否存在返回 true 或 false。有時它可能返回項被找到的地方。在python中使用in即可完成對元素的查詢,但是 演算法原理 在項集合中按照順序對元素進行比較,即順序查詢,其時間為o n 優缺點 如果查詢的元素位置在中間,則時間只有n 2...
資料結構與演算法之四 搜尋演算法
目標在本章中,你將學習 使用線性搜尋技術搜尋資料和二叉搜尋技術搜尋資料 線性搜尋 是最簡單的搜尋方法,也稱作順序搜尋,包括將用該條目逐一與列表中的條目進行比較,線性搜尋通過比較所需的元素與列表中第乙個元素進行。如果值不匹配 則所需的元素將與列表中的第二個元素作比較。如果值還是不匹配 則所需的元素將與...
python演算法與資料結構 搜尋
搜尋是指查詢乙個數列中乙個元素是否存在 條件 要求處理的數列是經過排序的,操作物件支援下標索引,也就是說元素要連續,那麼也就是只能處理順序表 演算法過程 一,將游標定位到中間位置,判斷目標數字 與當前的數字 的大小,如果 大於 則向右查詢,反之,向左迭代查詢 時間複雜度 最壞情況 o log n 對...