題目:
設計一種結構,在該結構中有如下三個功能:
insert(key):將某個key加入到該結構,做到不重複加入。
delete(key):將原本在結構中的某個key移除。
getrandom(): 等概率隨機返回結構中的任何乙個key。
【要求】 insert、delete和getrandom方法的時間複雜度都是 o(1)
分析:這個結構一看感覺跟雜湊表的結構比較像,但是雜湊表是get這道題只用get key還有就是乙個雜湊表不能嚴格做到等概率 時間複雜度o(1)的返回key,因為當樣本量小的時候,資料做不到均勻分布,樣本量多了可以看成是均勻分布,但是等概率是不可能的。所以刪除有個技巧,會在**中體現。
public
static
class
pool
public
void
insert
(t key)}/*
* 刪除的時候,如果直接刪除key那麼在這個範圍上會缺乙個「洞」,當有1000個資料,刪除了999個
* 那麼在等概率獲取值的時候,生成的隨機不一定會直接到最後存在的那個資料。就需要在返回生成新的隨機數
* 所以需要在刪除這個地方有個技巧。在刪除當前值的時候。我們把最後的乙個值放在當前值的位置上,再remove最後乙個值,size--就行了
*/public
void
delete
(t key)
}//等概率的獲得key,需要可以使用隨機數,和已經標記的size。
public t getrandom()
int randomindex =
(int
)(math.
random()
*this
.size)
;// 0 ~ size -1
return
this
.integerkeymap.
get(randomindex);}
}
新人第一次寫部落格,想要記錄一下自己在學習過程中的收穫。希望大家多多關照 左神演算法筆記01
對數器異或工具 一些其它的位運算子的操作 簡單理解為 將乙個演算法的所有操作拆成基本操作 常數時間完成的操作 後,計算出操作次數和操作時間 可視為1 的乘積,即操作次數之和。在考慮最差情況時用o 來表示時間複雜度,取最高項來表示。如o n o logn 對n個數進行排列,則最差要進行1 2 3 n ...
左神演算法筆記03
可以是函式遞迴,也可以是迴圈實現。將大的陣列對半分為兩個陣列,每個陣列排好序後再合併為大的陣列。如果使用迴圈實現,要提防整形溢位 應用 最小和問題,若陣列的左邊的乙個數比右邊的某乙個數小,在返回結果加上自身的大小 public static intprocess int arr,int l,int ...
左神演算法整理筆記02
引例 利用查詢陣列最大值 思想步驟 public static void sortprocess int arr,int left,int right public static void merge int arr,int left,int mid,int right 當其中有乙個越界的時候 wh...