【问题标题】:Interpolation search on strings字符串的插值搜索
【发布时间】:2011-04-09 08:45:16
【问题描述】:

对于那些不熟悉插值搜索的人来说,这是一种在排序数组中搜索值的方法,它可能比二分搜索更快。您查看第一个和最后一个元素并(假设数组的内容是均匀分布的)线性插值以预测位置。

例如:我们有一个长度为 100 的数组,其中 array[0]=0 和 array[99]=99。如果我们要找 80,直接尝试 array[80] over array[50] 很直观,如果数组接近均匀分布,则预期运行时间减少到log(log(N))

对于数字,要检查的位置由以下等式定义: low + ((toFind - sortedArray[low]) * (high - low + 1)) / (sortedArray[high] - sortedArray[low]).

用于展示插值搜索的直观特性的一个常见示例是:想象在字典中查找“黄色”一词。您不会使用二进制搜索并转到中途点。相反,您会去预期的位置。

人类可以自然地线性插入字符串,但我不知道如何编码。 我们如何线性插值字符串?

【问题讨论】:

    标签: arrays string search interpolation sorted


    【解决方案1】:

    要找到两个字符串之间的“距离”,一个简单的方法是查看它们之间不同的第一个字母,并为每个字母分配一个数值,然后取其差。

    例如,如果每个字母的值等于其在字母表中的位置,则从“a”到“y”的距离将为 24,从“y”到“z”的距离将为 1。

    一个更好的执行方法是通过字典来衡量各种字母在实际单词中的常见程度。

    另一种改进是查看两个字符 - 例如,“aa”与“bz”的距离比“az”与“ba”的距离更远。超过两个字符不会给你带来太多好处。

    这种方法不受欢迎的原因是它使二分搜索算法复杂化,但收益并不大。如果你有时间,你甚至可能会发现标准的二分搜索更快;您在确定距离的复杂性中损失的比较少。

    还请注意,此算法的最坏情况性能比二分查找差。例如,考虑在“aa”、“ab”、“ac”、“ad”、“ae”、“zz”的列表中搜索“ae”——离群值“zz”将使搜索产生偏差,使其总是尝试搜索范围的开头。在这些条件下,它会降级到 O(n)。

    【讨论】:

    • 额外的复杂度是 2 mult/div + 5 add/sub。我已经测试过了,是的,它比二分查找慢一点(如果 N 不荒谬的话)。但如果比较不重要(如字符串的情况),那么它可能变得值得。
    • @user108088,复杂性还在于距离计算,这在字符串的情况下也很重要。查看我的编辑。
    • 如果我们使用前2个字母进行距离计算,例如dist = (word[0]
    • @user108088,距离计算首先需要跳过每个字符串中的相同字符,除非一旦单词变得足够接近,就降级为中点计算。您还需要考虑大小写转换等问题。我仍然建议进行时间比较。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-27
    • 2017-09-09
    相关资源
    最近更新 更多