ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2022-8-28 10:40 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
lee1892 发表于 2014-11-23 09:56
真是大手笔呀!前半部分我大致看明白了,可要是一个完全树,这前面的都用不上啊。

对了,所谓完全树是 ...

大概没说清楚,我在这里只是想说清楚树结构,树结构只是图的一种。担任树结构较容易处理,有环,复杂联通,处理就不容易了
当时脑子里主要在想BOM。对于离散制造,BOM都是树形结构

TA的精华主题

TA的得分主题

发表于 2023-8-30 11:12 | 显示全部楼层
偶然翻到时隔多年的帖子,不知道启蒙老师是否还会做出回应。
我看了一下题目,自己思考了一下,先得出以下逻辑,不知有无错误,可以的话请先生指教。
1、树形结构,只有一个连接点的是叶,其他是枝干,很容易判断;
2、把每个叶子距离合并到父节点,然后删除叶子,在父节点记录叶子编号和带来的距离(保留一个或两个叶子信息,下有说明);
3、叶子合并到父节点时,如果此父节点只有一个分枝(判断它是否只有两个连接就行),则继承叶子信息及距离,如果超过一个分枝,
   则保留两个最长距离的叶子信息及距离,将此两个距离相加后存入临时变量,如果有超过它距离的,把它替换掉
4、上述多个分枝的父节点,如果变成叶子还要合并到它的父节点时,只向父节点传递距离最长的信息(可以是完整路径,也可以只是点信息,因为任意两个点有且仅有一条通路)
5、直到处理至根节点,完成后第3项临时变量的值就是距离最长两点的信息
注:最长距离不一定要通过根节点

TA的精华主题

TA的得分主题

发表于 2023-8-30 12:52 | 显示全部楼层
大灰狼1976 发表于 2023-8-30 11:12
偶然翻到时隔多年的帖子,不知道启蒙老师是否还会做出回应。
我看了一下题目,自己思考了一下,先得出以下 ...

直到处理至根节点,完成后第3项临时变量的值就是距离最长两点的信息

这一句我理解的是不成立的,因为根节点不是已知的固定的。

整个结构中,每一个节点,都可能是结果中最长距离的根节点。所以如果由叶子向根节点搜索,那么除了叶子本身,要搜索到每一个节点的距离,这个运算量太大了。

TA的精华主题

TA的得分主题

发表于 2023-8-30 14:38 | 显示全部楼层
micch 发表于 2023-8-30 12:52
直到处理至根节点,完成后第3项临时变量的值就是距离最长两点的信息

这一句我理解的是不成立的,因为 ...

层层剪叶最后得到的肯定是根节点。另外,第3项临时变量保存的是每次剪叶后得到的最长距离点信息,和根节点没有关系,判断剪到根节点只是为了判断处理已完成。另外,我最下面一行写了,距离最远的点不一定通过根节点,现在再补充一下,必定是两张叶子之间的距离。

TA的精华主题

TA的得分主题

发表于 2023-8-30 14:40 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2023-8-30 15:19 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
大灰狼1976 发表于 2023-8-30 14:38
层层剪叶最后得到的肯定是根节点。另外,第3项临时变量保存的是每次剪叶后得到的最长距离点信息,和根节 ...

就是,找到所有叶子,然后向上搜索父节点,然后同一个父节点只记录最长的叶子,然后父节点变为叶子。

然后做下一轮循环搜索,还是所有叶子都计算到父节点的距离,同一个父节点只保留最长的距离,然后删除叶子,父节点变叶子。

这样循环到只剩下一个节点为止。

这样?

TA的精华主题

TA的得分主题

发表于 2023-8-30 15:49 | 显示全部楼层
micch 发表于 2023-8-30 15:19
就是,找到所有叶子,然后向上搜索父节点,然后同一个父节点只记录最长的叶子,然后父节点变为叶子。

...

嗯,我的想法,每个循环都把当前所有叶子(连接数为1)合并到对应父节点,父节点保留叶子信息及距离(如果该父节点上有超过1个叶子,就保留两个最大分枝,其余抛弃;只有1张叶子的直接保留该信息);
每个循环结束时,当前的叶子全部被剪除,树结构复杂度降低,每二个循环再找新叶子(连接数为1),继续处理,直到结果。
刚才回贴中第3项提到的临时变量,不存在树上任意点的信息内,它只会被新的最大值替换掉,最终留下一个(当然如果考虑可并列的话,也可以保留相同距离长度的多个点信息)

TA的精华主题

TA的得分主题

发表于 2023-8-30 21:14 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
做了个简单的过程图示,用来初步验证。
注:其实根节点毫无意义,只要有叶子这个概念就行。
过程图示.PNG

过程图示.zip

20.87 KB, 下载次数: 1

TA的精华主题

TA的得分主题

发表于 2023-8-31 23:40 | 显示全部楼层
看明白了,逻辑上行得通,接下来就是代码如何写了。

穷举的话,就是一轮一轮循环直到剩下两个节点。用递归也可以按这个逻辑写,就是优化不确定如何优化更合理。

这个贴这么久了,也没人关注了,可惜了

TA的精华主题

TA的得分主题

发表于 2023-9-1 09:10 | 显示全部楼层
..............................

longestPath.zip

19.75 KB, 下载次数: 3

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-6-2 15:40 , Processed in 0.039330 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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