1. 程式人生 > >python實現各種查詢演算法

python實現各種查詢演算法

#二分查詢 需要列表為有序 時間複雜度O(logn)

import  random
def binarySearch(listn,value):
    listn.sort()
    mid = len(listn) // 2
    left=0
    right=len(listn)-1
    count=0
    while(listn[left]<listn[mid]):
        count += 1
        if value<listn[mid]:
            right=mid
            mid=(right+left)//2
        elif value>listn[mid]:
            left=mid
            mid=(right+left)//2
        if (value == listn[mid]):
            print('count:', count)
            # 在得到結果時迴圈檢測和前一個元素是否相等
            while listn[mid - 1] == listn[mid]:
                mid -= 1
            return mid
    return -1
listn=[]
for _ in range(100):
    rd=random.randrange(10)
    # 如果列表裡有相同的查詢數字就會出現問題:可能會得到後面數字的索引
    # 解決方案: 在得到結果時迴圈檢測和前一個元素是否相等

    # if(rd!=7):
    #     listn.append(rd)
    listn.append(rd)
#listn.append(7)
print(binarySearch(listn.copy(),7))

#系統自帶方法find() 檢測結果是否正確
listm=listn.copy()
listm.sort()
print('find : ',''.join([str(m) for m in listm]).find('7'))

#插值查詢 需要列表為有序 時間複雜度O(logn)
import random
def InsertionSearch(listn,value):
    listn.sort()
    count=0
    left=0
    right=len(listn)-1
    #mid=low+(high-low)*(key-a[low])/(a[high]-a[low])
    #mid=left +int((right - left) * (value - listn[left]) /(listn[right] - listn[left]))
    while(listn[left]<listn[right]):
        mid = left + int((right - left) * (value - listn[left]) / (listn[right] - listn[left]))
        count += 1
        if value<listn[mid]:
            right=mid-1
        elif value>listn[mid]:
            left=mid+1
        if(value==listn[mid]):
            print('count:',count)
            #在得到結果時迴圈檢測和前一個元素是否相等
            while listn[mid-1]==listn[mid]:
                mid-=1
            return mid

    return -1


listn=[]
for _ in range(100):
    rd=random.randrange(10)
    # if(rd!=7):
    #     listn.append(rd)
    listn.append(rd)

print(InsertionSearch(listn.copy(),7))
#系統自帶方法find() 檢測結果是否正確
listm=listn.copy()
listm.sort()
print('find : ',''.join([str(m) for m in listm]).find('7'))
#結論: 和二分查詢一樣無法找到重複元素的第一位(插值查詢是在二分查詢演算法基礎上進行優化)
#解決方案: 在得到結果時迴圈檢測和前一個元素是否相等

#順序查詢 返回index 如果無返回-1 時間複雜度O(n)
def sequentialSearch(listn,value):
    for i in range(len(listn)):
        if listn[i]==value:
            return i
    return -1

print(sequentialSearch([4,3,9,6,7,2],7))