摘要:但是這功能有要求我們必須保持內(nèi)容的有序,這樣我們才能通過隨機數(shù)的方法得到隨機的某個元素。取得隨機數(shù)的話,則是在當(dāng)前數(shù)組有效范圍內(nèi)取隨機數(shù)就行了。
Constant Time Random Picker
哈希表數(shù)組 復(fù)雜度設(shè)計一個數(shù)據(jù)結(jié)構(gòu),支持O(1)時間的查詢,增加,刪除,和得到其中隨機元素的操作,可以認(rèn)為其中的元素是數(shù)字。
時間 O(1) 空間 O(N)
思路要求O(1)時間查詢和刪除,則想到哈希表,其他的數(shù)據(jù)結(jié)構(gòu)都要遍歷一遍才行。但是getRandom這功能有要求我們必須保持內(nèi)容的有序,這樣我們才能通過隨機數(shù)的方法得到隨機的某個元素。這里我們可以用數(shù)組、鏈表或者樹保持有序,但是鏈表得到第n個元素要O(N)的時間,而樹也要logN時間,所以不適合,只有數(shù)組。用數(shù)組的技巧在于,數(shù)組只是保持一個順序,我們可以哈希表表示一個元素和其在數(shù)組中下標(biāo)的映射關(guān)系,保證我們的O(1)查詢。而對于刪除,我們需要維護一個length變量(用表的大小也行),然后每次刪除的時候把要刪的數(shù)和數(shù)組當(dāng)前標(biāo)記的“最后”一個元素交換,然后把大小減一,并更新哈希表。取得隨機數(shù)的話,則是在當(dāng)前數(shù)組有效范圍內(nèi)取隨機數(shù)就行了。
代碼public class RandomPicker { Random r; ArrayListarr; HashMap map; int length; public RandomPicker(){ this.r = new Random(); this.arr = new ArrayList<>(); this.map = new HashMap<>(); this.length = 0; } public void add(int key){ arr.add(length, key); map.put(key, length); length++; } public void delete(int key){ // 將要刪的數(shù)和最后一個交換 int idx = map.get(key); int tmp = arr.get(length - 1); arr.set(length - 1, key); arr.set(idx, tmp); // 更新元素和下標(biāo)的對應(yīng)關(guān)系 map.put(tmp, idx); length--; } public int getRandom(){ return arr.get(r.nextInt(length)); } }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/66175.html
摘要:基于切割多邊形實現(xiàn)思路初稿詳見多邊形等分依賴實現(xiàn)實現(xiàn)過程結(jié)果類泰森多邊形平分多邊形結(jié)果原始平面隨機點集合分組后組中心集合構(gòu)造泰森多邊形聚合類聚合聚合總量數(shù)據(jù)集合簇族數(shù)量中 基于K-means 切割多邊形 JAVA實現(xiàn) 思路初稿詳見多邊形等分 依賴 geotools ekmeans org.locationtech.jts jts-co...
摘要:默認(rèn)值為返回值,一個對象,包含了原生用戶原生項目真實評分預(yù)測評分可能對后面預(yù)測有用的一些其他的詳細(xì)信息在給定的測試集上測試算法,即估計給定測試集中的所有評分。 這里的格式并沒有做過多的處理,可參考于OneNote筆記鏈接 由于OneNote取消了單頁分享,如果需要請留下郵箱,我會郵件發(fā)送pdf版本,后續(xù)再解決這個問題 推薦算法庫surprise安裝 pip install surp...
摘要:隨機數(shù)張量提供了一些函數(shù),去幫助我們構(gòu)建隨機數(shù)張量。該值表示正態(tài)分布的均值。一個維的,或者一個數(shù)據(jù)類型是的值,該值表示正態(tài)分布的標(biāo)準(zhǔn)偏差。解釋這個函數(shù)返回一個隨機數(shù)序列,數(shù)組里面的值按照均勻分布,數(shù)據(jù)范圍是。 作者:chen_h微信號 & QQ:862251340微信公眾號:coderpai簡書地址:https://www.jianshu.com/p/d05... 計劃現(xiàn)將 tens...
摘要:實現(xiàn)先看實現(xiàn)之后的效果測試類運行輸出如下可以看到此時加了注解的和的運行時間被統(tǒng)計了,而沒加的未被統(tǒng)計在內(nèi)。思路修改,在之前的中返回一個,儲存方法名耗時的鍵值結(jié)構(gòu)。然后降序排序返回一個。最后遍歷根據(jù)百分比求得各個方法的并輸出相關(guān)信息。 最初目的 在學(xué)習(xí)Java的集合類時,有時候想要測試代碼塊的運行時間,以比較不同算法數(shù)據(jù)結(jié)構(gòu)之間的性能差異。最簡單的做法是在代碼塊的前后記錄時間戳,最后相減...
閱讀 2722·2021-11-11 17:21
閱讀 613·2021-09-23 11:22
閱讀 3578·2019-08-30 15:55
閱讀 1641·2019-08-29 17:15
閱讀 573·2019-08-29 16:38
閱讀 904·2019-08-26 11:54
閱讀 2504·2019-08-26 11:53
閱讀 2750·2019-08-26 10:31