ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: lee1892

[讨论] 来个难度高点的:用最快的方法找出一个树内距离最远的两个节点间的距离

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2014-11-13 08:58 | 显示全部楼层
本帖最后由 香川群子 于 2014-11-13 12:24 编辑
lee1892 发表于 2014-11-7 12:17
2,最长路经是否必然经过根节点?

最长路经必然经过根节点,但这个根节点不一定是=1(最初的父节点)

如:
       1
      /   \
     2     3
    /  \
   4   5
  /  \    \  
6    7    8
    /      /  \  
   9     10 11  

此图中,以2为根节点时,9-10 以及 9-11 距离都是=6
而经过父节点1的 3-10 和3-11的距离只是=5
…………
补充:
上图中,以2为根节点时,3和6、7、8等距离。

因此,可以认为最终结果(距离最大)的情形是:
以整个树中某一个点为根节点时,其中独立路径最大的两个末端节点之间的距离,即为楼主所求答案。
所谓独立路径是指:这两个末端节点之间必须通过这个特定的根节点,而不存在其它更短的路径相通。

呵呵。

TA的精华主题

TA的得分主题

发表于 2014-11-13 09:03 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
lee1892 发表于 2014-11-8 00:34
3、距离根节点最远的两个节点间是否距离最远?

距离根节点最远的两个节点间是否距离最远?

答: 不是,而且有可能是距离最近的。

如:
     上面省略
       /   
       8
    /     \  
   9     10  

9和10距离1最远,但9和10最近。

TA的精华主题

TA的得分主题

发表于 2014-11-13 09:15 | 显示全部楼层
楼主最好提供几个较大的树(即4;1,2;1,3;2,4 格式的 文本输入字符串)

然后在此基础上思考代码。

TA的精华主题

TA的得分主题

发表于 2014-11-13 09:45 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-11-13 11:29 来自手机 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
香川群子 发表于 2014-11-13 09:15
楼主最好提供几个较大的树(即4;1,2;1,3;2,4 格式的 文本输入字符串)

然后在此基础上思考代码。

暂不提供,自己琢磨琢磨先~

TA的精华主题

TA的得分主题

发表于 2014-11-13 12:32 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
根据11楼的分析,目前的初步结论是:

从每一个末端节点(只有一对父子关系)出发,各自向上(父级)回溯,
每到出现共同的节点时,就淘汰这一对端末节点……直到剩下最后一对。
则这一对端末节点,肯定是路径最大的一对,而这最后出现的共同节点,就是它们的根节点。(不一定是=1)

以上。

但是代码实现起来可能仍很困难。很多问题需要进一步思考。

点评

不限于双支,可以多支。都是转成单支最大,和多支存储,所有单支循环完了,按随机代码就是到1,最后再进行比较与所有多支的最大即为所求。  发表于 2014-11-19 17:36
我感觉不是淘汰,是记录下来。每一个共同结点,是返回一个单支数据,和一个双支数据,单支最大两个相加为双支最大,双支直接作为比较结果。  发表于 2014-11-19 17:33

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-11-14 14:37 | 显示全部楼层
本帖最后由 lee1892 于 2014-11-14 14:56 编辑

下述代码可以按题目格式生成一个随机树的字符串
  1. Function RandomTree$()
  2.     Dim nCnt%, i%, nInd%, nLast%, nChildNumMax%
  3.     nCnt = Int(Rnd * 10000) + 1
  4.     nChildNumMax = 10
  5.     nInd = 1: nLast = 1: RandomTree = CStr(nCnt)
  6.     Do
  7.         For i = 1 To Int(Rnd * nChildNumMax) + 1
  8.             nLast = nLast + 1
  9.             If nLast > nCnt Then Exit Do
  10.             RandomTree = RandomTree & ";" & CStr(nInd) & "," & CStr(nLast)
  11.         Next
  12.         nInd = nInd + 1
  13.     Loop
  14. End Function
复制代码

TA的精华主题

TA的得分主题

发表于 2014-11-14 17:33 | 显示全部楼层
改造为工作表单元格内可以直接引用的易失性随机函数:
  1. Function RandomTree$(Optional nCnt% = 0)
  2.     Dim i%, nInd%, nLast%, nChildNumMax%
  3.     Application.Volatile
  4.     If nCnt = 0 Then nCnt = Int(Rnd * 10000) + 1
  5.     nChildNumMax = 10
  6.     nInd = 1: nLast = 1: RandomTree = CStr(nCnt)
  7.     Do
  8.         For i = 1 To Int(Rnd * nChildNumMax) + 1
  9.             nLast = nLast + 1
  10.             If nLast > nCnt Then Exit Do
  11.             RandomTree = RandomTree & ";" & CStr(nInd) & "," & CStr(nLast)
  12.         Next
  13.         nInd = nInd + 1
  14.     Loop
  15. End Function
复制代码

TA的精华主题

TA的得分主题

发表于 2014-11-14 20:20 | 显示全部楼层
本帖最后由 yiyiyicz 于 2014-11-14 20:51 编辑
香川群子 发表于 2014-11-13 08:58
最长路经必然经过根节点,但这个根节点不一定是=1(最初的父节点)

如:


根据一楼的定义
“由一个节点到另一个节点所经过的不重复的边的数量---相距最远的两个节点的距离”
最长路经必然经过根节点的结论不对---最长路径中同一条边不能出现两次

根节点在树形结构是固定的。除非有其它的定义

TA的精华主题

TA的得分主题

发表于 2014-11-14 20:36 | 显示全部楼层
本帖最后由 yiyiyicz 于 2014-11-14 20:54 编辑

这题意义不大
用现成的方法,用深度优先遍历,找没有兄弟的分支;用广度优先,排除公共边
或者将数据转到XML中,用Xpath也可以。
用邻接矩阵也可以,正好满足“根结点”任意变化的意思。VBA做10000个结点的邻接矩阵也受得了
10000个结点需要遍历,
主要的是设计算法巧妙,能节省时间

用邻接矩阵大概最合适,“根结点”可以任意拓扑,矩阵又适合模型讨论,矩阵方法灵活多变。这个思路最适合
编程正好也能用到“继承”,多层继承,用类模块实现回调函数

点评

知道的确实太多了,佩服!!!  发表于 2014-11-16 19:54
你在说啥?堆砌名词吗?  发表于 2014-11-15 09:33
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-19 12:38 , Processed in 0.036611 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表