我不会详细讨论我正在尝试解决的问题,但它会处理一个大字符串并涉及查找字符串中存在的重叠间隔。我只能使用其中一个重叠的区间,所以我想将这些区间分开并单独分析它们。我想知道使用什么算法尽可能高效地执行此操作。
我必须强调速度在这里至关重要。我需要尽快分开间隔。我想到的算法是一个间隔树,但我不确定这是否是我们能做的最好的。
可以在O(log n)时间查询间隔树,n是间隔数,构造需要O(nlog n)时间,但我想知道是否可以减少任何一个。
谢谢!
编辑:我知道问题很模糊。我为这种困惑道歉。我建议人们看看Aaron Huran的回答以及对此的评论。这应该有助于澄清更多的事情。
答案 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)