簡體   English   中英

使用“錦標賽”(Java)從數組中獲取最大n個數字

[英]Get greatest n numbers from an array using a “tournament” (Java)

我有一個長度為10的數組:

Population = {1,3,4,2,7,-2,0,8,9,5}.

我生成兩個0-9之間的隨機數(例如4和6)。 因此,然后檢查第4個和第6個元素(7、0),“優勝者”的數字更大。 因此,有7位進入了獲勝者名單(總共5位獲勝者):

Winners = {7, ...}

每次我想將剩下的兩個數字(包括失敗者)配對,並將勝利者放入勝利者數組中。

最簡單的方法是使用大小為n的非固定大小的數組,然后從“人口”中刪除贏家並將其放入“贏家”中。 然后,我可以生成介於1和n-1之間的兩個隨機數,然后繼續執行該過程。

如何在Java中使用固定大小的數組來做到這一點? 如何從數組中選擇兩個數字,而忽略任何“贏家”數字?

如果要使用固定大小的數組,則每次選擇獲勝者(讓我說ith position )時,都必須遍歷該數組,並將索引為j=i+1所有元素移至j ,然后生成0 to n=n-1之間的下一個隨機數0 to n=n-1

盡管我建議在這里使用的簡單數據結構是ArrayList 您可以從中動態刪除元素,並使用其size()作為上限來計算隨機數。

您可以確定獲勝者,然后將其交換到數組的后面:

int[] population = {1,3,4,2,7,-2,0,8,9,5};
private void turnament() {
    for (int i = population.length - 1; i >= population.length / 2; i--) {
        //you might want to make sure m != n.
        int m = (int) Math.round(Math.random() * i);
        int n = (int) Math.round(Math.random() * i);
        int temp = population[i];
        if (population[m] > population[n]) {
            population[i] = population[m];
            population[m] = temp;
        } else {
            population[i] = population[n];
            population[n] = temp;
        }
    }
}

這將進行population.length / 2長度population.length / 2比賽並將獲勝者寫在后面,所以最后一個元素將是第一個獲勝者,第二個是第二個獲勝者,依此類推。

或就像@Aniket Thakur提到的那樣, ArrayList將是一個很好的數據結構。

保持索引指向贏家數組的開始位置(假設您重復使用該數組)。 最初是n。 然后使用Random.nextInt(startOfWinners)獲得2個隨機數,將獲勝者替換為n-1並進行迭代。

使用標准數組,您可以實現一種隨機隊列。

基本上,您的隊列是填充數組; 當你選擇兩個對手,就設置其索引null和移動null在陣列的S端,而遞減可用大小。 一些偽代碼來闡明:

1 population = [...]
2 winners = [all null here, size probably half of population.length + 1]
3 size = popoluation.length
4 opponents = nextTwoRandoms(size)
5 population[opponents.0] = null
6 population[opponents.1] = null
7 winners = addWinnerBetween(opponents)
8 population = moveNullAtTheEnd(population)
9 size = size - 2
10 repeat from step#4 until satisfied

暫無
暫無

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

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