【密--码--破--译】暴力查找与二分查找

简介: 【密--码--破--译】暴力查找与二分查找

一.前言

生活中查找的例子数不胜数,比如查字典,找东西等。查找是算法数据结构的基础,重中之重,下文我将向大家介绍两种常见查找算法------ 暴力查找和二分查找。在破译密码学里,最常见的跑字典破译密码多半使用的算法便是暴力破解,让我们一起来回顾一下它的原理吧。

1.1两种算法的介绍

  • 暴力查找
    暴力查找是指依次遍历元素查找对应元素,常用于线性表元素的查找。我们大学学习《算法数据结构》一定会和它打交道的。最常见的运用就是数组元素的遍历啦!一维数组就是计算机内存开辟的连续单元内存,可以以此存入元素,和链表及其队列的差别也在于此。暴力查找在时间复杂度和空间复杂度上不占优势,当数据量庞大的时候,对计算机执行性能就会有较高要求。
  • 二分查找
    二分查找又叫做折半查找。发挥计算机死板计算,可以灵活开辟内存计算的优势,让计算机对顺序表分别从头部,中间和尾部进行遍历比较。其查找效率高于上面介绍的算法。
  • 两种算法使用条件:
  1. 顺序表
  2. 线性表+一维数组

二.算法图解

2.1例题引入与剖析

LeetCode的剑指offer系列里有呢么一道例题可以作为我们的学习案列

这道题有两个隐藏条件:

  1. 顺序表
  2. 线性表+一维数组

其实拿到这个题的时候,我的第一个思路就是暴力查找:【java作为示范语言】

class Solution {
    public int search(int[] nums, int target) {
        int res=0;
        for(int i=0;i<nums.length;i++)
                if(nums[i]==target)
                    res++;
        return res;
            
    }
}

一遍过了,但是看执行效率并不高,于是我用二分查找写了一个:

class Solution {
    public int search(int[] nums, int target) {
       int left = 0, right = nums.length;
        int ans = 0;
        while (left < right){
            int mid = left + ((right - left)/2);
            if (nums[mid] >= target){
                right = mid;
            } else {
                left = mid + 1;
            }
        }
        while (left < nums.length && nums[left++] == target){
            ans++;
        }
        return ans;
            
    }
}

暴力查找是很简单的思路,以此遍历思路即可。重点介绍二分法:

取顺序表的中间那个元素mid,然后用中间的元素mid和待查找元素x进

行比较大小,以此改变下次的查找区间,使得下次的查找区间缩短一半,所以它又叫折半查找,这样就可节省一半的时间,极大的提高了效率。

根据题意我手写笔记分析一下题目:

我们根据题意顺序存入以下数据,定义好 left right mid三个指针。

  • 在这里用“指针”这个词是不恰当的,但这是我的习惯,更方便与理解。我们学C语言的时候指针概念用的多,在 java里没有指针概念。但我希望大家这么理解,为什么呢?因为指针的“指”向对象是元素的 位置,而不是值!!我一说指针,你的第一反应应该是元素的位置,而不是元素本身。如果我说 定义好 left right mid三个变量,那么你就会理解成元素本身。
  • 定义一个计数器变量 ans
  • 第一个需要查找的元素是 数字8。先让它和 mid指针指向的元素进行比较,显然 8>7,所以收紧 left指针, left指针指向了下标为3的元素;接着 mid指针又指向 leftright指针的中间元素。以此循环,循环条件为:
while(left<right){}

三.总结

以上结合了一个例题给大家介绍了一下暴力查找和二分查找的区别。有什么不懂得问题可以通过公众号私信我。goodbye!

目录
相关文章
|
24天前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
17天前
|
存储 关系型数据库 分布式数据库
GraphRAG:基于PolarDB+通义千问+LangChain的知识图谱+大模型最佳实践
本文介绍了如何使用PolarDB、通义千问和LangChain搭建GraphRAG系统,结合知识图谱和向量检索提升问答质量。通过实例展示了单独使用向量检索和图检索的局限性,并通过图+向量联合搜索增强了问答准确性。PolarDB支持AGE图引擎和pgvector插件,实现图数据和向量数据的统一存储与检索,提升了RAG系统的性能和效果。
|
4天前
|
JSON 自然语言处理 数据管理
阿里云百炼产品月刊【2024年9月】
阿里云百炼产品月刊【2024年9月】,涵盖本月产品和功能发布、活动,应用实践等内容,帮助您快速了解阿里云百炼产品的最新动态。
阿里云百炼产品月刊【2024年9月】
|
1天前
|
人工智能 Rust Java
10月更文挑战赛火热启动,坚持热爱坚持创作!
开发者社区10月更文挑战,寻找热爱技术内容创作的你,欢迎来创作!
219 12
|
19天前
|
人工智能 IDE 程序员
期盼已久!通义灵码 AI 程序员开启邀测,全流程开发仅用几分钟
在云栖大会上,阿里云云原生应用平台负责人丁宇宣布,「通义灵码」完成全面升级,并正式发布 AI 程序员。
|
21天前
|
机器学习/深度学习 算法 大数据
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
2024“华为杯”数学建模竞赛,对ABCDEF每个题进行详细的分析,涵盖风电场功率优化、WLAN网络吞吐量、磁性元件损耗建模、地理环境问题、高速公路应急车道启用和X射线脉冲星建模等多领域问题,解析了问题类型、专业和技能的需要。
2578 22
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
|
3天前
|
存储 人工智能 搜索推荐
数据治理,是时候打破刻板印象了
瓴羊智能数据建设与治理产品Datapin全面升级,可演进扩展的数据架构体系为企业数据治理预留发展空间,推出敏捷版用以解决企业数据量不大但需构建数据的场景问题,基于大模型打造的DataAgent更是为企业用好数据资产提供了便利。
168 2
|
1天前
|
编译器 C#
C#多态概述:通过继承实现的不同对象调用相同的方法,表现出不同的行为
C#多态概述:通过继承实现的不同对象调用相同的方法,表现出不同的行为
101 65
|
21天前
|
机器学习/深度学习 算法 数据可视化
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
2024年中国研究生数学建模竞赛C题聚焦磁性元件磁芯损耗建模。题目背景介绍了电能变换技术的发展与应用,强调磁性元件在功率变换器中的重要性。磁芯损耗受多种因素影响,现有模型难以精确预测。题目要求通过数据分析建立高精度磁芯损耗模型。具体任务包括励磁波形分类、修正斯坦麦茨方程、分析影响因素、构建预测模型及优化设计条件。涉及数据预处理、特征提取、机器学习及优化算法等技术。适合电气、材料、计算机等多个专业学生参与。
1578 16
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
|
4天前
|
Linux 虚拟化 开发者
一键将CentOs的yum源更换为国内阿里yum源
一键将CentOs的yum源更换为国内阿里yum源
251 2