您正在处理一个项目,并且发现两个发行版之间的性能有所下降。您有一个功能:
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
答案 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()的说明,并修正了错字(缺少参数)。