假設我們要選擇的{1,2,...,n}
隨機排列,但元素i
正面的概率p(i)
,而i
是置換爲p(i)
第一要素的概率,然後如果i
被選擇作爲第一個元素,那麼置換中的第二個元素是j
的概率是p(j)/(1 - p(i))
,等等,其中在給定位置選擇元素m
的概率總是與p(m)
成比例。什麼是生成隨機置換的有效方法?天真地,我們可以在計算p(i)
的累積和之後選擇O(log n)
時間的第一個元素,但是如果所選擇的元素在列表的中間附近,則更新概率的累積和需要O(n)
時間,導致O(n^2)
算法。的元素選擇一個隨機排列配重塊
我想過了,如果所有的p(i)
成正比1/n
(有界常數因子內),那麼我們可以通過允許重複一會兒預期O(n log n)
時間(僅僅重繪如果獲得一個重複的),直到迄今選擇的元素的概率總和超過1/2。然後刪除所有選定的元素並更新其餘未選定元素的累積和p(i)
。但是,如果元素的概率不合理並且非常傾斜,則這不起作用,如1/2,1/4,1/8...
。但後來我想,如果我們在計算累計和之前按照p(i)
增加i
,並且遵循類似的策略,並且當所選元素的總和超過當前集中的p(i)
之和的一部分時然後更新從最大的p(i)
開始的累積和,並且向後去除選擇的元素並更新p(i)
的累積和,直到未被選擇的元素的總和爲p(i)
高於未被去除的元素的累積總和的一部分。這個或另一個策略是否給出了預期的O(n log n)
時間?有人可以填寫細節嗎?
謝謝!這個數據結構在一些非常小的附加細節中,使用排列中的每個元素僅調用一次rand()調用,就可以通過最優的調用「n(n log n)」來確定性的'O(n log n)'時間,甚至使用期望的'O(n)'rand()調用比預期的'O(n log n)'更好。 – user2566092