【发布时间】: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