热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

高手请进,要求效率高的一个算法,多谢了

我现在有很多个(几百个)链表,长度多数在3-10之间,是由一个很庞大的树上提取的路径,有以下限制:链表的第一个元素是树根,下一个元素是底下一层的一个节点,但是最后一个元素不一定是叶结点,即
我现在有很多个(几百个)链表,长度多数在3-10之间,是由一个很庞大的树上提取的路径,有以下限制:

链表的第一个元素是树根,下一个元素是底下一层的一个节点,但是最后一个元素
不一定是叶结点,即路径从树根开始,但是不一定完整。
如:
A->B1->C2->D3
A->B1->C2->D1->E7->F8->G2
A->B2->C9......
A是根节点,B,C,D,E分别是第2、3、4层的节点

现在要完成的算法是:
在所有的这些链表中,找到两个最匹配的,即,从根节点开始,相同路径最长的,然后对着两个链表进行评估(评估函数已实现),之后进行两种可能的操作:
1、评估成功:将两个链表合并,即合并成一个链表,其路径为原两表的共同路径,这个操作将影响到以后的评估函数,之后找下一组最佳匹配的链表。
2、评估失败:将两个链表不动,找下一组最佳匹配的链表。

算法的结束条件是:
找不到评估函数成功的匹配。

多谢了,时间复杂度不要太高。

8 个解决方案

#1


还是不太明白,举个实例说明一下。特别是“这个操作将影响到以后的评估函数”

#2


Sorry,我没有讲详细

Node的结构式这样的:(SomeClass data, int eval)
EVAL函数是对整个链表的每个Node使用公式计算的值,对整个链表有意义。

当最长匹配的两个链表找出来以后,对链表lx,链表ly和他们的合并链表merged进行评估,如果EVAL(merged)>EVAL(lx) && EVAL(merged)>EVAL(ly),则将lx,ly从集合中取出来,然后将merged链表放进去,merged的长度相当于原来lx,ly的公共部分,但是Node.eval和原来并不一样的。这是集合生了变化,重复选择最佳匹配的两个链表。

注意的是这些链表集合并不是静态的,每次找到的最佳匹配并不一定执行合并,可能不合并就把那lx,ly放回去。

多谢大家乐。

#3


这个问题真难呵...我提些建议吧:
1 从公式入手,看看问题有没有特殊性,如果能从数学角度解决是最好的了。
2 采用人工智能的方法,这个问题带有明显的“遗传”特征,可以考虑用遗传算法。
3 解决这个问题需要很强的理论基础,你可以考虑找在校的优秀研究生帮忙。

#4


那么你就是问怎么挑出最长匹配的和合并以后怎么继续这两个问题么?

如果是这样就简单。法宝----排序!随便用什么办法排序只需要O(n*logn*k)的时间。排序以后你用遍历的算法在O(n*k)就可以找出最优匹配(只需要遍历一遍),然后用二分查找把你合并的那个链表塞进去要O(nlogn*k)的时间(k是链表的最长长度),这是用数组的,用更好的搜索结构可能还可以加快。这样,你的整个算法需要的时间肯定是O(n^2*logn*k)。按你说的那个数(n=300,k=10),肯定能在1秒以内算出来。

#5


楼上说的很有对,但他的问题是先挑出最长匹配后再判断是否是最佳匹配,最长匹配不一定是最佳匹配。而且难的是:如果是最佳匹配则合并成新的链表,但新链表的长度和各节点的权都会改变,因此会影响到其他的匹配,故每次找到的最佳匹配并不一定执行合并。所以对此可能要搜了。不过楼上的方法有可能改进到比较好的近似吧?能用遗传算法的话会使问题得到好的解决。

#6


1。他不是说他已经有了EVAL了么?

2。不合并不就等于不动么?建一个堆数组,一开始就把每两个之间匹配的长度存进去。

heap a[10]; /* 长度最大是10,多放一个让下标从1开始 */
stack b;

遍历的时候,每一个碰到的就分放到数组的对应项里
a[匹配长度].insert(现在的那个链表编号);

好,判断的时候,从最长的a开始,计算他的eval,如果不行,push到b里面,再换下一个,直到可以为止,这个最多是O(n*time(EVAL()))的时间吧。

可以了以后,再用binsearch给他排到适当的位置,把后面的往后挪。这个是O(n)的时间。

这时把b里面的pop出来,insert到堆里面,再把a里面有那两个用掉的链表的项去掉,并把堆里那些下标变了的改掉(因为是顺序加一所以不会影响排列关系),这个是O(nlogn)的时间。

现在只需要研究那个新生成的和它相邻的链表之间的匹配长度关系,把这两个匹配长度添加到a就可以了,是O(logn)的时间。

所以总共需要MAX(O(nlogn),O(n*time(EVAL()))的时间。(上面因为都是用给这个链表分配的一个下标来操作,所以不涉及到k)

#7


heap a[10]; /* 长度最大是10,多放一个让下标从1开始 */

厄,这个是不小心打错了,不要当真。

heap a[10]; /* 长度最大是10 */

是这样就对了。

#8


还有,刚才说的是一步的时间,总共有多少步?我看很难说会超过O(n)把(虽然我也没法证),所以估计MAX(O(n^2logn),O(n^2*time(EVAL)))是比较合理的。

推荐阅读
  • Learning to Paint with Model-based Deep Reinforcement Learning
    本文介绍了一种基于模型的深度强化学习方法,通过结合神经渲染器,教机器像人类画家一样进行绘画。该方法能够生成笔画的坐标点、半径、透明度、颜色值等,以生成类似于给定目标图像的绘画。文章还讨论了该方法面临的挑战,包括绘制纹理丰富的图像等。通过对比实验的结果,作者证明了基于模型的深度强化学习方法相对于基于模型的DDPG和模型无关的DDPG方法的优势。该研究对于深度强化学习在绘画领域的应用具有重要意义。 ... [详细]
  • 广度优先遍历(BFS)算法的概述、代码实现和应用
    本文介绍了广度优先遍历(BFS)算法的概述、邻接矩阵和邻接表的代码实现,并讨论了BFS在求解最短路径或最短步数问题上的应用。以LeetCode中的934.最短的桥为例,详细阐述了BFS的具体思路和代码实现。最后,推荐了一些相关的BFS算法题目供大家练习。 ... [详细]
  • 生产环境下JVM调优参数的设置实例
     正文前先来一波福利推荐: 福利一:百万年薪架构师视频,该视频可以学到很多东西,是本人花钱买的VIP课程,学习消化了一年,为了支持一下女朋友公众号也方便大家学习,共享给大家。福利二 ... [详细]
  • JVM 学习总结(三)——对象存活判定算法的两种实现
    本文介绍了垃圾收集器在回收堆内存前确定对象存活的两种算法:引用计数算法和可达性分析算法。引用计数算法通过计数器判定对象是否存活,虽然简单高效,但无法解决循环引用的问题;可达性分析算法通过判断对象是否可达来确定存活对象,是主流的Java虚拟机内存管理算法。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
  • C语言自带的快排和二分查找
    Author🚹:CofCaiEmail✉️:cai.dongjunnexuslink.cnQQ😙:1664866311personalPage&#x ... [详细]
  • 作用域链迷惑性代码vara100;functiontest(){console.log(a);}functiontestFun(){vara200;test();}不假思索的想到出 ... [详细]
  • Python中程序员的面试题有哪些
    小编给大家分享一下Python中程序员的面试题有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有 ... [详细]
  • 开发笔记:快速排序和堆排序
    本文由编程笔记#小编为大家整理,主要介绍了快速排序和堆排序相关的知识,希望对你有一定的参考价值。快速排序思想:在partition中,首先以最右边的值作为划分值x,分别维护小于 ... [详细]
  • 数据结构与算法习题replacementselectionsort(置换选择排序)TimeLimit:1000msMemoryLimit:65536kBDescrip ... [详细]
  • 1.完全二叉树的概念除了最后一层之外的其它每一层都被完全填充,并且所有的节点都保证向左对齐。2.堆的结构首先,堆结构就是一棵完全二叉树࿱ ... [详细]
  • 牛B三人组快速排序堆排序归并排序
    快速排序随便取个数,作为标志值,这里就默认为索引位置为0的值记录左索引和右索引,从右往左找比标志值小的,小值和左索引值交换& ... [详细]
  • HashMap的规约JavaDocs中HashMap的spec是这么写的:Hashtablebased implementationoftheMapinterface.Thisim ... [详细]
author-avatar
唐古拉风情2502931431
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有