0

错误发生在行 if data[l][0] == value:

def binary_pairs(data, value):
    l = 0
    h = len(data) - 1
    while l < h and data[l]!= value:
        m = (h + l) // 2
        if data[m][0] == value:
            l = m
        elif data[m][0] < value:
            l = m + 1
        else:
            h = m - 1
    print("done")
    if data[l][0] == value:
        return l
    else:
        return -1

示例输入: [ [ "dead", ["brian.txt","grail.txt"] ], [ "eunt", ["brian.txt"] ], [ "spank", ["grail.txt"] ] ]

4

2 回答 2

1

我可以看到您的代码存在两个潜在问题:

  • 在比较中同时使用data[l]和使用两者似乎很奇怪。data[l][0]

  • 例如,如果l==0h==1最终选择了else( h = m - 1),那么你最终会得到h==-1,这是超出范围的。可能还有其他类似的问题。

于 2013-09-15T18:26:56.080 回答
0

我现在无法运行您的代码,但这里有一些想法。

  • 如果您尝试解决问题,而不是尝试学习编写二进制搜索,请考虑使用 Python 的bisect模块。

http://docs.python.org/2/library/bisect.html

  • 遵循称为 PEP 8 的编码标准是 Python 中的最佳实践;这建议不要使用小写 L 作为变量名,或使用大写 I。

http://www.python.org/dev/peps/pep-0008/

  • 让循环在找到值时立即返回索引会更干净,而不是在顶部进行循环测试以确保尚未找到值,从而导致循环结束然后将值变为从函数底部返回。如果循环结束,您可以-1在函数结束时返回。

  • 您的循环检查索引是否< h为 I ,但不检查索引是否为 I >= 0。我怀疑这可能是你的问题。

  • 在调试这样的循环时,添加打印语句来记录正在发生的事情通常很有帮助。您应该打印索引的值,并打印足够多的其他行以了解它是增加还是减少,以及增加了多少。

于 2013-09-15T18:45:04.537 回答