algorithm - 这可以在 O(logN) 复杂度中完成吗?
问题描述
您正在处理一个项目,并注意到两个版本之间的性能下降。你有一个功能:
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) 操作。
与 nm 所指出的类似,如果 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) - 如果每个版本都变得更糟。请注意,递归不会继续进入没有减速的段。
我们可以知道在给定的时间间隔内没有减速,这要归功于发布永远不会变得更快的事实。因此,如果区间的两端具有相同的性能,则意味着整个区间具有相同的性能。
编辑:使用提供的更坏提交函数(而不是performance
列表),使 O 表达式更紧凑,固定缩进,添加关于 k=0 的 O() 的说明,并修复错字(缺少参数)。
推荐阅读
- swift - 使用 SwiftUI 在 iOS 上创建应用内超链接
- javascript - 如何在 Google 表格中编写脚本以删除列中的某些值?
- swift - UITableView - 意外发现 nil Swift
- python - 无论列顺序如何,计算唯一组合
- blockchain - 为什么ERC721的铸币功能有权限控制?
- javascript - 在 Javascript 中使用关联数组重新组织 JSON 数据
- javascript - 赛普拉斯:使用或与期望
- reactjs - 如何在反应头盔中预加载最大内容绘制图像
- c++ - 如何使用 CPLEX C++ API 获得最优差距?
- roblox - 为什么 for 循环没有在 roblox studio 中创建实例?