在图中,有N个节点正好由N-1条边连接。从一个节点到任何其他节点之间只有一条最短的路径。节点的编号从1到N。给定的Q查询告诉源节点和目标节点。在经过这些Q路径后,找到访问量最大的节点。例如说Q = 3 和3个查询是:
1 5
2 4
3 1
因此从节点1到节点5,然后从节点2到节点4,再从节点3到节点1。最后,在Q查询之后找到访问量最大的节点。 寻找每个路径并增加每个访问的节点数是一种幼稚的方法。面试官要我优化它。
答案 0 :(得分:1)
优化通常需要权衡;在某些情况下,一种算法明显优于另一种算法,但是在其他情况下,一种算法在一个方面(例如时间)更好,而另一种算法在不同方面(例如内存使用量)更好。
在您的情况下,我猜测您的面试官正在寻找一种优化您开始接收查询后必须完成的处理量的方法,即使这表示您已经在图形上进行更多预处理。我这样说的原因是“查询”一词;为“在线”查询优化数据源是很普遍的。 (当然,他可能没想到您会自己决定这种权衡是可以的;相反,他可能希望就各种权衡进行对话。)
因此,请牢记这一点。 。
总体而言,这需要进行 O ( N 2 )预处理, O ( Q )每个查询的实时处理,以及 O ( N )后处理。
如果 N 很大,并且我们希望甚至只访问一小部分节点,那么我们可以通过忽略树的未访问部分来加快后处理的速度。这涉及维护一组作为路径端点的节点,然后以“自下而上”的方式进行后处理,从此类节点的最深处开始,并且仅当访问的路径数达到一定数量时,才从给定节点向“父方向”移动该节点的数量少于它作为共同祖先的次数。如果我们用 P 表示不同端点的数量,用 M 表示不同访问的节点的数量,则可以用 O 之类的方法完成。 ( P log P ++ M )。