我必须用c ++编写一个程序,它返回循环图中对称轴的数量。 当左侧的相对顶点或边缘之间的值是右侧值的镜像时,循环图具有对称轴。 对称轴可以与顶点和边相交。
例如:
有没有办法比O(n^2)
更快地完成这项工作?
答案 0 :(得分:2)
n.m.的答案实际上几乎是正确的,但在任何情况下都不是。
让我们将其中一个节点称为起始节点,将轴称为传递起始节点,即主轴。 在某个轴上翻转图形等于在主轴上旋转并旋转:
旋转后,主节点可以放置在任何其他节点上(我们也总是可以找到当前轴来执行此操作)。
如果我们将图形存储为字符串,则由反向字符串描述的翻转图形循环移位0到N-1个位置。 这些字符串的平等意味着图表的相等性。显然,这种匹配的数量等于两次重复图形的字符串中反转字符串的出现次数:
所以是的,KMP在O(N)复杂性方面做得很好。
但是当str等于反向(str)时你应该避免这种情况,因为尽管它们描述了同一个轴,但是匹配将同时计算0和N个移位。所以,你应该不使用str和它自身的连接,而只使用这个连接的第一个(2 * N - 1)个字符来实现任何情况下的正确行为。