[英]Big O of get largest Numbers
最近有這個問題:
編寫一個函數,它接受一個數組數組(每個數組包含從最大到最小排序的數字)和一個數字(n)。 返回n個最大的數字。
例如:
findLargest([[10,5,3,1],[9,8,7,6],[11,2,1,0]],5)=> [11,10,9,8,7]
findLargest([[15,5,3,1],[10,8,7,6]],3)=> [15,10,8]
這樣做不需要復制或修改數組(只需從中讀取)。 優化時間復雜度。
我想出了這個,但對我的解決方案並不滿意:
function findLargest(numberArrays, n ) {
var results = [];
var pointers = [];
for (var x = 0; x < numberArrays.length; x++) {
pointers.push(0);
}
while (results.length < n) {
var subMaxes = [];
for (var i = 0; i < pointers.length; i++) {
var point = pointers[i];
subMaxes.push(numberArrays[i][point]);
}
var max = Math.max.apply(null, subMaxes);
var indexOfMax = subMaxes.indexOf(max);
pointers[indexOfMax]++;
results.push(max);
}
return results;
}
我認為它是O(n ^ 2)....無論如何在O(n)中做到這一點?
問題可以形式化(並稍微調整)為, Given a 2D array of dimension nxn, where each row is sorted in a decreasing order, find the largest k elements
對於最大的n
元素,時間復雜度將為O(nlogn)
。 k
最大元素的過程解釋如下:
從每一行構建第一個元素的最大堆:時間復雜度為O(n)
從堆中提取最大元素,並從提取元素所屬的行中將一個元素插入到堆中。 時間復雜度為O(logn)
提取所需數量的元素下的重復。
因此,提取最大數量的迭代需要O(logn)時間,並具有預處理O(n)成本。
為了提取k
元素,上述算法的時間復雜度為O(klogn)
將所有數組合並為單個數組。 這需要O(n)時間。
使用中位數算法算法在新數組中找到第k個最大元素。 准時。
遍歷數組並獲取大於或等於該元素的所有元素。 這需要O(n)時間。
該算法在O(n)時間內運行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.