【补】搜索
在这里,汇集了搜索算法,包括线性查找、二分查找等。
线性查找(Linear Search)
代码实现
1 |
|
算法解析
这是最基本的查找算法,也是最简单的一种。
- 遍历数组
- for (int i = 0; i < 10; i++),依次检查 nums[i]
- 判断是否匹配
- if (nums[i] == find),如果找到目标值,就输出索引 i
- 提前返回
- return 0; 避免多余的遍历,提高效率
- 未找到时输出 “Not found”
- 遍历结束仍然没找到目标值,则打印 “Not found”
时间复杂度为 O(n),适用于无序数组,或小规模数据
二分查找(Binary Search)
代码实现
1 |
|
算法解析
- 初始化
- nums 数组被初始化为 {1, 2, 3, …, 10},即 升序排列。
- left = 0, right = 9,分别表示搜索范围的 左端 和 右端。
- mid = (left + right) / 2,计算当前范围的 中间元素。
- 查找过程
- 如果 nums[mid] > find,说明目标在 左半部分,所以更新 right = mid - 1。
- 如果 nums[mid] < find,说明目标在 右半部分,所以更新 left = mid + 1。
- 如果 nums[mid] == find,找到目标,输出索引并终止程序。
- 终止条件
- 找到目标时,输出其索引并返回。
- 若 left > right,表示搜索范围为空,目标元素不存在,输出 “Not found”。
时间复杂度
二分查找的时间复杂度是 O(log N),原因是:
- 每次查找 都会把搜索范围缩小一半。
- 长度为 N 的数组,最多 log₂(N) 次 就能找到目标。
对于 N = 10:
最多 log₂(10) ≈ 3.3 ≈ 4 次迭代。
对于 n = 1,000,000:
最多 log₂(1000000) ≈ 20 次迭代,而线性查找 O(n) 最坏要 1,000,000 次。
仅适用于有序数组,为了使用二分查找而对数组进行排序是得不偿失的。
线性查找与二份查找对比
对比项 | 线性查找 | 二分查找 |
---|---|---|
数据要求 | 无序、有序都可以 | 必须有序 |
时间复杂度(最坏情况) | O(N) | O(log N) |
小规模数据 | 快 | 慢 |
大规模数据 | 慢 | 快 |
空间复杂度 | O(1) | O(1)(迭代)/ O(log N)(递归) |
适用场景 | 小数据、无序数组 | 大数据、有序数组 |
情况 | 建议使用 |
---|---|
无序数组 | 线性查找 |
小数据集(N ≤ 100) | 线性查找 |
大数据集(N ≥ 1000)且有序 | 二分查找 |
链表存储 | 线性查找 |
频繁插入/删除数据 | 线性查找(或哈希表) |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 技研录!
评论