algorithm - 这可以在 O(logN) 复杂度中完成吗?

标签 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

最佳答案

对于 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) —— 如果每个版本都变得更糟。请注意,递归不会继续进入没有减速的段。

我们可以知道在给定的时间间隔内不会出现减速,这要归功于发布永远不会变得更快这一事实。因此,如果区间的两端具有相同的性能,则意味着整个区间具有相同的性能。

编辑:使用提供的 worseCommit 函数(而不是 performance 列表),使 O 表达式更紧凑,修复缩进,添加关于 k=0 的 O() 的说明,并修复错字(缺失参数)。

关于algorithm - 这可以在 O(logN) 复杂度中完成吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51803009/

相关文章:

c++ - 高效获取数据的算法

c - 差异算法,即最短编辑图路径

java - while 循环不会以迭代二分查找结束

c# - BinarySearch如何在两个邻居之间的数组中找到值?

java - 如何编写带有 Axis 的递归算法?

java - 如何对列表元素的一个字段进行二进制搜索

algorithm - 我怎样才能更有效地编写这个组合算法?

algorithm - 打印到达第 n 个楼梯的方法

python - 在 App Engine 中为 Web 请求实现速率限制或 throttle 算法的有效方法是什么?

binary-search - 什么是惰性二进制搜索?