代码改变世界

拆半查找算法

  钟铧若岩  阅读(31)  评论(0编辑  收藏  举报

 

复制代码
 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),也称为二分查找,是一种在有序数组中查找特定元素的高效算法。下面详细介绍其时间复杂度的计算过程。

折半查找算法原理

折半查找的基本思想是:对于一个有序数组,首先比较待查找元素与数组中间元素的大小。如果待查找元素等于中间元素,则查找成功;如果待查找元素小于中间元素,则在数组的前半部分继续进行折半查找;如果待查找元素大于中间元素,则在数组的后半部分继续进行折半查找。重复这个过程,直到找到目标元素或确定目标元素不存在。

时间复杂度计算

1. 分析查找过程

假设数组的长度为 \(n\),在每一次查找中,折半查找都会将查找范围缩小一半。
  • 第一次查找时,查找范围是整个数组,长度为 \(n\)。
  • 第二次查找时,查找范围缩小为原来的一半,即 \(\frac{n}{2}\)。
  • 第三次查找时,查找范围进一步缩小为 \(\frac{n}{2^2}\)。
  • 以此类推,经过 \(k\) 次查找后,查找范围变为 \(\frac{n}{2^k}\)。

2. 确定最坏情况下的查找次数

在最坏情况下,折半查找会一直进行到查找范围缩小为 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\) 表示在最坏情况下折半查找所需的比较次数。

3. 根据时间复杂度定义确定复杂度

时间复杂度是用来衡量算法执行时间随输入规模增长而增长的趋势。在算法分析中,通常使用大 \(O\) 表示法来描述时间复杂度。大 \(O\) 表示法关注的是算法在最坏情况下的时间复杂度,即算法执行时间的上界。
由于折半查找在最坏情况下的比较次数为 \(\log_2 n\),因此折半查找的时间复杂度为 \(O(\log n)\)。这里省略了对数的底数 2,是因为在大 \(O\) 表示法中,不同底数的对数之间只相差一个常数因子,而大 \(O\) 表示法忽略常数因子,所以所有对数时间复杂度都可以统一表示为 \(O(\log n)\)。

总结

折半查找通过每次将查找范围缩小一半的方式,使得查找效率大大提高。其时间复杂度为 \(O(\log n)\),这意味着随着数组长度 \(n\) 的增加,查找所需的时间增长速度相对较慢,因此折半查找在处理大规模有序数据时非常高效。

 

相关博文:
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
历史上的今天:
2015-05-13 WINDOWS权限大牛们,请进
点击右上角即可分享
微信分享提示