Redian新闻
>
松鼠吃的那种坚果能吃吗?
avatar
松鼠吃的那种坚果能吃吗?# pets - 心有所宠
r*e
1
如何随机找二叉树中的任意节点? 谢谢!
avatar
B*u
2
核心提示:美国《外交政策》预测2025年时,99座新城市有望跻身全世界最大600座城市
行列,其中72座来自中国。
由于欧美增长势头脆弱,世界经济均势正通过城市化进程以前所未有的速度和规模
由西方向东方转移。2025年最具活力城市排名榜出炉,其中40%的城市同属一个国家—
——中国。
从福州到武汉,许多是你闻所未闻的城市,但它们都是中国将引导21世纪城市革命
的见证。尽管到2025年时西方并未完全黯然失色———13座美国城市和仅3座欧洲城市
入围,但太阳的确正在西沉。
avatar
p*m
3
树上掉下来那种坚果,总看松鼠在吃,不知道能不能吃啊
avatar
K*n
4
这个……如果没有其他信息只能深度优先广度优先了。就得O(n)了……

【在 r*****e 的大作中提到】
: 如何随机找二叉树中的任意节点? 谢谢!
avatar
r*3
5
我朝人口基数在那,不管干啥必须是规模第一的,春游人口流动也好农村人口城市化也好
avatar
l*t
6
你可以尝尝,我尝过,味道有点苦
avatar
g*y
7
是给一个值找一个节点,还是说随机返回二叉树中的一个节点?

【在 r*****e 的大作中提到】
: 如何随机找二叉树中的任意节点? 谢谢!
avatar
G*e
8
我也就觉得我自己比较奇怪去尝那个,没想到还有别人也好奇这个。。。。
苦的。。。不好吃。至少咱跟松鼠的品位不同。。。
avatar
r*e
9
随机返回一个树中的节点
TreeNode* get_random_node(TreeNode* root);

【在 g****y 的大作中提到】
: 是给一个值找一个节点,还是说随机返回二叉树中的一个节点?
avatar
i*i
10
橡子,涩的一塌糊涂

【在 p******m 的大作中提到】
: 树上掉下来那种坚果,总看松鼠在吃,不知道能不能吃啊
avatar
b*m
11
要求概率完全平均吗?时间上有要求吗?

【在 r*****e 的大作中提到】
: 随机返回一个树中的节点
: TreeNode* get_random_node(TreeNode* root);

avatar
f*n
12
恩,我以前被松鼠掉下来的核桃砸过,然后就很开心的每到季节就去捡核桃了~比超市
卖的小,但是香很多,甜而且不涩
avatar
g*y
13
那就traversal 所有的节点,然后用reservior sampling

【在 r*****e 的大作中提到】
: 随机返回一个树中的节点
: TreeNode* get_random_node(TreeNode* root);

avatar
a*e
14
品味独特的是大有人在啊:)有没有就好这口的。

【在 G********e 的大作中提到】
: 我也就觉得我自己比较奇怪去尝那个,没想到还有别人也好奇这个。。。。
: 苦的。。。不好吃。至少咱跟松鼠的品位不同。。。

avatar
r*e
15
概率平均, 时间上没有

【在 b***m 的大作中提到】
: 要求概率完全平均吗?时间上有要求吗?
avatar
c*3
16
想当年我们的祖先还在和他们抢着吃呢 嘿嘿嘿。。。。:)
avatar
p*2
17

这样应该就可以了吧?

【在 g****y 的大作中提到】
: 那就traversal 所有的节点,然后用reservior sampling
avatar
d*a
18
咱挖坑必须专业,啥叫坚果啊,有个名没有,没名也得有图啊。
avatar
b*m
19

这个,可以把所有node展开存到数组里吧,然后调用随机数。这个问题问得很含糊啊!

【在 r*****e 的大作中提到】
: 概率平均, 时间上没有
avatar
l*a
20
放啥数组,任意order traverse,每个按照1/k的概率决定用当前还是原来的。

【在 b***m 的大作中提到】
:
: 这个,可以把所有node展开存到数组里吧,然后调用随机数。这个问题问得很含糊啊!

avatar
b*m
21

说详细些?

【在 l*****a 的大作中提到】
: 放啥数组,任意order traverse,每个按照1/k的概率决定用当前还是原来的。
avatar
l*a
22
k=1;
for each node
{
1/K的可能性使用当前node,
1-1/K的可能性使用上次的结果
k++;
}

【在 b***m 的大作中提到】
:
: 说详细些?

avatar
r*e
23
写了一个。弱问一句,初始ret的时候有些糊涂。一定要遍历的第一个?
TreeNode* get_random_node(TreeNode* root){
srand(time(NULL));
InOrderNextIterator it(root);
int cnt = 0;
int j = 0;
TreeNode* ret = root;//or一定要遍历的第一个?也就是in-order的最小?
TreeNode* cur = NULL;
while(it.has_next()){
cur = it.next();
cnt++;
j = rand()%cnt;
if(0 == j)
ret = cur;
}
return ret;
}
avatar
l*b
24
噢,有道理呀,只要遍历树结构就无所谓了跟一个一个取是一样的

【在 l*****a 的大作中提到】
: 放啥数组,任意order traverse,每个按照1/k的概率决定用当前还是原来的。
avatar
b*m
25

俺愚钝呀,还是没看懂。

【在 l*******b 的大作中提到】
: 噢,有道理呀,只要遍历树结构就无所谓了跟一个一个取是一样的
avatar
p*2
27

InOrderNextIterator it(root);
你这是什么东西呢?

【在 r*****e 的大作中提到】
: 写了一个。弱问一句,初始ret的时候有些糊涂。一定要遍历的第一个?
: TreeNode* get_random_node(TreeNode* root){
: srand(time(NULL));
: InOrderNextIterator it(root);
: int cnt = 0;
: int j = 0;
: TreeNode* ret = root;//or一定要遍历的第一个?也就是in-order的最小?
: TreeNode* cur = NULL;
: while(it.has_next()){
: cur = it.next();

avatar
p*2
28

TreeNode ans=null;
int count=0;
Random rand=new Random();

void getRandNode(TreeNode root)
{
if(root==null) return;

count++;
if(rand.nextInt(count)==0)
ans=root;
getRandNode(root.left);
getRandNode(root.right);

}

【在 b***m 的大作中提到】
:
: 俺愚钝呀,还是没看懂。

avatar
w*x
29
这题不就是做烂了的那道google的无限输入流随机取数吗
avatar
b*m
30

我就是笨,没看懂你的思想。

【在 p*****2 的大作中提到】
:
: TreeNode ans=null;
: int count=0;
: Random rand=new Random();
:
: void getRandNode(TreeNode root)
: {
: if(root==null) return;
:
: count++;

avatar
l*a
31
这个写的很清楚了吧?
k=1;
for each node
{
1/K的可能性使用当前node,
1-1/K的可能性使用上次的结果
k++;
}

【在 b***m 的大作中提到】
:
: 我就是笨,没看懂你的思想。

avatar
b*m
32

不懂耶,我有够笨了吧。

【在 l*****a 的大作中提到】
: 这个写的很清楚了吧?
: k=1;
: for each node
: {
: 1/K的可能性使用当前node,
: 1-1/K的可能性使用上次的结果
: k++;
: }

avatar
b*m
34
能不能把你的思想写成函数?
avatar
b*m
35

有些明白了。反正就是要把整个树都遍历一遍呗。对吧?

【在 p*****2 的大作中提到】
:
: TreeNode ans=null;
: int count=0;
: Random rand=new Random();
:
: void getRandNode(TreeNode root)
: {
: if(root==null) return;
:
: count++;

avatar
p*2
36

对。

【在 b***m 的大作中提到】
:
: 有些明白了。反正就是要把整个树都遍历一遍呗。对吧?

avatar
b*m
37
这个跟我想的不一样。为什么不能事先遍历一次树,把节点全部存在一个数组里,然后
随机取?否则岂不是每次都要遍历?
avatar
p*2
38

如果树很大,你没有内存建立你的数组咋办?

【在 b***m 的大作中提到】
: 这个跟我想的不一样。为什么不能事先遍历一次树,把节点全部存在一个数组里,然后
: 随机取?否则岂不是每次都要遍历?

avatar
b*m
39

了解。我以前的行业没有太大数据量,讲究的是空间换时间。所有常用的浮点数运算我
们都做成大表一次性load到内存里,需要计算的时候到表里查。

【在 p*****2 的大作中提到】
:
: 如果树很大,你没有内存建立你的数组咋办?

avatar
Y*f
40
这个最好是能在节点中存子树的节点数吧,如果是平衡树的话随机查找/插入/删除都是
logN

【在 r*****e 的大作中提到】
: 如何随机找二叉树中的任意节点? 谢谢!
avatar
d*g
41
练习一个
class RandomNodeGetterInBinaryTree
{
private static int totalNumNodesSoFar = 0;
private static TreeNode result = new TreeNode();

public TreeNode GetRandomNodeInBinaryTree(TreeNode root)
{
PreOrderTraverse(root);
return result;
}

private void PreOrderTraverse(TreeNode node)
{
if(node == null) return;

ReservoirSampling(node);
PreOrderTraverse(node.left);
PreOrderTraverse(node.right);
}

private void ReservoirSampling(TreeNode node)
{
++totalNumNodesSoFar;
Random random = new Random();
int j = random.nextInt(totalNumNodesSoFar)+1;
if(j <= 1)
{
result = node;
}
}
}
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。