我有两种范围数组:
wanted = {[10, 15], [20, 25]}
cut = {[5, 12], [22, 24]}
所以wanted
是一个包含两个元素(范围)的数组 - [10, 15]
和[20, 25]
。
两个阵列中的每一个都满足以下条件:
[10, 15]
,[15, 25]
是不可能的)[1, 5]
,[1, 5]
)[5, 5]
(开头和结尾相等)我现在想要获取一系列范围,其中cut
的所有范围都已从wanted
的范围中删除。
result = {[13, 15], [20, 21], [25, 25]}
是否有比下面更好/更容易/更快的优秀算法?
对于
wanted
中的每个元素,将该元素与cut
之后的一个元素进行比较,直到cut
中的元素从wanted
的元素上方结束。
答案 0 :(得分:2)
假设n
中的wanted
和m
元素中有cut
个元素。
以下是执行所需任务的O(m + n)
算法:
j = 1
result = {}
for i = 1:n
// go to next cut while current cut ends before current item
while j <= m && cut[j].end < wanted[i].start
j++
// cut after item, thus no overlap
if j > m || cut[j].start > wanted[i].end
result += (wanted[i].start, wanted[i].end)
else // overlap
// extract from start to cut start
if cut[j].start > wanted[i].start
result += (wanted[i].start, cut[j].start-1)
// extract from cut end to end
if cut[j].end < wanted[i].end
result += (cut[j].end+1, wanted[i].end)
j++
请注意,渐近地,你不能比O(m + n)
做得更好,因为要证明你需要查看每个元素(在最坏的情况下)应该相当容易。
答案 1 :(得分:0)
wanted
和cut
的最大尺寸是多少?将“wanted
”中的“第一个元素”与“cut
”中的“ all ”进行比较将花费O(n ^ 2)运行时间,即如果数组很大则非常慢。 / p>
并行处理每个数组要快得多,直到你到达两者的末尾,就像“合并”一样。