[英]Worst case time complexity to search an element in a closely sorted array of elements?
只要數組被排序,即使所有元素都相等(或“彼此非常接近”), 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)之間 。
在正常的二進制搜索中,每次必須將剩余的數組拆分為兩半並檢查右半部分的中位數, 但如果您知道元素非常接近,則可以對過程添加一個簡單的檢查:
代替:
您可以將2和3修改為: 向右/向左按abs(median - searching_number)這會縮短您的平均案例時間復雜度,但不確定如何衡量它
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.