簡體   English   中英

使用復雜度為O(n)的唯一隨機數填充大小為n的Java數組

[英]fill an array in Java of size n with unique random numbers with complexity O(n)

我必須編寫代碼來填充大小為n的數組,其中包含0-10n (含)范圍內的唯一隨機數。 我可以用O(n^2)復雜度做到這一點,但我需要用O(n)復雜度來做。 我想不出一種不涉及生成隨機數的方法,然后返回部分填充的數組來檢查數組中是否有重復項。

作為參考,這是我的方法的O(n^2)版本:

private static void fillWithUniqueN2(int[] numbers) 
{
    Random rng = new Random();
    for (int i = 0; i < numbers.length; i++)
    {
        boolean added = false;
        while (!added)
        {
            int newNumber = rng.nextInt(numbers.length);
            boolean unique = true;

            for (int j = 0; j < i; j++)
            {
                if (newNumber == numbers[j])
                {
                    unique = false;
                }
            }

            if (unique)
            {
                numbers[i] = newNumber;
                added = true;
            }   
        }       
    }
}

用於在一定范圍內生成唯一隨機數的標准解決方案是:

  1. 生成范圍內所有數字的列表 - O(n)

  2. 洗牌清單 - O(n)

  3. 從列表中提取前N個項目 - O(1)或O(n)

因此整個操作將是O(n)。

要在O(n)中對整個列表進行洗牌,您可以使用Fisher-Yates shuffle

-- To shuffle an array a of n elements (indices 0..n-1):
for i from 0 to n−2 do
     j ← random integer such that i ≤ j < n
     exchange a[i] and a[j]

作為獎勵,它已經在Collections.shuffle() (文檔提到它在線性時間運行)。

package stackOverflow;

import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;


public class FisherYates
{
    public static void main(String[] args) {
        int n = 10;
        IntStream range = IntStream.rangeClosed(0, n * 10);
        List<Integer> integers = range.boxed().collect(Collectors.toList());
        Collections.shuffle(integers);
        System.out.println(integers.subList(0, n));
    }
}

例如,它輸出:

[28, 44, 26, 94, 21, 65, 55, 25, 99, 93]
[40, 57, 3, 42, 61, 26, 64, 45, 19, 41]
...

保留已輸入的一Set條目。 對於每個候選人,檢查Set是否已包含該條目。 如果沒有,將它添加到數組和Set (假設您的檢查沒有同時添加到Set ),否則生成一個新的候選。 重復每個候選人,直到成功,然后繼續到陣列中的下一個打開的插槽。

暫無
暫無

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

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