【问题标题】:Constant search algorithm for uniformly distributed arrays?均匀分布数组的常量搜索算法?
【发布时间】:2020-08-15 03:50:55
【问题描述】:

我一直在寻找一个好的搜索算法,我遇到了插值搜索,它的时间复杂度为 O(log(log(n))),并且只能应用于均匀分布的数组。 但是,我发现可以创建一个需要相同条件但时间复杂度为 O(1) 的搜索算法。这是我想出的: (C++ 代码)

int search(double Find, double* Array, const int Size) {
    if (Array[0] == Array[1] && Find == Array[0]) { return 0; }
    if (Array[0] == Array[1] && Find != Array[0]) { return -1; }
    const double Index = (Find - Array[0]) / (Array[Size - 1] - Array[0]) * (Size - 1.0);
    if (Index < 0 || Index >= Size || Array[(int)(Index + 0.5)] != Find) { return -1; }
    return Index + 0.5; 
}

在这个函数中,我们传递要查找的数字、数组指针和数组的大小。 该函数返回要找到的数字所在的索引,如果没有找到,则返回-1。

解释: 好吧,没有任何图片来解释这个会很困难,我会尽力而为......

因为数组是均匀分布的,所以我们可以在一张图上表示它的所有值,以索引号(比如 x)为横坐标,数组中包含在这个索引处的值(比如 Arr[x])作为纵坐标。好吧,我们可以看到,图上表示的所有点都属于方程的函数:

Array[x] = tan(A) * x + Arr[0] -> 其中 A 为函数与图形 x 轴之间的夹角。

所以现在,我们可以将方程转换为:

x = (Arr[x] - Arr[0]) / tan(A)

就是这样,x 是要查找的与 Arr[x](要搜索的给定值)相关的索引。 我们可以将公式更改为 x = (Arr[x] - Array[0]) / (Array[Size - 1] - Array[0]) * (Size - 1.0) 因为我们知道 tan(A) = (Array[Size - 1] - Array[0]) / (Size - 1.0)。

问题(终于...)

我猜这个公式已经在一些程序中使用了,它很容易找到...... 所以我的问题是,为什么我们要使用插值搜索而不是这个?我是不是有些不明白?

感谢您的耐心和帮助。

【问题讨论】:

    标签: arrays algorithm search


    【解决方案1】:

    当谈到均匀分布时,这并不意味着一旦您知道排序数组中的第一个和最后一个值,您就也知道其他值。这就是您的算法所假设的。均匀分布与生成数组时所涉及的概率有关,但在按照这种均匀分布原则生成的实际数组中,您仍然可以得到看起来分布不那么均匀的数组。这是一个概率问题。平均而言,这些值会均匀分布,但这不是保证。

    其次,您的算法实际上是一种插值算法,不同之处在于它假定在第一次查找之后它必须已经到达值应该在的位置。然而,在随机生成的数组(均匀分布)中,这并不能保证,因此必须以较小的间隔重复该操作,直到该间隔接近一个索引。

    另见:

    【讨论】:

      猜你喜欢
      • 2020-10-08
      • 1970-01-01
      • 2012-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-28
      • 1970-01-01
      • 2011-04-04
      相关资源
      最近更新 更多