如何在O k 時間內等概率隨機生成乙個k個元素的不重複的1 n的自然數序列?

時間 2021-06-05 19:27:56

1樓:farter yang

問題好就好在指定了O(k)的"時間"【

搞個靜態的n元素原始排列在記憶體裡,每次就只用基操生成出k的序列拷出去,但是生成時記錄下每次選擇的是第幾個並在生成出答案之後,把原排列恢復回去,下次再用【【【【

n會變的話總時間複雜度是總呼叫次數無關,只跟最大的那乙個n有關【逃k小n巨大到記憶體裝不下的話【

我覺得布星.jpg【再逃

2樓:「已登出」

很好的問題!

假定乙個函式mrand(l,r)能O(1)真隨機地生成[l,r]的乙個數。

O(nlogn)方法示例:

執行mrand(1,n!)得到乙個數s,對s進行康托逆展開(O(nlogn)),取得到的陣列的前k位就是你想要的序列

O(klogk)方法示例:

對n手動分成k塊,每塊隨機出乙個數,將其與塊的編號繫結,之後同上乙個方法得到乙個編號陣列,然後把編號換成繫結的數,得到的序列就是你想要的序列

O(n)方法示例:

生成1~n序列a(n),i遍歷1~n,每次隨機交換a(mrand(1,i))(注意不是mrand(1,i-1))與a(i)。

這樣得到了新的a序列,取序列中前k個就是你想要的序列

O(k)方法示例:

用方法二進行分塊繫結並用方法三隨機交換。

注:當n不是k的整數倍時分塊不平均導致不等概率時,令s=n*k,對s進行分塊,分成k塊,得到的每乙個數除以n並四捨五入即可。

3樓:xtqqwq

若 ,則每次一直隨機直到隨機到乙個之前未出現過的數,由於期望 次就可以隨機到乙個為出現過的數,如果把雜湊表時間看成 ,時間即為 (實際上大於 的概率也是非常非常小的)

若 \frac n2" eeimg="1"/>,則直接隨機乙個長度為 的全排列,取前 位即可,複雜度也為

如何在短時間內開嗓?

微微 最好的我不知道,但我的方法可以分享一下。首先,運動下,不用太累,不用大範圍,差不多拉伸就行,有人幫忙可以讓他們幫你捶捶背啊什麼的。動作大概是這樣,右手抓右邊腳尖提起來,彎腰用左手碰左腳背,堅持幾秒,然後換方向做同樣動作。雙手握拳放胸前左右轉腰幾回合 打哈欠然後,練聲。找普通54321的音來練就...

如何在短時間內準備雅思?

已重置 寫作需要對一些主要的話題比較熟悉。需要參考一些好的寫作書,並背誦一些好的句子,切忌背誦全文,有時間的話至少每三天寫一篇文章,嘗試用推薦的高階詞彙,這樣到考場的時候,很多詞就自然而然的能用上。使用書本,劍3 8,聽力每一套題會拿乙個section拿來精聽,就是拿一張白紙,一句話一句話的聽寫。剛...

如何在最短的時間內把籃球練好?

Jose Hua 沒有好這個概念,從小看科比打球長大,從他的飛天遁地到背身單打美如畫!球場上每個位置都有每個位置對應的技術動作,內線的卡位 補籃 小勾手 外線的無球跑位 接球投籃 控位的把控運球 節奏把握 再加上一些獨特的身體於技術的結合。我只能說籃球永無止境,沒有任何人可以做到面面俱到。真正屬於無...