查找字符串重叠的高效算法

时间:2010-07-09 03:50:41

标签: algorithm string performance overlap intervals

我不会详细讨论我正在尝试解决的问题,但它会处理一个大字符串并涉及查找字符串中存在的重叠间隔。我只能使用其中一个重叠的区间,所以我想将这些区间分开并单独分析它们。我想知道使用什么算法尽可能高效地执行此操作。

我必须强调速度在这里至关重要。我需要尽快分开间隔。我想到的算法是一个间隔树,但我不确定这是否是我们能做的最好的。

可以在O(log n)时间查询间隔树,n是间隔数,构造需要O(nlog n)时间,但我想知道是否可以减少任何一个。

谢谢!

编辑:我知道问题很模糊。我为这种困惑道歉。我建议人们看看Aaron Huran的回答以及对此的评论。这应该有助于澄清更多的事情。

3 个答案:

答案 0 :(得分:1)

你想要计算两个字符串之间的差异吧?你想用什么语言来做?

更新: 没有任何关于如何选择使用哪个区间的标准,有很多可能的解决方案。

一种方法是采用最低起始数,抓住它的结束。 抓住下一个高于前一个间隔结束的起始编号。获取此间隔结束并重复。

0-4,5-13,8-19,10-12 得到:0-4,5-13而忽略其他人。

答案 1 :(得分:1)

好吧,我昨晚很无聊,所以我用Python做了这个。这是不必要的递归(我只是阅读The Little Schemer并认为递归现在非常简洁)但它解决了你的问题并处理了我投入的所有输入。

intervals = [(0,4), (5,13), (8,19), (10,12)]  

def overlaps(x,y): 
   x1, x2 = x 
   y1, y2 = y 
   return ( 
      (x1 <= y1 <= x2) or 
      (x1 <= y2 <= x2) or  
      (y1 <= x1 <= y2) or 
      (y1 <= x2 <= y2) 
   ) 

def find_overlaps(intervals, checklist=None, pending=None): 
   if not intervals:  
      return [] 

   interval = intervals.pop() 

   if not checklist: 
      return find_overlaps(intervals, [interval], [interval]) 

   check = checklist.pop() 

   if overlaps(interval, check): 
      pending = pending or [] 
      checklist.append(check) 
      checklist.append(interval) 
      return pending + [interval] + find_overlaps(intervals, checklist) 
   else: 
      intervals.append(interval) 
      return find_overlaps(intervals, checklist) 

像这样使用:

>>> find_overlaps(intervals)
[(10, 12), (8, 19), (5, 13)]

请注意,它以起始点的REVERSE顺序返回所有重叠间隔。希望这是一个小问题。这只是因为我在列表中使用push()pop(),而不是在列表末尾运行,而不是insert(0)pop(0),它们在开头运行。

这并不完美,但它以线性时间运行。还要记住,实际字符串的大小根本不重要 - 运行时间是相对于间隔的数量,而不是字符串的大小。

答案 2 :(得分:1)