作者:撒哈拉2011的马甲_978 | 来源:互联网 | 2023-05-18 00:28
假设有这么样的数据:
a->b
f->g
b->c
c->e
c->a
.....
其中
a->b
b->c
c->a
构成了循环,请问有没有什么比较高效的算法能在这样一堆数据中找出像这样出现循环(可能不止一个循环)的项
7 个解决方案
“单链表里面是否有循环”这个问题在《c专家编程》后面有讲。
思路就两个指针都指向头节点,然后开始沿单链表移动,一个每次移动一步,另一个每次两步。
如果快的先到终点就是没有循环。
如果快的追上慢的就是有循环(快的多跑了一圈)。
我这个不是单链表阿,遍历的时候有可能会出现树状结构,因为上述列的这种组合有很多组,如果采用一一遍历,效率是低下的,因此想寻求高效率的算法
哈希里套个哈希,就可以快速检测环。这个更简便。
图论里的算法,是不断拓扑排序,删除出度最小的,直到无点可删。
这个感觉用tarjan算法就可以解决 时间复杂度O(n+m) n点数m边数
如果出现环路,那么处在环路上的这些点属于同一强连通分支 , 而tarjan就是线性时间求强连通的。。
tarjan实现我blog里有,至于存储图的数据结构邻接表就可以
floyd算法就可以,传递闭包。DFS 并查集也行。
这个好像是要求强连通分量,最大流应该可以吧