【问题标题】:Worst case time complexity to search an element in a closely sorted array of elements?在排列紧密的元素数组中搜索元素的最坏情况时间复杂度?
【发布时间】:2016-12-05 15:56:14
【问题描述】:

这是在我的采访中被问到的,这里问题的实际含义是找到已经按排序顺序排列的元素数组的时间复杂度,或者特别是最坏情况下的时间复杂度。

这里要注意的主要一点是数组中相邻的两个数字之间的差异非常小或不显着。

我将这个问题作为一个简单的二进制搜索来解决,它要求数组按排序顺序并认为最坏情况的时间复杂度是O(log n)。但是如果问题中提到的数组元素彼此非常接近,这个答案会改变吗?

解决这个问题的正确方法是什么。

根据问题我们可以假设数组如下图。

这绝对不是我要问的问题,因为元素之间的差异略有不同,我们可以使用二进制搜索。

【问题讨论】:

  • 您是在问包含所有元素的排序数组与包含大部分元素的排序数组之间是否存在差异?
  • 我在问,当所有元素彼此非常接近时,是否可以在搜索中改进最坏的情况
  • 数组元素是否像示例中的那样在小范围内连续整数?从不使用字符串或复杂对象?
  • @Joni 是的,整数之间的差异非常小
  • @trincot 我认为数组已排序

标签: arrays algorithm sorting search binary-search


【解决方案1】:

在正常的二分查找中,每次你必须将剩余的数组分成两半并检查右半部分的中位数,BUT如果你知道元素非常接近,你可以添加一个简单的检查程序:

代替:

  1. 检查中位数
  2. 如果中位数更大:向左走
  3. 如果中位数较小,则往右走
  4. 否则返回中位数
  5. 重复

您可以将 2 和 3 修改为:按 abs(median - searched_number) 向右/向左移动这应该会缩短您的平均案例时间复杂度,但不确定如何衡量它

【讨论】:

  • 如果我们在 2-s 的数组中搜索“1”:[2, 2, 2, 2, 2, 2, 2]。我认为在这种情况下,您的算法的复杂性将是线性的。所以这比经典的二分搜索更糟糕
【解决方案2】:

O(log n) 二进制搜索复杂度不会改变,即使所有元素都相等(或“彼此非常接近”),只要数组已排序。也许我们可以通过利用数组值分布和使用插值搜索来提高性能https://en.wikipedia.org/wiki/Interpolation_search 但如果实施不当,插值搜索可能会导致O(n) 复杂度

【讨论】:

    【解决方案3】:

    如果数组显示出几乎线性的斜率,这意味着 2 个连续元素之间的差异在整个数组中几乎是恒定的,您可以使用线性插值来猜测可以存储值的索引:

    这是一个 JavaScript 实现,但没有太多特定的语法。应该清楚发生了什么:

    function search(arr, val) {
        var low, high, guess;
        low = 0;
        high = arr.length-1;
        while (low <= high && val >= arr[low] && val <= arr[high]) {
            // Use linear interpolation to make guess for index:
            guess = Math.round(low + (high - low) * (val - arr[low]) / (arr[high] - arr[low]));
            if (arr[guess] == val) return guess;
            console.log('Tried index ' + guess + '. No match yet for ' + val);
            if (arr[guess] < val) {
                low = guess + 1;
            } else {
                high = guess - 1;
            }
        }
        return -1; // not found
    }
    
    
    var arr = [1, 2, 3, 4, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 16];
    index = search(arr, 7);
    console.log('Search result: index ' + index);

    当数组完全线性时,算法将在第一次猜测时找到元素,因此在 O(1) 时间内。根据间隔中存在多少偏差,时间将介于 O(1)O(long n) 之间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-29
      • 1970-01-01
      • 1970-01-01
      • 2012-01-12
      • 1970-01-01
      相关资源
      最近更新 更多