Javascript 按每个数组中包含的元素对数组进行排序
我需要遍历图中所有连接的组件。 图形的路径存储在如下数组中:Javascript 按每个数组中包含的元素对数组进行排序,javascript,arrays,algorithm,geometry,Javascript,Arrays,Algorithm,Geometry,我需要遍历图中所有连接的组件。 图形的路径存储在如下数组中: var paths = [ [5,6], [1,2], [4,7,5,6], [6] ] 在这里我看到路径[2]=[4,7,5,6]依赖于路径[0]=[5,6],而路径[3]=[6] 现在,我需要递归地遍历所有路径,以检查哪些路径包含在另一个路径中,并首先处理可能有助于解决另一个路径的路径,即,我需要检查哪些数组包含在其他一些数组中: 例如: process [6] process [5,6] process [4,
var paths = [
[5,6],
[1,2],
[4,7,5,6],
[6]
]
在这里我看到路径[2]=[4,7,5,6]
依赖于路径[0]=[5,6]
,而路径[3]=[6]
现在,我需要递归地遍历所有路径,以检查哪些路径包含在另一个路径中,并首先处理可能有助于解决另一个路径的路径,即,我需要检查哪些数组包含在其他一些数组中:
例如:
process [6]
process [5,6]
process [4,7,5,6]
process [1,2]
由于有大量的元素,我不希望使用递归。
是否有一种方法可以按照每个其他数组中包含的一个数组中的元素对该数组列表进行排序,以便我可以通过迭代来处理它们
编辑:
我认为这可以通过为每个路径分配权重来解决,其组成如下:
每个路径中包含的节点的总和乘以该节点在其他路径中包含的次数,然后按长度升序和权重降序对路径进行排序-但这只是我的猜测…我猜。。。如果我理解正确的话,您正在进行依赖项排序。那么我相信实现这项工作的一个可能的方法如下。这是我本可以想出的一种方法,但也可能有更简单的解决方案 我们必须形成相互依赖的连续项目组(如
[6]
、[5,6]
和[4,7,5,6]
),然后我们将根据它们的依赖性对它们进行排序。我猜不需要在单独的组之间进行排序,因为它们的项目不相关(即,[1,2]
可以位于排序组的前面或后面,[6]
,[5,6]
和[4,7,5,6]
)
var路径=[
[5,6],
[1,2],
[4,7,5,6],
[6]
],
lut=路径.reduce((表,路径,i)=>(path.forEach(n=>表[n]=表[n]?表[n].concat([[i,路径.length]]))
.sort((a,b)=>a[1]-b[1])
:[[i,path.length]]),
表1),{}),
sorted=Object.keys(lut).sort((a,b)=>lut[b].length-lut[a].length)
.reduce((si,k)=>(lut[k].forEach(e=>!si.includes(e[0])和&si.push(e[0]),si),[])
.map(idx=>path[idx]);
控制台日志(已排序)代码>由于元素数量很大,我不希望使用递归。
如果您担心函数会达到最大堆栈大小,那么有一些方法可以解决这个问题。这有点像是“滚动您自己的TCO”,但它可能非常有效。无论如何,我认为[5,6]
包含[6]
是因为后者更小,这是正确的吗?本质上,只有较大的数组才会包含较小的数组,而不是[5,6]
包含[4,7,5,6]
的一部分,对吗?@Vld:我昨天刚刚读了你提到的文章,我必须承认我还在消化它的过程中。。。切中要害:它们也可能具有相同的长度,按长度排序是我的第一次尝试,遗憾的是在一些更复杂的图中没有成功。按对比较在您的情况下不起作用吗?如果n
是路径数(假设路径长度小于某个最大长度k
),则需要O(n*n)
时间@deblocker是的,我也花了一些时间来处理这篇文章,但我发现这些技术很有趣。令人有些恼火的是,你确实需要修改你的算法来利用它们,但这总比破坏堆栈要好。无论如何,简单的按长度排序不会太难。arr.sort((a,b)=>a.length-b.length))
将按长度排序包含数组的数组。这只是一个级别,但深入到多个级别需要遍历所有内容并对遇到的任何数组进行基本排序。@RishitSanmukhani:请详细说明一下好吗?我不确定两人比较是否对我有帮助。是的!。在我看来,你知道问题所在,是真的吗?如果你能分享更多关于这个论点的知识,那对我将非常有用。你是怎么想出“7”:4的?这是我无法意识到的关键点,即使借助于您过于高级的一段代码。@deblocker昨天我发布了这段代码后,我意识到有一些不正确之处,并正在研究如何纠正。今天晚些时候,我将尝试发布一些更有效的内容。