設計randompool結構

Mr_Zhang_Zhen發表於2020-11-05

在這裡插入圖片描述
雜湊表是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,所以可以讓其亂序,只要保證其不產生 洞)

這種思路很重要:不想產生洞,那麼就拿最後一個位置上的數 往上填!

相關文章