【21天算法学习】折半查找

简介: 【21天算法学习】折半查找

作者简介:

🍀姓姜,字君竹。

🍁浅薄观点:科以载文,文以载道

🌱软件技术升计科,计划考研

🌾要有最朴素的生活和最遥远的梦想,即使明日,天寒地冻,路遥马亡


概念及介绍

1.  折半查找(搜索),也称二分查找(搜索)、对数搜索,是一种在有序数组中查找某一特定元素的搜索算法。

 搜索从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索结束。如果要查找的元素大于或者小于之中间元素,则在数组大于或小于中间元素的那一半中查找,且也是从这一半的中间元素开始比较。然后一直重复上述流程,直到找的要找的元素,或者找完不能再折半查找为止。这种搜索算法每一次比较都使得搜索范围缩小了一半。

 折半查找查找速度快、次数少、平均性能好,但查找对象必须是有序的,且很难实现插入删除。所以折半查找使用不常变动且需要频繁查找的有序列表。


2.时间空间复杂度

 时间复杂度与寻找次数相关,如果要寻找的值第一次就找到了,则此时的时间复杂度为常数级O(1)。折半查找每查找一次,搜索空间就会折半,所以折半查找正常的时间复杂度是一个以2位底,相对于n的对数O(log2n)。

 折半算法并没有改变原有的元素集合,只需要几个变量记录相关信息,所以空间复杂度为常量级O(1)。


3.图解



6bdf088ad6964267bef473dc0930e559.png


  1. 代码实现
int main() {
  int a[] = { 0, 12, 23, 24, 25, 34, 45, 56, 67, 68, 78, 89, 90 };
  int key = 24;
  int left = 0;
  int right = sizeof(a) / sizeof(a[0]) - 1;
  while (left <= right) {
    int mid = (left + right) / 2;
    if (a[mid] == key) {
      printf("下标是%d", mid);
      return 0;
    }
    else if (a[mid] < key)
      left = mid + 1;
    else if (a[mid] > mid)
      right = mid - 1;
  }
  if (left > right) {
    printf("没找到");
  }
  return 0;
}


学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。

目录
相关文章
|
3天前
|
XML JavaScript 前端开发
学习react基础(1)_虚拟dom、diff算法、函数和class创建组件
本文介绍了React的核心概念,包括虚拟DOM、Diff算法以及如何通过函数和类创建React组件。
14 2
|
1月前
|
机器学习/深度学习 人工智能 资源调度
【博士每天一篇文献-算法】连续学习算法之HAT: Overcoming catastrophic forgetting with hard attention to the task
本文介绍了一种名为Hard Attention to the Task (HAT)的连续学习算法,通过学习几乎二值的注意力向量来克服灾难性遗忘问题,同时不影响当前任务的学习,并通过实验验证了其在减少遗忘方面的有效性。
48 12
|
1月前
|
算法 Java
掌握算法学习之字符串经典用法
文章总结了字符串在算法领域的经典用法,特别是通过双指针法来实现字符串的反转操作,并提供了LeetCode上相关题目的Java代码实现,强调了掌握这些技巧对于提升算法思维的重要性。
|
1月前
|
算法 NoSQL 中间件
go语言后端开发学习(六) ——基于雪花算法生成用户ID
本文介绍了分布式ID生成中的Snowflake(雪花)算法。为解决用户ID安全性与唯一性问题,Snowflake算法生成的ID具备全局唯一性、递增性、高可用性和高性能性等特点。64位ID由符号位(固定为0)、41位时间戳、10位标识位(含数据中心与机器ID)及12位序列号组成。面对ID重复风险,可通过预分配、动态或统一分配标识位解决。Go语言实现示例展示了如何使用第三方包`sonyflake`生成ID,确保不同节点产生的ID始终唯一。
go语言后端开发学习(六) ——基于雪花算法生成用户ID
|
1月前
|
存储 机器学习/深度学习 算法
【博士每天一篇文献-算法】连续学习算法之HNet:Continual learning with hypernetworks
本文提出了一种基于任务条件超网络(Hypernetworks)的持续学习模型,通过超网络生成目标网络权重并结合正则化技术减少灾难性遗忘,实现有效的任务顺序学习与长期记忆保持。
34 4
|
1月前
|
存储 机器学习/深度学习 算法
【博士每天一篇文献-算法】连续学习算法之RWalk:Riemannian Walk for Incremental Learning Understanding
RWalk算法是一种增量学习框架,通过结合EWC++和修改版的Path Integral算法,并采用不同的采样策略存储先前任务的代表性子集,以量化和平衡遗忘和固执,实现在学习新任务的同时保留旧任务的知识。
74 3
|
1月前
|
存储 机器学习/深度学习 算法
【博士每天一篇文献-综述】基于脑启发的连续学习算法有哪些?附思维导图
这篇博客文章总结了连续学习的分类,包括经典方法(重放、正则化和稀疏化方法)和脑启发方法(突触启发、双系统启发、睡眠启发和模块化启发方法),并讨论了它们在解决灾难性遗忘问题上的优势和局限性。
28 2
|
2月前
|
机器学习/深度学习 数据采集 算法
Python实现ISSA融合反向学习与Levy飞行策略的改进麻雀优化算法优化支持向量机回归模型(SVR算法)项目实战
Python实现ISSA融合反向学习与Levy飞行策略的改进麻雀优化算法优化支持向量机回归模型(SVR算法)项目实战
106 9
|
2月前
|
机器学习/深度学习 数据采集 算法
Python实现ISSA融合反向学习与Levy飞行策略的改进麻雀优化算法优化支持向量机分类模型(SVC算法)项目实战
Python实现ISSA融合反向学习与Levy飞行策略的改进麻雀优化算法优化支持向量机分类模型(SVC算法)项目实战
|
2月前
|
机器学习/深度学习 数据采集 监控
算法金 | DL 骚操作扫盲,神经网络设计与选择、参数初始化与优化、学习率调整与正则化、Loss Function、Bad Gradient
**神经网络与AI学习概览** - 探讨神经网络设计,包括MLP、RNN、CNN,激活函数如ReLU,以及隐藏层设计,强调网络结构与任务匹配。 - 参数初始化与优化涉及Xavier/He初始化,权重和偏置初始化,优化算法如SGD、Adam,针对不同场景选择。 - 学习率调整与正则化,如动态学习率、L1/L2正则化、早停法和Dropout,以改善训练和泛化。
30 0
算法金 | DL 骚操作扫盲,神经网络设计与选择、参数初始化与优化、学习率调整与正则化、Loss Function、Bad Gradient