【问题标题】:Binary search through strings通过字符串进行二进制搜索
【发布时间】:2021-10-17 09:32:51
【问题描述】:

我对 python(3.3) 比较陌生,我只是想通过一个单词列表进行二进制搜索,当涉及到循环遍历索引时,我不知道如何修复我的操作数类型。 ..我继续收到TypeError。想不出任何办法来解决它

def find(L, target):
    start = 0
    end = len(L) - 1

    while start <= end: 
        middle = (start + end)// 2 
        midpoint = L[middle]
        if midpoint > target:
            end = midpoint - 1
        elif midpoint < target:
            start = midpoint + 1
        else:
            return midpoint

我这样调用函数:

L = [“Brian”、“Meg”、“Peter”、“Joe”、“Stewie”、“Lois”]

找到(L,“乔”)

【问题讨论】:

  • 二分搜索仅适用于排序列表
  • midpoint 是一个字符串。 midpoint - 1 应该怎么做?
  • @FernandoMatsumoto 可能是一个错字。我认为他的意思是middle - 1middle + 1
  • 要对数组进行成功的二分查找,数组中的数据必须是有序的。除了 Brian 之外的所有人的条目都错位了——顺序应该是 Brian、Joe、Lois、Meg、Peter、Stewie。
  • @jianweichuah 我认为费尔南多指出了这个错误。

标签: python binary-search


【解决方案1】:

您的逻辑似乎很好,除了 输入递增和递减中点而不是中间的错误。

def find(L, target):
    start = 0
    end = len(L) - 1

    while start <= end:
        middle = (start + end)/ 2
        midpoint = L[middle]
        if midpoint > target:
            end = middle - 1
        elif midpoint < target:
            start = middle + 1
        else:
            return midpoint

L = ["Brian", "Joe", "Lois", "Meg", "Peter", "Stewie"] # Needs to be sorted.

print find(L, "Peter")

【讨论】:

  • 如果你试图找到一个不存在的字符串怎么办?返回什么?
  • @cricket_007 无。不确定 OP 的用例是什么
【解决方案2】:
def find(L, target):
    start = 0
    end = len(L) - 1
    while start <= end:
        middle = (start + end)// 2
        midpoint = L[middle]
        if midpoint > target:
            end = middle - 1
        elif midpoint < target:
            start = middle + 1
        else:
            return midpoint

    L = ["Brian", "Joe", "Lois", "Meg", "Peter", "Stewie"]
    L = sorted(L)
    print(find(L, "Lois"))

正如其他人指出的那样,使用中间而不是中点

为了优化使用二分搜索,首先对列表进行排序

【讨论】:

  • sorted(L) 返回一个包含L 元素的新排序列表。使用L = sorted(L)L.sort()
【解决方案3】:
def binarySearchOnString(arr, x):
        l = 0
        r = len(arr) - 1
        while (l <= r): 
            m = (l + r) // 2 
            if (arr[m] == x): 
                return m
            elif (arr[m] < x): 
                l = m + 1
            else: 
                r = m - 1
        return -1  #   If element is not found  then it will return -1
    
            

【讨论】:

    猜你喜欢
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    • 2016-01-10
    • 2021-04-15
    • 2015-01-21
    • 1970-01-01
    • 1970-01-01
    • 2020-09-27
    相关资源
    最近更新 更多