簡體   English   中英

獲取數組中最大3個元素的最有效方法

[英]Most efficient way to get the largest 3 elements of an array

我得到了一個元素數組和一個內置函數,該函數可以一次對5個元素進行排序。 如何僅使用此函數來獲取數組的最大3個元素,且對該函數的調用次數最少?

我嘗試過的方法是將數組分成5組,將函數應用於每個組,並將函數應用於從每個組獲得的最大值。

當最高和次最高的碰巧出現在同一組中時,此方法將失敗。 有沒有更好的方法可以做到這一點?

由於您具有對五個元素進行排序的內置方法,因此我建議:對數組中的前五個元素進行排序。 重復丟棄五個中最小的兩個,並用數組中另外兩個元素(尚未考慮的兩個元素)替換,然后再次對五個排序。 最后采取五個中最大的三個。

可能會比我所概述的做得更好。 假設您有25個元素。 對於每5個一組,找到三個最大的組。 然后在nos之間。 從每組1個中找到三個最大的。 否也一樣。 每組2個,第2個。 3.現在我們可以推斷出三個最大的總數將在三個最大的否定之中。 1,兩個最大的號碼。 2和最大單號。 3,是六個元素,而不是9。因此,在對內置方法的另外兩個調用中,而不是三個調用中,我們可以找到三個最大的元素。 但是,將思想推廣到原始數組的任何大小都會很復雜。

這個方法怎么樣。

  1. 將數組分成5組
  2. 將提供的排序方法應用於每組5個元素
  3. 從每個數組中獲取前3個元素
  4. 然后將每組中確定的3個元素合並為一個數組
  5. 現在從步驟1到4重復,直到最終數組的大小小於或等於5
  6. 從最終數組中獲取前3個元素
#include <iostream>


void sortThree(int res[3]) {
   for(int j = 0; j < 2; j++) {
      if(res[j] > res[j+1])
         std::swap(res[j], res[j+1]);
}
   if(res[0] > res[1]) std::swap(res[0], res[1]); // second pass
}

bool lsearch(int src[], int n, int k) {
  for(int i = 0; i < n; i++) {
    if(src[i] == k) return true;
  }
  return false;
}

void getThreeLargest(int arr[], int n, int res[3]) {
  res[0] = arr[0];
  res[1] = arr[1];
  res[2] = arr[2];
  sortThree(res);
  for(int i = 3; i < n; i++) {
    // if no repetition wanted
    // if(arr[i] > res[0] && !lsearch(res, 3, arr[i])) {
    if(arr[i] > res[0]) {
      res[0] = arr[i];
      sortThree(res);
    }
  }
}

int main(int argc, char *argv[])
{
  int arr[] = {91,21,3,-4,5,2,1,90,9,11};
  int res[3];
  getThreeLargest(arr, 10, res);
  for(int i = 0; i < 3; i++)
    std::cout << res[i] << '\n';
  return 0;
}

這里非常簡單的解決方案以C方式實現。 您可以輕松地將其轉換為Java。 掃描陣列為O(n)。 由於要排序和搜索的小數組只有3個元素,因此我們可以輕松地使用線性搜索來避免重復,排序僅需進行2個比較。 仍然是O(n)。

#include<stdio.h>
#include<limits.h>

int retmax(int *a,int n,int exc){

    int max = INT_MIN;
    for(int i=0;i<n;i++){
        if(a[i] > max && a[i] < exc)
           max = a[i];
    }

    return max;
}

int main(){

    int a[]={32,54,12,43,98,45,87};
    int size = sizeof(a)/sizeof(a[0]);

    int x = retmax(a,size,INT_MAX);
    int y = retmax(a,size,x);
    int z = retmax(a,size,y);

    printf("%d %d %d",x,y,z);
}

一個簡單的O(n)解決方案。

暫無
暫無

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

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