【问题标题】:What is the 'if key == arr[low]: return low' doing in Interpolation search?什么是 \'if key == arr[low]: return low\' 在插值搜索中做什么?
【发布时间】:2023-02-06 19:52:46
【问题描述】:

我在 Python 中看到了一些使用插值搜索的实现

if key == arr[low]:
    return low

在 while 循环之后,像这样:

def interpolation_search(arr, key):

    low = 0
    high = len(arr) - 1

    while arr[high] != arr[low] and arr[low] <= key <= arr[high]:
        mid = low + ((key - arr[low]) * (high - low) // (arr[high] - arr[low]))

        if key == arr[mid]:
            return mid
        elif key < arr[mid]:
            high = mid - 1
        else:
            low = mid + 1

    if key == arr[low]:
        return low

    return -1

那是做什么的?我已经对各种列表(均匀分布、不均匀等)进行了一系列测试,并搜索了列表中的每个项目,但无论该 if 语句是否存在,我都无法看到差异不是。

带有 if 语句的算法示例:https://www.techiedelight.com/interpolation-search/

没有 if 语句:https://www.baeldung.com/java-interpolation-search

我已经在 arr = range(200) 以及长度为 200 的排序数组上运行了代码,其中包含 0 - 1000 之间的随机整数,其中有一些重复项。 if 语句不会改变结果。

【问题讨论】:

  • 我猜 while 循环退出时会有异常输入,但没有找到合适的值。然后是最后一次检查,以查看搜索的值是否在数组的当前 low 索引上。如果没有,则根本找不到。
  • 尝试使用[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]key = 9
  • 看起来上面的算法有缺陷:[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]key = 0,它返回'0 not found'。除非这是有意为之。 (它也应该引发异常,而不是返回一个字符串。如果只是因为它通常返回一个整数;返回一个字符串会导致奇怪的异常进一步发生。所以在我看来,返回字符串也是有缺陷的。)
  • @9769953 非常感谢!我一直在寻找边缘案例,但我不知道要搜索什么。是的,现在这很有意义。干杯
  • 实际上,也许那个 if 语句是为了捕捉那个特定的情况?如果列表只包含一个值,则 while 循环将永远不会触发,但您仍然希望能够检查该项目是否在该列表中,以便您可以在返回 -1 之前进行快速检查。也许就是这样?

标签: python search interpolation


【解决方案1】:

while 循环下面的 if 语句可能会捕获输入数组仅包含相同值的情况,例如 [9, 9, 9, 9];甚至一个值,[9]。在这种情况下,永远不会进入 while 循环,并且 if 语句变得必要:

interpolation_search([9, 9, 9, 9], 9)

interpolation_search([9], 9)

都将进入 if 语句体。


旁注:

  • 当值不存在时,应该引发异常,而不是返回字符串。
    在找不到值时返回字符串值是一个糟糕的选择,在我看来,因为仍然有一个返回值,而且看起来函数运行成功。但是稍后,该值用作数组的索引时,会出现一个以该函数为根的异常,但该异常不会显示这一点。

  • 在 Python 中,您只需执行 arr.index(key),它会替换整个函数(并且可能会更优化)。可以说,你在这里拥有的是一个 C 风格的函数,它恰好是用 Python 编码的,但实际上不应该在 Python 中使用。此外,这忽略了更适合大型数组的 NumPy(虽然变量名称 arr 更能指示 NumPy 数组,而不是像 lstmy_list 之类的东西,后者往往指向 Python 列表).

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-07
    • 1970-01-01
    • 1970-01-01
    • 2020-09-23
    • 1970-01-01
    相关资源
    最近更新 更多