【数据结构与算法】 - 时间复杂度和空间复杂度、二分查找、线性查找

数据结构与算法

    • 1. 数据结构的定义
    • 2. 二分查找
      • 2.1 二分查找的定义
      • 2.2 二分查找分析
      • 2.3 二分查找实现
      • 2.4 二分查找算法图解
      • 2.5 二分算法引发的问题
      • 2.6 二分算法改良版
      • 2.7 二分算法改良版解析
      • 2.8 二分算法改良版图解
      • 2.9 二分算法改良版注意事项
    • 3. 时间复杂度
      • 3.1 时间复杂度的概念
      • 3.2 线性查找的时间复杂度
      • 3.3 二分算法的时间复杂度
      • 3.4 不同的时间复杂度对比
    • 4. 空间复杂度
      • 4.1 空间复杂度概念
      • 4.2 空间复杂度的计算

1. 数据结构的定义

在计算机科学领域,数据结构是一种数据组织、管理和存储格式,通常被选择用来高效访问数据。

2. 二分查找

2.1 二分查找的定义

二分查找算法也称折半查找,是在一个升序数组中,查找要需要找的值,如果找到就返回该数的索引,否则返回-1

2.2 二分查找分析

(1) 定义两个变量分别是i和j,i默认的索引为0,j默认的索引为指定数组的最后一个元素的索引
(2) 如果i>j,说明没找到该元素
(3) 定义一个变量m,m为中间索引
(4) 如果target < a[m],j = m-1
(5)如果a[m] < target,i = m+1
(6)如果 a[m] = target,说明找到,返回该值的索引

2.3 二分查找实现

 // 二分查找 - 基础版public static int binarySearch(int a[], int target) {int i = 0;int j = a.length - 1;while (i <= j) {int m = (i + j) / 2;if (a[m] < target) {i = m + 1;} else if (target < a[m]) {j = m - 1;} else {return m;}}return -1;}

2.4 二分查找算法图解

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.5 二分算法引发的问题

问题1:为什么是 i <= j ? 而不是 i < j呢?

因为当i == j,i,j 它们共同指向的元素也会参与比较
如果是i < j,意味着只有m指向的元素参与比较
这样可能会造成有些元素在数组中无法找到

问题2:(i + j) / 2 会产生的问题

因为当二分查找时,一个数组的元素足够的多时,
(i + j) / 2 会超过了整数的最大值。

给大家举个例子:

    @Testpublic void test4() {int i = 0;int j = Integer.MAX_VALUE - 1;System.out.println("整数最大值:" + Integer.MAX_VALUE);int m = (i + j) / 2;i = m + 1;System.out.println("i = " + i);System.out.println("j = " + j);System.out.println(i + j);// 出现这一现象的原因是,两数相加超过了整数的最大值}

为什么两个整数相加会出现负数呢?

在这里插入图片描述

这是因为int类型的整数的最大值是2147483647,这两个数相加已经超出了一个int类型的数的最大值,所以会出现负数,又因为Java中没有无符号数,所有数都是有符号数,所以会出现这种情况

在这里插入图片描述

解决方法:采用无符号右移 >>> ,不保留符号位右移,高位补0

public static int binarySearchBasic(int[] a, int target) {int i = 0, j = a.length - 1;while (i <= j) {int m = (i + j) >>> 1;   // 这里与之前相比采用 >>> 来代替除号if (a[m] < target) {i = m + 1;}else if (target < a[m]) {j = m - 1;} else {return m;}}return -1;}

2.6 二分算法改良版

基于上面的二分计算基础版,还可以再改善

public static int binarySearchAlternative(int[] a, int target) {int i = 0, j = a.length;while (i < j) {int m = (i + j) >>> 1;if (a[m] < target) {// 此时i只是作为边界,而不参与运算i = m + 1;} else if (target < a[m]) {j = m;} else {return m;}}return -1;}

2.7 二分算法改良版解析

假如在数组中查找元素14,这时j指向的是数组的最后一个元素的索引加1,说的简单点,这个 j 指向的是边界

    public static int binarySearchAlternative(int[] a, int target) {int i = 0;int j = a.length;  // 与之前不同while (i < j) {  // 与之前不同int m = (i + j) >>> 1;if (a[m] > target) {j = m; // 与之前不同 } else if (a[m] < target) {i = m + 1;} else {return m;}}return -1;}

2.8 二分算法改良版图解

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

注意:此时j不参与运算

2.9 二分算法改良版注意事项

这里如果是 i<=j 并且查找的元素不在数组中会造成无限循环,前面也说过了,j指向的元素是边界,所以i=j时说明要查找的元素不在该数组中

    public static int binarySearchAlternative(int[] a, int target) {int i = 0, j = a.length;while (i <= j) {int m = (i + j) >>> 1;if (a[m] < target) {i = m + 1;} else if (target < a[m]) {j = m;} else {return m;}}return -1;}

3. 时间复杂度

请添加图片描述

3.1 时间复杂度的概念

时间复杂度是用来衡量:一个算法的执行,随数据规模增大,而增长的时间成本,利用大O来表示

  • 如果运行时间是常数量级, 则用常数1表示
  • 只保留间中的最高阶项
  • 如果最高阶项存在, 则省去最高阶项前面的系数

3.2 线性查找的时间复杂度

    public static int linearSearch(int[] a, int target) {for (int i = 0; i < a.length; i++) {if (a[i] == target) {return i;}}return -1;}

要计算一个算法的时间复杂度,就要考虑该算法的最坏情况,假设该数组中有n个元素

int i = 0;    1次
i < a.length; n + 1次
i++           n次
a[i]==target  n次
return -1;    1次
3 * n + 3  
  • 粗略认为每行代码执行时间是 t t t,假设 n = 4 n=4 n=4 那么总执行时间是 ( 1 + 4 + 1 + 4 + 4 + 1 ) ∗ t = 15 t (1+4+1+4+4+1)*t = 15t (1+4+1+4+4+1)t=15t
  • 可以推导公式为, T = ( 3 ∗ n + 3 ) t T = (3*n+3)t T=(3n+3)t

然后只保留最高阶项,再去掉最高阶项的系数
所以它的时间复杂度就是 O ( n ) O(n) O(n)

3.3 二分算法的时间复杂度

  考虑二分查找最坏的情况1 [2,3,4,5] 5 右侧没找到时,情况更差int i = 0,j = a.length-1;         2return -1;                        1元素个数              循环次数4-7                   3           floor(log_2(4))  = 2+18-15                  4           floor(log_2(8))  = 3+116-31                 5           floor(log_2(16)) = 4+132-63                 6           floor(log_2(32)) = 5+1....                 ...循环次数:floor(log_2(n)) + 1 , 我们把它看成L这里使用到了floor()方法,是因为当元素个数小于4的时就向下取整i<=j                  L+1int m = (i+j)>>>1     La[m] < target         Ltarget < a[m]         Li = m+1               L((floor(log_2(n)) + 1) * 5) + 4     ->  最糟糕的情况

这里也是只保留最高项,然后去掉底数所以它的时间复杂度为 l o g ( n ) log(n) log(n)

3.4 不同的时间复杂度对比

在这里插入图片描述
从上图中不难看出,当数据量足够大的时候,所消耗的时间为: O ( 1 ) O(1) O(1) < O ( l o g n ) O(logn) O(logn)< O ( n ) O(n) O(n)< O ( n 2 ) O(n^2) O(n2)< O ( n 3 ) O(n^3) O(n3)

4. 空间复杂度

4.1 空间复杂度概念

与时间复杂度类似,一般也使用大 O O O 表示法来衡量:一个算法执行随数据规模增大,而增长的额外空间成本

4.2 空间复杂度的计算

public static int binarySearchBasic(int[] a, int target) {int i = 0, j = a.length - 1;    while (i <= j) {               int m = (i + j) >>> 1;if(target < a[m]) {        j = m - 1;} else if (a[m] < target) { i = m + 1;} else {                    return m;}}return -1;
}

这里因为是3个变量, i ,j , m ,一个int是4个字节
3 * 4B = 12B,同上面的时间复杂度,当它只有一个常数项时,它的空间复杂度为 O ( 1 ) O(1) O(1)

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/89576.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【c语言中数组和指针的联系】

C语言中的数组和指针之间存在紧密的联系&#xff0c;因为数组名本质上就是指向数组首元素的指针。这种联系使得在处理数组时可以像处理指针一样操作&#xff0c;同时也使得数组和指针可以互相转换。 下面详细说明数组和指针之间的联系&#xff0c;并提供一些示例来演示这种联系…

LeetCode算法二叉树—226. 翻转二叉树

目录 226. 翻转二叉树 代码&#xff1a; 运行结果&#xff1a; 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1]示例 2&#xff1a; 输入…

OpenCV读取图像时按照BGR的顺序HWC排列,PyTorch按照RGB的顺序CHW排列

OpenCV读取RGB图像 在OpenCV中&#xff0c;读取的图片默认是HWC格式&#xff0c;即按照高度、宽度和通道数的顺序排列图像尺寸的格式。我们看最后一个维度是C&#xff0c;因此最小颗粒度是C。 例如&#xff0c;一张形状为2562563的RGB图像&#xff0c;在OpenCV中读取后的格式…

IDEA 启动 java web 老项目

背景&#xff1a;一套 java web 老代码&#xff0c;使用 eclipse 工具开发。内网&#xff0c;无 eclipse 开发工具&#xff0c;只有 IDEA。 代码目录结构如下&#xff1a; demo/.settings/* demo/src/com/demo/controller/* demo/webapp/js/* demo/webapp/jsp/* demo/webapp/M…

MySQL学习笔记18

MySQL的备份与恢复&#xff1a; 制定数据库备份策略进行备份&#xff0c;并且把数据导入到测试环境。 核心技术&#xff1a; 1&#xff09;掌握MySQL的备份工具使用及各自特点&#xff1b; 2&#xff09;熟悉Shell脚本&#xff1b; 3&#xff09;熟悉MySQL数据的导入导出&a…

数据计算-第15届蓝桥杯第一次STEMA测评Scratch真题精选

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥杯真题&#xff0c;这是Scratch蓝桥杯真题解析第154讲。 第15届蓝桥杯第1次STEMA测评已于2023年8月20日落下帷幕&#xff0c;编程题一共有6题&#xff0c;分别如下&a…

浅谈安科瑞ADL系列导轨式多功能仪表在迪拜楼宇EMS中的应用

摘要&#xff1a;用户端消耗着整个电网80%的电能&#xff0c;用户端智能化用电管理对用户可靠、安全、节约用电有十分重要的意义。构建智能用电服务体系&#xff0c;推广用户端智能多功能仪表、智能用电管理终端等设备用电管理解决方案&#xff0c;实现电网与用户的双向良性互动…

计算机网络 - 应用层

计算机网络 - 应用层 计算机网络 - 应用层 域名系统文件传送协议动态主机配置协议远程登录协议电子邮件协议 1. SMTP2. POP33. IMAP 常用端口Web 页面请求过程 1. DHCP 配置主机信息2. ARP 解析 MAC 地址3. DNS 解析域名4. HTTP 请求页面 域名系统 DNS 是一个分布式数据库&a…

ChatGPT批量写作文章软件

什么是ChatGPT批量写作文章。简单来说&#xff0c;它是一种使用ChatGPT技术的方法&#xff0c;可以帮助您批量生成各种类型的文章和内容。无论您是需要新闻报道、博客文章、产品描述、社交媒体帖子还是其他类型的内容&#xff0c;ChatGPT都能满足您的需求。它可以在极短的时间内…

BabelEdit 5.0.1 Crack

BabelEdit加强软件本地化。BabelEdit 是处理 json、yaml、php、arb、vue、properties、resx 或 xliff 翻译文件的可靠解决方案。 旨在使开发过程更加简化和高效。 下载BabelEdit 5.0.0 对于Windows 也适用于macOS 和 Linux BabelEdit - 适用于 Web 和应用程序的翻译编辑器 (…

关键点检测 HRNet网络详解笔记

关键点检测 HRNet网络详解笔记 0、COCO数据集百度云下载地址1、背景介绍2、HRNet网络结构3、预测结果&#xff08;heatmap&#xff09;的可视化3、COCO数据集中标注的17个关键点4、损失的计算5、评价准则6、数据增强7、模型训练 论文名称&#xff1a; Deep High-Resolution Rep…

企业级磁盘阵列存储系统由硬到软全析

企业级磁盘阵列是由一组设备构成的存储系统,主要包括两种类型的设备,分别是控制器和扩展柜,其中控制器只有一台,扩展柜可以没有,也可以有多台。在EMC的Unity中分别称为DPE(Disk Processor Enclosure)和DAE(Disk Array Enclosure),在华为的OceanStor里面称为控制框和硬…

聚观早报 | 中国队拿下亚运会电竞项目首金;B站发布68部国创片单

【聚观365】9月28日消息 中国队拿下亚运会电竞项目首金 B站发布68部国创片单 支付宝持续加大流量开放 起点有声书《宿命之环》等大作陆续上线 方程豹豹5详细配置公开 中国队拿下亚运会电竞项目首金 杭州2022年第19届亚运会官网发布公告称&#xff0c;在昨日的杭州第19届亚…

ubuntu20.04下源码编译colmap

由于稠密重建需要CUDA&#xff0c;因此先安装CUDA&#xff0c;我使用的是3050GPU&#xff0c;nvidia-smi显示最高支持CUDA11.4。 不要用sudo apt安装&#xff0c;版本较低&#xff0c;30系显卡建议安装CUDA11.0以上&#xff0c;这里安装了11.1版本。 下载&#xff1a; cuda_1…

分享从零开始学习网络设备配置--任务3.5 使用静态路由实现网络连通

任务描述 某公司规模较小&#xff0c;该公司的网络管理员经过考虑&#xff0c;决定在公司的路由器、交换机与运营商路由器之间使用静态路由&#xff0c;实现网络的互连。 静态路由一般适用于比较简单的网络环境。在这样的环境中&#xff0c;网络管理员应非常清楚地了解网络…

网络爬虫——urllib(1)

前言&#x1f36d; ❤️❤️❤️网络爬虫专栏更新中&#xff0c;各位大佬觉得写得不错&#xff0c;支持一下&#xff0c;感谢了&#xff01;❤️❤️❤️ 前篇简单介绍了什么是网络爬虫及相关概念&#xff0c;这篇开始讲解爬虫中的第一个库——urllib。 urllib&#x1f36d; …

PPT系统化学习 - 第1天

文章目录 更改PPT主题更改最大撤回次数自动保存禁止PPT压缩图片字体嵌入PPTPPT导出为PDFPPT导出为图片PPT导出为图片型幻灯片PPT导出成视频添加参考线设置默认字体设置默认形状建立模板、保存模板、使用模板建立模板保存模板使用模板 更改PPT主题 更改PPT的主题&#xff1a; 夜…

图像处理: ImageKit.NET 3.0.10704 Crack

关于 ImageKit.NET3 100% 原生 .NET 图像处理组件。 ImageKit.NET 可让您快速轻松地向 .NET 应用程序添加图像处理功能。从 TWAIN 扫描仪和数码相机检索图像&#xff1b;加载和保存多种格式的图像文件&#xff1b;对图像应用图像滤镜和变换&#xff1b;在显示屏、平移窗口或缩略…

基于springboot+vue的新闻推荐系统

目录 前言 一、技术栈 二、系统功能介绍 管理员模块的实现 用户信息管理 排行榜管理 新闻信息管理 用户模块的实现 首页信息 新闻信息 我的收藏 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息互联网购物的飞速发展&#xff0c;国内放开了自…

基于springboot实现二手交易平台管理系统演示【项目源码】分享

基于springboot实现二手交易平台管理系统演示 java简介 Java语言是在二十世纪末由Sun公司发布的&#xff0c;而且公开源代码&#xff0c;这一优点吸引了许多世界各地优秀的编程爱好者&#xff0c;也使得他们开发出当时一款又一款经典好玩的小游戏。Java语言是纯面向对象语言之…