1 package com.company;
2
3 import org.junit.Test;
4
5 public class BinarySearchNonRecursive {
6
7 private static int binarySearch(int[] arr, int target) {
8 int left = 0;
9 int right = arr.length - 1;
10 while (left <= right) {
11 int mid = (left + right) / 2;
12 if (arr[mid] == target) {
13 return mid;
14 } else if (arr[mid] > target) {
15 right = mid - 1; // 向左找
16 } else {
17 left = mid + 1; // 向右找
18 }
19 }
20 return -1;
21 }
22
23
24 @Test
25 public void main() {
26 int[] arr = {1, 3, 8, 10, 11, 67, 100};
27 int index = binarySearch(arr, 67);
28 if (index != -1) {
29 System.out.println("找到了,下标为:" + index);
30 } else {
31 System.out.println("没有找到--");
32 }
33 }
34
35
36 }
时间复杂度是怎么算出来的
折半查找(Binary Search),也称为二分查找,是一种在有序数组中查找特定元素的高效算法。下面详细介绍其时间复杂度的计算过程。
折半查找的基本思想是:对于一个有序数组,首先比较待查找元素与数组中间元素的大小。如果待查找元素等于中间元素,则查找成功;如果待查找元素小于中间元素,则在数组的前半部分继续进行折半查找;如果待查找元素大于中间元素,则在数组的后半部分继续进行折半查找。重复这个过程,直到找到目标元素或确定目标元素不存在。
假设数组的长度为 \(n\),在每一次查找中,折半查找都会将查找范围缩小一半。
- 第一次查找时,查找范围是整个数组,长度为 \(n\)。
- 第二次查找时,查找范围缩小为原来的一半,即 \(\frac{n}{2}\)。
- 第三次查找时,查找范围进一步缩小为 \(\frac{n}{2^2}\)。
- 以此类推,经过 \(k\) 次查找后,查找范围变为 \(\frac{n}{2^k}\)。
在最坏情况下,折半查找会一直进行到查找范围缩小为 1 个元素,此时才能确定目标元素是否存在。也就是说,当 \(\frac{n}{2^k}=1\) 时,查找结束。
对 \(\frac{n}{2^k}=1\) 进行求解,可得到 \(k\) 的值: \( \begin{align*} \frac{n}{2^k}&=1\\ n&=2^k\\ k&=\log_2 n \end{align*} \)
这里的 \(k\) 表示在最坏情况下折半查找所需的比较次数。
时间复杂度是用来衡量算法执行时间随输入规模增长而增长的趋势。在算法分析中,通常使用大 \(O\) 表示法来描述时间复杂度。大 \(O\) 表示法关注的是算法在最坏情况下的时间复杂度,即算法执行时间的上界。
由于折半查找在最坏情况下的比较次数为 \(\log_2 n\),因此折半查找的时间复杂度为 \(O(\log n)\)。这里省略了对数的底数 2,是因为在大 \(O\) 表示法中,不同底数的对数之间只相差一个常数因子,而大 \(O\) 表示法忽略常数因子,所以所有对数时间复杂度都可以统一表示为 \(O(\log n)\)。
折半查找通过每次将查找范围缩小一半的方式,使得查找效率大大提高。其时间复杂度为 \(O(\log n)\),这意味着随着数组长度 \(n\) 的增加,查找所需的时间增长速度相对较慢,因此折半查找在处理大规模有序数据时非常高效。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
2015-05-13 WINDOWS权限大牛们,请进