ize
size
size
值用來記錄包括當前節點及其左右子樹中所有節點的個數以此來保證每乙個節點被返回的概率相同。該返回隨機節點的的方法首先產生乙個範圍在[0,
size
)[0,size)
[0,siz
e)範圍之間的隨機數,siz
esize
size
為整棵樹的siz
esize
size
值,然後根據該隨機值所在的範圍繼續遞迴呼叫左右子樹或者返回當前節點。
實現**如下:
class
binarynode
intgetdata()
intgetsize()
binarynode*
find
(int d)
else
if(d < data)
else
if(d > data)
}void
insertinorder
(int d)
else
}else
if(d > data)
else
} size++;}
binarynode*
getrandomnode()
else
if(index == leftsize)
else}}
;
改進演算法認為在遞迴中不斷的生成隨機數是一筆很大的開銷。改進演算法在呼叫方法bin
aryn
ode∗
getr
ando
mnod
e(
)binarynode*\ getrandomnode()
binary
node
∗get
rand
omno
de()
時只生成一次隨機數。然後利用生成的該隨機數遞迴呼叫方法bin
aryn
ode∗
geti
thno
de(i
nti)
binarynode* \ getithnode(int\ i)
binary
node
∗get
ithn
ode(
inti
)。實現**如下:
class
binarytree
intsize()
binarynode*
getrandomnode()
void
insertinorder
(int value)
else}}
;class
binarynode
intgetdata()
intgetsize()
binarynode*
find
(int d)
else
if(d < data)
else
if(d > data)
}void
insertinorder
(int d)
else
}else
if(d > data)
else
} size++;}
binarynode*
getithnode
(int i)
else
if(i == leftsize)
else}}
;
382 鍊錶隨機節點
382.鍊錶隨機節點 給定乙個單鏈表,隨機選擇鍊錶的乙個節點,並返回相應的節點值。保證每個節點被選的概率一樣。高階 如果鍊錶十分大且長度未知,如何解決這個問題?你能否使用常數級空間複雜度實現?示例 初始化乙個單鏈表 1,2,3 listnode head new listnode 1 head.ne...
382 鍊錶隨機節點
原理參考 蓄水池抽樣 程式設計珠璣 讀書筆記 思路 以1 m的概率選擇第m個物件 思路 高階 如果鍊錶十分大且長度未知,如何解決這個問題?你能否使用常數級空間複雜度實現?class solution def init self,head listnode self.head head defgetr...
日常整理4 11
1 python中is和 的區別是什麼?is比較的是兩個物件的id值是否相等,也就是比較倆物件是否為同乙個例項物件,是否指向同乙個記憶體位址。比較的是兩個物件的內容是否相等 2 http協議與https協議有什麼區別?1 https協議需要到ca申請證書,一般免費證書較少,因而需要一定費用。2 ht...