4 11 隨機節點

2021-10-04 19:26:37 字數 1809 閱讀 8735

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...