如何更有效地找到闭环

时间:2016-05-09 09:39:49

标签: algorithm data-structures

我有以下数据结构和算法问题,我一直试图为更好的解决方案 -

鉴于

$ x是经度和 $ y是纬度

以及以下字符

'>' east $ x ++; '<' west $ x--; ' ^'北美$ ++; ' V'南$ y - ;

并将示例输入为字符串 " ^ V<>>< ^> V<> ^< ^> ^>> V>>< ^^<>><<&LT ;><<>< ^< ^ v氮化^^ v<<>><<<< ^> v ^> v ^ v ^<< >> v<>< ^<>><>> ^><> v ^ v> v<<> v<> v ^^>&LT ;<>>> v<<>>>> ^> v>>”中

编写一个识别所有闭环的函数(下面给出的一些样本是闭环的例子) [     “^ V”     “<>”中,     “><”,     “^> V<”,     ... ]

我已经能够在O(n ^ 2)中解决这个问题,方法是从给定的输入中挑选每个字符,然后遍历整个字符串并保留两个计数变量 - 一个用于垂直计数,另一个用于水平计数,在任何位置指出两者的值为零然后它是一个闭环。但我想知道是否有人可以更有效地做到这一点 - 也许我错过了一些算法。

谢谢&问候, Vaibhav的

2 个答案:

答案 0 :(得分:1)

创建一个任意长度的位集,例如Ñ

定义一个散列函数,将一对x,y坐标映射到位集中的一个位。

从字符串的开头开始,将当前的x和y初始化为零。

对于每个字符,计算散列并检查位集中的相应位。如果设置了if,则使用当前算法检查当前字符是否有循环结束,向后工作。然后设置当前位置的位,根据字符调整x和y并移动到下一个字符。

bitset用作快速检查以查看循环是否可能以当前字符结尾,仅在设置位的情况下完成全面检查,以避免在散列冲突的情况下出现误报,并且找到循环的起始字符。它还允许您处理更多复杂的循环,这些循环不止一次地返回到相同的位置(例如,在十字架处开始和结束的图8循环),如果您想将它们分别计算到它们包含的较小循环。

答案 1 :(得分:1)

我建议围绕以下内容:

Map (X,Y) => N  as  visited;

for(int i=0; i<input_str.length; ++i){
    ! update (x,y) per input_str[i];

    if(visited.has(x,y))
    {
        last_visit_index = visited[x,y];
        loop = input_str.substring   last_visit_index to i
    }
    visited[x,y] = i;
}

这是O(N)