簡體   English   中英

在python中實現二進制搜索算法

[英]Implementing the Binary Search algorithm in python

我是python的新手,我想通過遞歸實現二進制搜索,我可以看到Internet的解決方案,但是我自己嘗試了所有方法,因為我想學習,所以這是我的方法:

y=7
count=0
def hello(x):

    while len(x)>0:
        for i in x:
            a=len(x)//2

            if y<x[a]:
                print("left_most_side", a)
                return hello(x[:a])

            elif y==x[a]:
                print("middle", a)
                return a
            elif y>x[a]:
                print("right_most_side", a)
                return hello(x[a:])


        return x

hello([1,2,3,4,5,6,7])

它的工作完美,並提供了預期的輸出,但是問題是,它打印了兩部分列表的索引,而我需要原始列表的索引。 例如:a = [1,2,3,4]將它一分為二,現在是[1,2]和[3,4],如果我必須找到4,那么它將在位置0打印4,答案是正確的但僅在等分列表中,而正確的答案是“ 4”在原始列表中的位置3,因此它應該打印3,這就是我面臨的問題。

如我的評論中所述,我建議傳遞整個列表以及要搜索的上下限。 這將解決索引問題。

此外,請不要讓函數使用全局變量。 這是不好的做法。

def hello(x, key, l, r):
     if l < r:
        a = (l + r) // 2
        if key < x[a]:
            return hello(x, key, l, a + 1)

        elif key > x[a]:
            return hello(x, key, a + 1, r)

        else:
            return a

     else:
          return -1

In [288]: src = [1,2,3,4,5,6,7]

In [289]: hello(src, key=7, l=0, r=7) 
Out[289]: 6

In [290]: hello(src, key=0, l=0, r=7) 
Out[290]: -1

In [291]: hello(src, key=1, l=0, r=7) 
Out[291]: 0

像這樣通過遞歸使用左右方向來跟蹤數組邊界

y=7

def hello (x, left, right, query):
    if right >= left:
        mid = left + (right - left)/2
        if x[mid] == query:
            return mid
        elif x[mid] > query:
            return hello(x, left, mid-1, query)
        else:
            return hello(x, mid+1, right, query)
    else:
        # we found nothing
        return -1
arr = [1,2,3,4,5,6,7]

print hello(arr,0,len(arr),y)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM