如何构造一棵并发二叉树?

vinoya 2009-07-08 09:24:26
给定一个图的邻接矩阵,每个节点代表一个主机,主机间可以进行通信,每条边的权值代表主机间通信的延迟,用矩阵的值表示。给定某一节点作为二叉树的根结点,即起始发消息的节点。
例如A指向B的边权值为5代表A发消息给B的延迟是5;不同的主机可以并发传递消息,例如二叉树中根A先后发消息给孩子节点B和C,B和C分别收到消息后可并发传递给自己的孩子结节点,每一层的花费的代价取决于该层中延迟最大的那个。
如何构造一棵二叉树,使得总延迟最小。
...全文
121 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
lilux 2009-07-15
  • 打赏
  • 举报
回复
带权图的最短路径问题?
gunsand 2009-07-13
  • 打赏
  • 举报
回复
兄弟你是干什么的呀?整天研究这种算法。为啥我做了6年互联网都没机会研究这个呢。
xxjjs 2009-07-09
  • 打赏
  • 举报
回复
自己纠正一下,第三步搞错了,没有那么复杂:

3. 设所有发送节点状态设为收发。如果有两个或以上就绪节点指向同一子节点,则仅保留权值最小的一对中的发送节点为首发,其余节点状态恢复为就绪,重复2-3
xxjjs 2009-07-09
  • 打赏
  • 举报
回复
看题意,应该不是二叉树吧,各可以并行发送,且要求总延迟最小,并没有限制一个结点只能给最多两个节点发送消息啊。
也就是说A发消息给B和C,在B和C发送消息的时候,A还可以给D发消息。
同时感觉这类题要求一个时间内一个节点只能发送一个消息,也就是说答案和顺序相关的

应该是多叉顺序树(自己起的名字)的问题

感觉上应该使用动态规划

首先将所有节点设置为三个状态:已收到消息(就绪),未收到消息(等待)和正在通讯中(收发)
从根节点A开始,设A为就绪节点,其他所有点为等待节点

1.我们寻找寻找权值最小的等待节点,假设B,发送消息,如果权值为N,则我们设下一检查点为N,此时A和B将同时变为就绪节点

2.在检查点,我们关心所有就绪和等待节点间的邻接矩阵,所有就绪节点寻找权值最小的等待节点为自己的子结点,插入到已有子节点的右边,并将zi节点状态设为收发。

3.如果有两个或以上就绪节点指向同一子节点,则各自在剩余等待节点中寻找权值次小的节点为备用节点,剔除备用目标节点权值最大的那个仍旧使用当前子节点,其余全部使用备用节点为自己的子节点,然后重复步骤3。

4.结束上述检查后,设所有就绪节点状态为收发,并将所有收发对权值从小到大排序M0,M1.....加上当前检查点N得到N0,N1,N2....设为检查点

5. 在下一检查点重复步骤2-4,注意此时得到的新检查点N0',N1'...等应该插入到原检查点队列中

6. 在某一检查点Nx时发现没有等待节点,则此时检查点队列中最大值Nmax就是所需总延迟值,生成的多叉树就是楼主所求的树


感觉是可行的,不过不知是不是最优解
vinoya 2009-07-08
  • 打赏
  • 举报
回复
没有人回答。。。。。
acdbxzyw 2009-07-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 joanlynnlove 的回复:]
最小生成树问题。
[/Quote]
有点问题。。不太像。。。
acdbxzyw 2009-07-08
  • 打赏
  • 举报
回复
最小生成树问题。

33,028

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧