【发布时间】:2023-03-22 01:07:01
【问题描述】:
我需要遍历图中所有连接的组件。 图的路径存储在数组中,如下所示:
var paths = [
[5,6],
[1,2],
[4,7,5,6],
[6]
]
在这里我看到paths[2]=[4,7,5,6] 依赖于paths[0]=[5,6],而paths[0]=[5,6] 又依赖于paths[3]=[6]。
现在,我需要递归遍历所有路径以检查哪个路径包含在另一个路径中,并首先处理可以帮助解决另一个路径的路径,即我需要检查哪些数组包含在其他一些数组中:
示例:
process [6]
process [5,6]
process [4,7,5,6]
process [1,2]
由于元素数量众多,我宁愿不使用递归。 有没有办法通过包含在每个其他数组中的一个数组中的元素对这个数组列表进行排序,以便我可以通过迭代来处理它们?
编辑: 我认为这可以通过为每个路径分配权重来解决,如下所示: 每个路径中包含的节点的总和乘以该节点在其他路径中包含的次数,然后按长度升序和权重降序对路径进行排序 - 但这只是我的猜测......
【问题讨论】:
-
Due to the large amount of elements, i would prefer not to use recursion.如果你担心一个函数会达到最大堆栈大小,有办法解决这个问题。这有点像“滚动您自己的 TCO”,但它可能非常有效here is a good article。无论如何,我认为[5, 6]包含[6]是否正确,因为后者更小?本质上,只有较大的数组才会包含较小的数组,[5, 6]不会包含 part of[4, 7, 5, 6],对吗? -
@Vld:我昨天刚读到你提到的那篇文章,我必须承认我还在消化它的路上......重点是:它们也可以有相同的长度,按排序长度是我的第一次尝试,遗憾的是在一些更复杂的图表中没有成功..
-
在您的情况下,配对智能比较不起作用吗?如果
n是路径数,则需要O(n*n)时间(假设路径长度小于某个最大长度k) -
@deblocker 是的,我也花了一些时间来处理那篇文章,但我发现这些技术很有趣。有点烦人的是,您确实必须修改您的算法才能使用它们,但这比炸毁堆栈要好。无论如何,简单的按长度排序不会太难
arr.sort((a, b) => a.length - b.length))会按长度排序包含数组的数组example。它只是一个级别,但深入许多级别将是遍历所有内容并基本上对遇到的任何数组进行排序的问题。 -
@RishitSanmukhani:您能详细说明一下吗?我不确定成对比较是否对我有帮助。
标签: javascript arrays algorithm geometry