簡體   English   中英

得到最大數字的大O.

[英]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)

  1. 將所有數組合並為單個數組。 這需要O(n)時間。

  2. 使用中位數算法算法在新數組中找到第k個最大元素。 准時。

  3. 遍歷數組並獲取大於或等於該元素的所有元素。 這需要O(n)時間。

該算法在O(n)時間內運行。

暫無
暫無

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

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