我认为我们可以使用队列进行广度优先搜索(BFS)遍历,并且因为队列中的add()和remove()是常量时间,所以我认为BFS从起始节点遍历到目标节点是线性时间。
但如何加快BFS?有没有可以减少时间复杂度的数据结构?
答案 0 :(得分:2)
您可以通过执行 bi-directional search 来加快从源到目标的BFS。
双向搜索基本上是从源和目标同时进行BFS,从每个进行一步 - 直到两个战线相遇。
为什么会更好?
O(B^d)
个节点(B
是分支
因素,每个节点的程度) - 和d
是深度
溶液O(B^(d/2)*2)=O(B^(d/2))
个节点
通常要小得多根据经验,对于大/无限图,双向搜索通常比常规BFS更快。
答案 1 :(得分:-1)
最坏的情况时间是节点数的线性(并且可以清楚地获得)。您可以通过启发式方法加快搜索速度,即,不是将新节点添加到队列,而是将它们添加到优先级队列,其中优先级是衡量新节点接近目标的程度。
加快速度的另一种方法是在并行中工作,即将要处理的节点队列变为工作线程。但是你会遇到麻烦,确保不会多次访问(或至少没有太多)节点。
除非您尝试处理的图表真的很大,否则我不会过于担心这一点,在这方面没有什么可以被挤出来的。 衡量系统瓶颈所在的位置,并专注于它们。只有在表现不够的情况下才能做到这一点,否则就把时间花在海滩上(或者你喜欢做的最好的事情)。