java - “找峰”算法的增长顺序是什么
问题描述
您好,我需要应用与此类似的算法,但问题是我需要复杂度为 O(logn)。下面代码的复杂度据说是 O(logn),但据我了解,递归方法的增长顺序为 O(n)。所以问题是下面代码的增长顺序是什么。
public static int findPeak(int[] array, int start, int end) {
int index = start + (end - start) / 2;
if (index - 1 >= 0 && array[index] < array[index - 1]) {
return findPeak(array, start, index - 1);
} else if (index + 1 <= array.length - 1 && array[index] < array[index + 1]) {
return findPeak(array, index + 1, end);
} else {
return array[index];
}
}
解决方案
代码的每个分支中输入数组的大小是函数中原始输入数组的一半。因此,如果T(n)
是函数的时间复杂度,我们可以写成:
T(n) = T(n/2) + 1
1
显示分支中的比较,并且T(n/2)
适用于任何选定的分支。因此,T(n)
在O(log(n))
.
推荐阅读
- javascript - 如何根据数组内的对象数组过滤数组
- kubernetes - 按主机名动态路由到特定 StateFulSet POD
- c# - .net core 3.0 中的动态变化了吗?
- c# - .net c# 中的 MongoDb 数据本地化,用于查询和显示
- payflowpro - 使用托管页面时,我可以从以前的交易中发送 PNREF 吗?
- sql - SQL分成3列
- java - JavaFX 中 AWT 的 HierarchyListener 和 HierarchyEvent 等价物是什么
- node.js - 你如何阅读 Node.js 中的 API 文档?
- nginx - flask socket.io 不能在 nginx 端口 443 上工作,它正在使用 80,但我需要设置为 443
- swift - 如何删除 SwiftUI 应用程序中的白色边框?