我有一个巨大的有向图(100M +节点)节点,节点集之间有多个路径实例记录。任何两个节点之间的路径可能会有所不同,但我想要找到的路径是共享多个中间节点除之外的主要偏差。
例如,我在节点A和节点H之间有10个路径实例。这10个路径实例中有9个遍历节点c,d,e,f - 但其中一个实例通过c,d,z, e,f - 我想找到“奇怪的”实例。
我是如何开始解决这样的问题的?现有的分析框架可能适合这项任务吗?
基于评论的详细信息:
PIR的一个例子是: nodeA上; 300;节点B; 600; nodeC上; 100;联接的; 100; nodeF
这转化为A-> B-C-> D-> F的路径;每个顶点的成本/时间是数字 - 例如,从A-> B开始需要300,从B-> C开始600,从D-> F开始100。每次遍历的成本/时间将在每次遍历时不同。因此,例如,在一个PIR中,从A-> B开始可能花费100,但是在下一个PIR中,从A-> B开始可能花费150.
答案 0 :(得分:1)
浏览路径列表并根据开始和结束节点将它们分成几组。因此,例如,以节点A开始并以节点B结束的所有路径都在同一组中。然后你可以用这些路径的子序列做同样的事情。因此,例如具有子序列a,b,c,d以及起始节点y和结束节点k的每个路径在同一组中。还根据需要反转路径,例如,您没有路径k到y的集合和路径y到k的集合。然后,您可以检查子序列是否足够通用,然后检查在该路径中是否存在基于edit distance的原始序列足够接近的子序列时没有该子序列的路径。如果您只对路径感兴趣,那么您可以简单地计算路径和子序列的编辑距离,减去长度差异,并检查结果是否足够低。最好使用路径的子序列,使其以与所需子序列相同的节点开始和结束。
对于您的示例,算法最终将到达包含子序列c,d,e,f的路径集,并发现其中有9个。这超过了子序列足够通用所需的量(并且足够长,可能需要至少长度为k的序列),然后它将检查未包括的路径。在这种情况下,只有一个。然后,它将直接或间接地注意到仅仅去除z将使序列c,d,z,e,f成为c,d,e,f。这传递了(当前模糊的)“odd”的要求,因此包含c,d,z,e,f的路径被添加到要返回的路径列表中。