設計randompool結構
雜湊表是get每一個key的value,而本題沒有value,只有key
我們準備兩張雜湊表,以及一個變數 :size。
一個表存放某 key 的標號,另一個表根據根據標號取某個key
如下圖所示:
A是第0個進來的
B是第二個進來的
我們現在先忽略remove行為 。
就這樣一直加到25
此時size為26
現在使用者讓我隨機等概率返回一個數,怎麼做?
因為我有size,我可以用math.random函式隨機出0-25中的等概率的一個,隨機出來的是哪個數字,在map2裡面把哪個數字的字串返回
一言以蔽之:用map1來確定size,確定size後,用math.random 來確定map2中返回哪個字串!
比如,如果返回的是25,那麼返回z
程式碼 如下:
math.random產生0-1之間double型別的數!
乘以size後,得到0-size之間的某個隨機數
如果加了remove行為
比如現在加了很多數!
現在使用者要求remove一些key
假設我們remove掉map1和map2 中的17
這樣就會在兩個map 0-999 這個區間產生了一個洞,
如果刪掉20,那麼又產生了一個洞
如果產生的洞非常多了,接下來使用者讓我們get random時候,比如要查17,會發現查不到紀錄
如果使用者刪了999個,只有1個index上有東西,產生了999個洞,那我get random 給使用者random的話,會非常的慢,肯定不會是O(1)
解決辦法:
若此時size 是1000,要刪掉17,
我們把最後一條去填補到17那個洞上,然後刪掉最後一條,然後size-1
有人說 會把順序打亂,但是map裡面本身就是無序的!所以不存在打亂一說。
(我們維持序的目的,就是為了random,所以可以讓其亂序,只要保證其不產生 洞)
這種思路很重要:不想產生洞,那麼就拿最後一個位置上的數 往上填!
相關文章
- 結構型設計模式設計模式
- RecyclerView的基本設計結構View
- Java基本程式設計結構Java程式設計
- DDD設計模式結構圖設計模式
- Bytom設計結構解讀
- 如何設計SKU表結構
- 選擇結構程式設計程式設計
- 迴圈結構程式設計程式設計
- (Java)設計模式:結構型Java設計模式
- 【乾貨】遊戲介面設計 (二)結構設計遊戲
- PDM系統的結構設計
- 【RocketMQ】RocketMQ儲存結構設計MQ
- 1.3順序結構程式設計程式設計
- 【Java】設計模式--結構型模式Java設計模式
- 聊一聊設計模式(三)-- 結構型設計模式設計模式
- JavaScript資料結構之連結串列--設計JavaScript資料結構
- 設計模式之代理模式(結構型)設計模式
- 小程式的專案結構設計
- 軟體設計師:資料結構資料結構
- 概念結構設計(E-R圖)
- 大話 PHP 設計模式--結構型PHP設計模式
- JAVA的基本程式設計結構(下)Java程式設計
- 玩法設計的結構化分析思路
- 3.迴圈結構程式設計程式設計
- 物件導向-設計模式-結構型物件設計模式
- Angular應用架構設計-5:設計原則與總結Angular應用架構
- SaaS架構:應用服務、應用結構設計架構
- HBase的表結構你設計得不對!
- LevelDB系統結構與設計思路分析
- [20180309]不好的資料結構設計.txt資料結構
- Altair SimSolid快速設計迭代的結構分析AISolid
- 複雜的資料結構設計求解?資料結構
- 理解 Golang 的 map 資料結構設計Golang資料結構
- Java 程式設計技巧之資料結構Java程式設計資料結構
- 結構化程式設計--學習筆記程式設計筆記
- 迴圈結構程式設計之習題程式設計
- 選擇結構程式設計之習題程式設計
- Tekla Structures 2022,鋼結構詳圖設計Struct