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