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