設計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,所以可以讓其亂序,只要保證其不產生 洞)
這種思路很重要:不想產生洞,那麼就拿最後一個位置上的數 往上填!
相關文章
- 設計模式-結構型設計模式
- 程式結構&&程式設計程式設計
- 結構型設計模式設計模式
- 【乾貨】遊戲介面設計 (二)結構設計遊戲
- JavaScript設計模式之結構型設計模式JavaScript設計模式
- 如何設計SKU表結構
- Java基本程式設計結構Java程式設計
- RecyclerView的基本設計結構View
- (Java)設計模式:結構型Java設計模式
- DDD設計模式結構圖設計模式
- 表結構設計討論
- 選擇結構程式設計程式設計
- 迴圈結構程式設計程式設計
- 【Java】設計模式--結構型模式Java設計模式
- PDM系統的結構設計
- 1.3順序結構程式設計程式設計
- 【RocketMQ】RocketMQ儲存結構設計MQ
- PHP結構型設計模式(下)PHP設計模式
- PHP結構型設計模式(上)PHP設計模式
- 【軟考】--結構化分析設計
- oracle表結構設計轉摘Oracle
- 聊一聊設計模式(三)-- 結構型設計模式設計模式
- JavaScript資料結構之連結串列--設計JavaScript資料結構
- JAVA的基本程式設計結構(下)Java程式設計
- 大話 PHP 設計模式--結構型PHP設計模式
- 物件導向-設計模式-結構型物件設計模式
- 設計模式之代理模式(結構型)設計模式
- 小程式的專案結構設計
- Bytom設計結構解讀
- 玩法設計的結構化分析思路
- 如何設計優雅的類結構
- 設計模式--代理模式Proxy(結構型)設計模式
- 淺談PHP程式碼設計結構PHP
- 使用設計模式改善程式結構(三)設計模式
- 使用設計模式改善程式結構(一)設計模式
- 概念結構設計(E-R圖)
- 軟體設計師:資料結構資料結構
- 3.迴圈結構程式設計程式設計