Leetcode: Random Pick with weight
alias method 算法流程总结:
import numpy as np
int k = len(probs)
q=np.zeros(K)
J=np.zeros(K,dtype=np.int)
for kk, prob in enumerate(self.probs):
self.q[kk] = prob* self.K
if self.q[kk] < 1.0:
self.smaller.append(kk)
else:
self.larger.append(kk)
while len(self.smaller)>0 and len(self.larger)>0:
small = self.smaller.pop()
large = self.larger.pop()
self.J[small] = large
self.q[large] = self.q[large] - (1-self.q[small])
if self.q[large] < 1.0:
self.smaller.append(large)
else:
self.larger.append(large)
def pickIndex(self):
sz = len(self.J)
kk = int(np.floor(np.random.rand())*sz)
if np.random.rand() < q[kk]:
return kk
else:
return J[kk]

京公网安备 11010502036488号