【问题标题】:How to find closed loop more efficiently如何更有效地找到闭环
【发布时间】:2016-05-09 09:39:48
【问题描述】:

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

给定

$x 是经度和 $y 是纬度

及以下字符

'>' 东 $x++ ; '

并将样本输入作为字符串 "^V>v^^>>v>>>>v^>v^v^>v>>^>v^v>vvv^^>>> v>>>^>v>>”

编写一个识别所有闭环的函数(下面给出的一些示例是闭环的示例) [ “^v”, “”, “>v

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

感谢和问候, 毗婆娑

【问题讨论】:

  • 提示:不要将其视为“搜索子字符串”。把它想象成“当你回到以前的地方时认识到”。任何时候你这样做,你就循环了。
  • 对使用的空间有什么限制吗?使用 O(n) 空间,您可以在 O(n) 时间内完成。
  • @KumarVaibhav 它不一定是 O(n)。 “你以前去过[3,5] 位置吗”是在 O(1) 中回答的微不足道的操作。只需使用 2D 表格,其中包含您上次在特定地点的时间。
  • 哦,如果我是你,我不会使用哈希。如果您有无限的空间,则不必要的复杂性。
  • 初始化一个 2D 表需要 O(n^2) 时间,假设每个维度中的最大实体与 n 线性缩放

标签: algorithm data-structures


【解决方案1】:

创建任意长度的位集,例如n.

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

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

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

bitset 用于快速检查循环是否可能在当前字符处结束,仅在设置位的情况下进行全面检查,以避免在哈希冲突的情况下出现误报,并且还找到循环的起始字符。如果您想将它们分别计算到它们包含的较小循环中,它还允许您处理多次返回同一位置的更复杂的循环(例如在交叉处开始和结束的 8 字形循环)。

【讨论】:

  • 似乎是我正在寻找的解决方案。 Sneftel 说得对,我在考虑寻找子串,而不是将其视为 2D 绘图。谢谢@Sneftel!
【解决方案2】:

我建议围绕以下几点:

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)

【讨论】:

  • 子串不是至少 O (n) 吗?
  • @Kumar 一点也不......它可以是 O(1)。采取 cpp str[start+len]='\0'; return &amp;str[start] 即使这个 impl 破坏了原始字符串。
猜你喜欢
  • 1970-01-01
  • 2022-01-19
  • 2021-06-26
  • 1970-01-01
  • 1970-01-01
  • 2020-11-18
  • 2013-09-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多