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