我有一個巨大的整數鏈表(假設它的大小爲N,但N對我來說是未知的),並且想要從中獲得k個隨機值可能的時間/空間。用Fisher-Yates shuffle從鏈接列表中獲取k個隨機值
我認爲必須寫出一個從內到外的Fisher-Yates混洗的變體,它將在O(N)時間和O(k)額外空間中解決這個問題。
任何人都可以幫助我獲得統計正確的解決方案與指定的時間/空間範圍?
我覺得我當前的代碼是接近正確的解決方案:
public class Node
{
public int Data;
public Node Next;
// O(N) time, O(k) additional space
public int[] GetRandomData(int k)
{
var a = new int[k];
var rand = new Random();
int n = 0;
Node cur = this;
while (cur != null)
{
int r = rand.Next(0, n);
if (r < k)
{
a[r] = cur.Data;
}
cur = cur.Next;
}
if (n < k) throw new ArgumentException("k is bigger than N");
return a;
}
}
爲什麼不只是獲得[0..N-1]之間的k個不同的隨機值? – Shmoopy
[C#中的隨機列表](http://stackoverflow.com/questions/273313/randomize-a-listt-in-c-sharp) –
weston
這是一個鏈接列表,夥計們。 我想只用O(k)的額外空間來做到這一點。 – lonelyass