簡體   English   中英

在一個密切排序的元素數組中搜索元素的最壞情況時間復雜度?

[英]Worst case time complexity to search an element in a closely sorted array of elements?

這在我的采訪中被問到,這里問題的實際意義是找到時間復雜度,或者特別是最壞情況時間復雜性的元素數組已經在排序順序中。

這里要注意的要點是陣列中兩個相鄰數字之間的差異非常小或無關緊要。

我把這個問題看作一個簡單的二進制搜索,它要求數組按順序排列,並認為最差情況時間復雜度為O(log n) 但如果問題中提到的數組元素彼此非常接近,這個答案是否會改變。

在此輸入圖像描述

解決這個問題的正確方法是什么?

根據這個問題我們可以假設數組如下圖所示。 在此輸入圖像描述

這絕對不是iam詢問下面顯示的內容,因為元素之間的區別很大,我們可以使用二進制搜索。

在此輸入圖像描述

只要數組被排序,即使所有元素都相等(或“彼此非常接近”), O(log n)二進制搜索復雜度也不會改變。 也許我們可以通過利用數組值分布和使用插值搜索來提高性能https://en.wikipedia.org/wiki/Interpolation_search但是如果實現不好插值搜索可能導致O(n)復雜性

如果數組顯示幾乎線性的斜率,意味着兩個連續元素之間的差異在整個數組中幾乎是恆定的,您可以使用線性插值來猜測可以存儲值的索引:

這是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(長n)之間

在正常的二進制搜索中,每次必須將剩余的數組拆分為兩半並檢查右半部分的中位數, 如果您知道元素非常接近,則可以對過程添加一個簡單的檢查:

代替:

  1. 檢查中位數
  2. 如果中位數更大:向左走
  3. 否則,如果中位數較小:向右走
  4. 否則返回中位數
  5. 重復

您可以將2和3修改為: 向右/向左按abs(median - searching_number)這會縮短您的平均案例時間復雜度,但不確定如何衡量它

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM