簡體   English   中英

創建部分排序的數組

[英]Create a Partially Sorted Array

我正在通過Sedgewick和Wayne的算法,第4版進行研究。 (這不是家庭作業。)

練習(2.1.37)之一是編寫一個客戶端,該客戶端生成部分排序的數組,所有條目均位於其最終位置的10個位置內。

我的進度如下:

如果我們要將數字0到N放置在數組[a[0], a[1], ... a[N]],那么我們首先將0放置在0到10(包括0和10)之間的隨機索引中。 然后,我們將1放置在0到11之間的隨機空閑索引中,以此類推,將11放置在1到21之間的空閑索引中,依此類推。很顯然,直到N-10,所有條目都將至少具有一個空閑位置可以屬於。但是,我看不出這是否適用於最后10個條目,因為假設所有可用位置都可能被以前的數字填滿。

我的推理正確嗎? 我的算法有效嗎,但我無法證明它是否失敗? 如果失敗,正確的方法是什么?

您是對的-它可能無法正常工作。

有幾種方法可以解決此問題,但是我要嘗試的第一件事是修改Fisher-Yates shuffle ,例如

int[] fuzzyRange(int size, int fuzz, Random rng) {
    int[] arr = IntStream.range(0, size).toArray();
    for (int i = 0; i < size; i++) {
        // Normal Fisher-Yates would pick a random index in [i, arr.length) for
        // swapping. This instead picks a random index in [i, i+fuzz] where both
        // swapped elements stay within fuzz of their starting indices.
        int j = i, n = 1;
        for (int k = i + 1; k < arr.length && k < i + fuzz; k++) {
                if (k - fuzz <= arr[i] && arr[i] <= k + fuzz &&
                    i - fuzz <= arr[k] && arr[k] <= i + fuzz &&
                    rng.nextInt(++n) == 0) {
                    j = k;
                }
        }
        if (i != j) {
            int tmp = arr[i];
            arr[i] = arr[j];
            arr[j] = tmp;
        }
    }
    return arr;
}

(未經測試)。 不過,我不確定這是否會以相等的概率產生所有法律錯誤。

暫無
暫無

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

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