过滤出具有O(n)时间复杂度的列表元素

时间:2014-05-30 09:23:07

标签: java algorithm sorting data-structures

我有一个元素列表,其中每个元素都是一个非负整数范围。我想以这样一种方式过滤列表,即只分离出最大的未封闭范围。我希望以O(n)方式使用单循环执行此操作。此列表将始终根据每个范围的起始整数进行排序。封闭范围元素可能出现在列表中的封闭范围元素之前或之后。

示例:

假设我拥有的列表是{[0-12],[5-15],[5-20],[10-20],[11-30],[25-42],[28-40]}。在此列表中,范围[5-15][10-20]属于[5-20]范围,因此我需要将其丢弃。同样,范围元素[28-40]会被丢弃,因为它属于范围[25-42]。 我想使用单个循环进行此过滤以实现O(n)时间复杂度。

有可能实现这一目标吗?如果不是,那么使用超过O(n)的复杂度进行过滤的最佳方法是什么。 Java中的解决方案会很棒。

2 个答案:

答案 0 :(得分:5)

如果元素具有相同的范围开始但更大或相等的结束,则元素可以吞下前一个元素。如果下一个范围的结束时间小于当前元素的结束,那么元素也可以吞下。

因此,您将浏览列表并比较当前和下一个元素。

如果他们有currentStart = nextStart和nextEnd> = currentEnd - >删除当前。

else if nextEnd< = currentEnd - >删除下一步。

答案 1 :(得分:0)

在伪代码中,合并期间可以这样做:

def merge(l:list[period], e:period):
    if l == nil:
        return list(e)
    else:
        lh = l.head
        ll = l.tail
        if e.end < lh.start: 
            return e::l // original list prepended with e
        else if lh.end < e.start:
            return lh::merge(e,ll) // head + trying to merge period with the tail
        else: //overlap, make new period from e and list head and merge it with tail
            newstart = min(e.start, lh.start)
            newend = max(e.end, lh.end)
            return merge(period(newstart,newend), ll)

在你的情况下,你必须进行差异/合并,但这个想法是相似的。