可以以O(logN)复杂度完成此操作吗?

时间:2018-08-11 19:24:51

标签: algorithm binary-search

您正在处理一个项目,并且发现两个发行版之间的性能有所下降。您有一个功能:

boolean worseCommit(int commit1, int commit2) 

运行性能测试,如果commit2比commit1差,则返回true,否则返回false。

查找所有降低版本之间性能的错误提交。 假设性能没有改善。

提交ID:1, 2, 3, 4, 5, 6, 7, 8, 9

效果:10, 10, 10, 8, 8, 8, 5, 5, 5

输出4, 7

1 个答案:

答案 0 :(得分:3)

对于k = 0,可以在O(k log(n / k))和O(1)中完成,其中k是缓释剂的数量。对于只有一个错误发布的特殊情况,将需要执行O(log n)操作。

类似于n.m.已经指出,如果k = n或k未指定,则运行时变为O(n)。

def bad_releases():
    slow = []
    add_slow(slow, 0, num_commits - 1)
    return slow

def add_slow(slow,  min, max)
    if not worseCommit(min, max):
        return
    if min + 1 = max:
        slow.append(max)
        return
    mid = (min + max) / 2
    add_slow(perf, slow, min, mid)
    add_slow(perf, slow, mid, max)

请注意,slow的插入操作最多运行O(n)-如果每个发行版都恶化了。请注意,递归不会继续到没有减速的段中。

我们可以知道在给定的时间间隔内没有任何放慢的速度,这要归功于发布从未变得更快。因此,如果间隔的两端都具有相同的性能,则意味着整个间隔具有相同的性能。

edit:使用提供的worseCommit函数(而不是performance列表),使O表达式更紧,固定了缩进,为k = 0添加了关于O()的说明,并修正了错字(缺少参数)。