数据结构与算法 :数据结构绪论,时间和空间复杂度 推导大O阶

各位少年 大家好 我是博主那一脸阳光,今天开始给大家分享数据结构,由于我个人当初学的时候是自学,并没有看培训机构的视频 所以接下来我分享的数据结构的内容,源头来自一本书叫做大话数据结构。顺便一提为了方面大家理解,我们会用一些漫画算法系列的插图的

 漫谈数据结构

什么是数据结构呢?这个词很有意思,之前我学计算机组成原理时候有一个知识点叫做图灵模型

我把它引用出来,大家可以思考一下。

大家看上面的图 我们输入数据‘(具体怎么输入不用管,然后到计算机,最后输出数据。哪个程序的大家暂时不用管,这就是我们计算机科学中祖师爷之一图灵的图灵模型设计。我们明白计算机的本质是需要数据的 有数据计算机才能运行。

那数据结构到底是什么呢?

官方的话是 :

数据结构(Data Structure)是计算机存储,组织数据的方式,指相互之间存在一种或多种特定的关系的数据元素。可以类比到我们现实生活中,看下图每个人,都有每个人交往的关系,如果你没有这么复杂的关系图,那么我应该劝导你,C++之父曾说过数独的人是做不好程序员的。你一辈子都会是个只会敲代
码的码农。

浅谈算法定义 

什么是算法?

算法(Algorlthm):就是定义良好的计算过程,他取一个或一组的值为输入,并产生出一个或一组值作为输出。简单来说算法就是一系列计算步骤,用来将输入数据转化成数据结果。

大家可能不理解,那么我就举个例子吧。

上面例子中举例了一个数学问题,1一直加到100的值,很显然如果我们一步一步的进行计算

非常的麻烦,时间效率非常高,如果用算法解释非常的简单了。(1+100)*50=5050

算法和数据结构的关系。

我们这门课程叫数据结构,但很多时候我们会讲到算法,以及它们之间的关系,市场上也会有不少书的书名为《数据结构与算法分析》

 有人可能要问到,数据结构和算法关系到底是什么样子呢?

我举个例子

今天是你女友的生日,你打算请女友去看爱情音乐剧,到了戏院,抬头一看《梁山伯》18.00点开演。嗯,怎么都是这样?一问才知,今天饰演祝英台演员生病,所以梁山伯唱独角戏。真是搞笑这还有什么看头。事实上,数据结构和算法也是类似的关系。

单谈数据结构就没意义了,所以我们会提到算法这个定义。算法和数据结构是不可以分开的。

正所谓巧妇难为无米之炊。

时间复杂度和空间复杂度

算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源 。

因此衡量一个算法的好坏,一般 是从时间和空间两个维度来衡量的,即时间复杂度和空间复杂度。

时间复杂度主要衡量一个算法的运行快慢,而空间复杂度主要衡量一个算法运行所需要的额外空间。在计算 机发展的早期,计算机的存储容量很小。

所以对空间复杂度很是在乎。但是经过计算机行业的迅速发展,计 算机的存储容量已经达到了很高的程度。所以我们如今已经不需要再特别关注一个算法的空间复杂度

根据摩尔定律 每大概18个月计算机的内存翻倍。所以我们不太关注空间复杂度了,映照了那句公移山 固然可敬,但发明炸药和推土机可能更实在和聪明一些。

时间复杂度的概念

时间复杂度的定义:在计算机科学中, 算法的时间复杂度是一个函数 ,它定量描述了该算法的运行时间。
一个算法执行所耗费的时间,从理论上说,是不能算出来的,只有你把你的程序放在机器上跑起来,才能知 道。
但是我们需要每个算法都上电脑测试吗?是可以都上机测试,但是这很麻烦,所以才有了时间复杂度这个
分析方式。一个算法所花费的时间与其中语句的执行次数成正比例, 算法中的基本操作的执行次数,为算法 的时间复杂度

这是官网的解释 不懂的话 我可以慢慢给大家分析

时间复杂度是一个函数 是数学的一个函数它代表的位置 比方说f(n),n决定f的大小,这些大家记住就好,时间复杂度不是算代码执行多少秒,而是算代码执行的次数。

第一台是我小时候在玩的电脑,第二台是我中专期间在用的电脑,他们的性能和程序运行时间是一样的吗?大家都知道程序是运行在内存中,根据摩尔定律,所以我们只能算代码的执行次数。

比如说一个代码运行100万次,和100w*100次,那这个代码更快呢?很显然肯定是第一个。

介绍接下来一个时间复杂度例子
void Func1(int N)
{
int count = 0;
for (int i = 0; i < N ; ++ i){for (int j = 0; j < N ; ++ j){++count;}}for (int k = 0; k < 2 * N ; ++ k){++count;}
int M = 10;
while (M--){++count;}
printf("%d\n", count);
}

那这个代码执行多少次呢?很显然是n次,这时候我们要用数学的知识呢F(N),N的值决定了F大家知道就好。

上面代码第一个循环值,第一个N跑次  第二个N就走N次 比方说外面的N可以理解为1,里面的N可以理解为5。这是假设,那大家是不是可以理解为N*N啊。

第三个for循环就是2*N 最后一个循环就是10,因为它要执行十次。

用数学里一个函数表达出来,表达以后是不是就是这样子的呢?

F(N)=N^2+2*N+10 公式

N是多少,我们不知道因为,这是个未知数。这就是他的时间复杂度,就知道他运行多少次了。

事实上  如果我们想使用这个函数会使用一个叫做大O的渐进表示法。就是大概的意思

事实上我们并不会把他写出O(N^2),而是写成大O什么 什么的平方(这个后面会解释,大家知道概念就好了)。

推导大O阶 

我们发现N越大,对于后两项的结果是越小了。比如说你要买个一百万五块的房子,那你自然不在乎那五块钱了呀。好我们接着用上面代码举例。

N = 10 F(N) = 100
N = 100 F(N) = 10000
N = 1000 F(N) = 1000000
实际中我们计算时间复杂度时,我们其实并不一定要计算精确的执行次数,而只需要 大概执行次数,那么这 里我们使用大 O 的渐进表示法。
O 符号( Big O notation ):是用于描述函数渐进行为的数学符号
大O阶的公式
1 、用常数 1 取代运行时间中的所有加法常数。
2 、在修改后的运行次数函数中,只保留最高阶项。
3 、如果最高阶项存在且不是 1 ,则去除与这个项目相乘的常数。得到的结果就是大 O 阶。

实例2

// 计算Func3的时间复杂度?
void Func3(int N, int M)
{int count = 0;for (int k = 0; k < M; ++ k){++count;}for (int k = 0; k < N ; ++ k){++count;}printf("%d\n", count);
}

我们发现 这个例子的没办法按之前的方法,推到大o阶 我们没办法确定mn的大小,哪怎么办呢

分为三种情况

n>M 大o阶是O(N)

N<M大O阶是O(M)

N=M那么就可以写成O(M+N)

// 计算Func4的时间复杂度?
void Func4(int N)
{
int count = 0;
for (int k = 0; k < 100; ++ k)
{
++count;
}
printf("%d\n", count);
}
实例 3: 上面代码 我们已经确认了 循环的次数 一般都用O(1)来表示。这里只要确定次数都是常数次 1.
// 请计算一下Func1中++count语句总共执行了多少次?for (int k = 0; k < 2 * N ; ++ k)
{++count;
}
int M = 10;
while (M--)
{++count;
}
这段代码的时间复杂度 是O(N),推导大O阶根据上面的第三条而推导出来的。
实例 4:
// 计算strchr的时间复杂度?
const char * strchr ( const char * str, int character );
{
while(*str)
{
if(*str==character)return str;
else
++str;
}

上面代码我们发现时间复杂度是O(1),为什么是O(1)呢?这分为三种情况

在代码百分百能找到情况的时候,我们关注最坏的情况,这样推导大O阶。

冒泡排序时间复杂度

// 计算BubbleSort的时间复杂度?
void BubbleSort(int* a, int n)
{assert(a);for (size_t end = n; end > 0; --end){int exchange = 0;for (size_t i = 1; i < end; ++i){if (a[i-1] > a[i]){Swap(&a[i-1], &a[i]);exchange = 1;}}if (exchange == 0)break;}
}

上面的代码是一段冒泡排序,时间复杂度为O(N^2),这个代码大家发现没有是等差数列求和
(大家知道就好)(首项+尾项)乘与项数除于2。

假设给这个代码n输入的值,为5。那么第一次循环就是N-1,最后一次循环就是N-4,大家可以思考一下上面代码,所以尾项是不是没了啊?5-4剩下一个1,最后一个不用冒泡比较,所以等差数列求和公式是n*(n-1)/2。所以最高阶项目是O(N^2)。

实例6二分查找
 // 计算BinarySearch的时间复杂度?
int BinarySearch(int* a, int n, int x){assert(a);int begin = 0;int end = n-1;while (begin < end){int mid = begin + ((end-begin)>>1);if (a[mid] < x)begin = mid+1;else if (a[mid] > x)end = mid;elsereturn mid;}return -1;}

二分查找时间复杂度为大O(logn)因为大家可以想象一下,每次都折半查找,所以底数就是2

所以二分查找就是logn

递归的时间复杂度

// 计算阶乘递归Fac的时间复杂度?
long long Fac(size_t N){if(0 == N)return 1;return Fac(N-1)*N;}

大家可以想象这个N在代码中执行几次啊?不管加或者减都是一个数,就是一次 然后递归一次算一次 所以这个递归的时间复杂度O(N)。

// 计算阶乘递归Fac的时间复杂度?
long long Fac(size_t N){if(0 == N)return 1;for(int i=0;i<N;++i)
{}return Fac(N-1)*N;}

这段代码时间复杂度是O(2),这道题比较简单易懂 。好,这次先分享到这里,感谢收看欢迎指导

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

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

相关文章

unicloud 云对象

背景和优势 20年前&#xff0c;restful接口开发开始流行&#xff0c;服务器编写接口&#xff0c;客户端调用接口&#xff0c;传输json。 现在&#xff0c;替代restful的新模式来了。 云对象&#xff0c;服务器编写API&#xff0c;客户端调用API&#xff0c;不再开发传输json…

二叉树—堆(C语言实现)

一、树的概念及结构 1.树的概念 树是一种非线性的数据结构&#xff0c;它是有n&#xff08;n > 0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一颗倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下。 ● 有一个特殊的结点…

结构设计模式 - 代理设计模式 - JAVA

代理设计模式 一. 介绍二. 代码示例2.1 定义 CommandExecutor 类2.2 定义 CommandExecutorProxy代理类2.3 模拟客户端2.4 测试结果 三. 结论 前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神的孩子…

虚幻引擎5 Gameplay框架(四)

Gameplay重要类及重要功能使用方法&#xff08;三&#xff09; 虚幻的委托机制 虚幻委托之间的区别序列化就是是否可以在蓝图中执行 多播与单播的创建 制作功能&#xff1a;使用多播与单播将血条与血量进行实时更新首先新建一个单播与一个多播委托 实例化这两个委托的标签…

神经网络---卷积神经网络CNN

一、从前馈神经网络到CNN 前馈神经网络&#xff08;Feedforward Neural Networks&#xff09;是最基础的神经网络模型&#xff0c;也被称为多层感知机&#xff08;MLP&#xff09;。 它由多个神经元组成&#xff0c;每个神经元与前一层的所有神经元相连&#xff0c;形成一个“…

Ubuntu24.04 LTS安装中文输入法

前言 最近&#xff0c;windows玩没了&#xff0c;一怒之下决定换一个操作系统&#xff0c;当然就是最新的Ubuntu24.04 LTS.&#xff0c;其中魔法和咒语&#xff08;汉语&#xff09;是inux遇到的第一大难关&#xff0c;我权限不够教不了魔法&#xff0c;但我可以教你咒语(๑•…

大模型之路,从菜鸟到模型大师只需要一步

前言&#xff1a; 在这个数据爆炸的时代&#xff0c;大模型技术正以前所未有的速度发展。从自然语言处理到计算机视觉&#xff0c;从智能推荐到自动驾驶&#xff0c;大模型正逐渐渗透到我们生活的方方面面。那么&#xff0c;如何从菜鸟成长为模型大师呢&#xff1f;本文将为你…

1.8k Star!RAGApp:在任何企业中使用 Agentic RAG 的最简单方法!

原文链接&#xff1a;&#xff08;更好排版、视频播放、社群交流、最新AI开源项目、AI工具分享都在这个公众号&#xff01;&#xff09; 1.8k Star&#xff01;RAGApp&#xff1a;在任何企业中使用 Agentic RAG 的最简单方法&#xff01; &#x1f31f;在任何企业中使用 Agent…

9.Halcon3D点云力矩求解-平面拟合用法

1.实现效果 我们在使用3d相机对产品进行扫描生成点云的时候,由于安装问题,所以我们不可能保证每次产品扫描出来都在坐标系中位置和姿态非常标准。 上述算法描述的就是在某一个维度或者某几个维度上将点云数据和坐标系对齐; 至于怎么对齐,如何实现就是今天的内容。 本人能…

如何评价GPT-4o?GPT-4o和ChatGPT4.0的区别是啥呢?

如何评价GPT-4o? GPT-4o代表了人工智能领域的一个重要里程碑&#xff0c;它不仅继承了GPT-4的强大智能&#xff0c;还在多模态交互方面取得了显著进步。以下是几个方面的分析&#xff1a; 技术特点 多模态交互能力&#xff1a;GPT-4o支持文本、音频和图像的任意组合输入与输出…

vue3组件通信与props

title: vue3组件通信与props date: 2024/5/31 下午9:00:57 updated: 2024/5/31 下午9:00:57 categories: 前端开发 tags: Vue3组件Props详解生命周期数据通信模板语法Composition API单向数据流 Vue 3 组件基础 在 Vue 3 中&#xff0c;组件是构建用户界面的基本单位&#…

判断自守数-第13届蓝桥杯选拔赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第75讲。 判断自守数&#…

蓝桥杯高频考点-与日期相关的题目

文章目录 前言1. 如何枚举合法日期1.1 预存每个月的天数1.2 封装一个判断日期是否合法的函数1.3 枚举日期并判断日期是否合法 2. 判断日期是否为回文日期2.1 将日期当作字符串进行处理2.2 将日期当作一个8位数进行处理 3. 给定初始日期&#xff0c;计算经过n天后对应的日期3.1 …

职场中,那些35岁以上的测试猿到底去哪了?

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

使用KEPServer连接欧姆龙PLC获取对应标签数据(标签值类型改为字符串型)

1.创建通道&#xff08;通道&#xff09;&#xff0c;&#xff08;选择对应的驱动&#xff0c;跟当前型号PLC型号对应&#xff09;。 2.创建设备&#xff0c;&#xff08;填入IP地址以及欧姆龙的默认端口号&#xff1a;44818&#xff09; 3.创建对应的标签。这里关键讲诉下字…

AI 网页解锁器,用于网页抓取一切 | 最快的验证码解决服务

想象一下&#xff0c;解锁互联网的全部潜力&#xff0c;数据自由流动&#xff0c;没有任何障碍阻挡你获取所需信息。在网络爬虫的世界里&#xff0c;这个梦想常常会遇到障碍&#xff1a;CAPTCHA和反机器人措施&#xff0c;这些措施旨在保护网站免受自动化访问的侵害。但如果有一…

【VSCode】快捷方式log去掉分号

文章目录 一、引入二、解决办法 一、引入 我们使用 log 快速生成的 console.log() 都是带分号的 但是我们的编程习惯都是不带分号&#xff0c;每次自动生成后还需要手动删掉分号&#xff0c;太麻烦了&#xff01; 那有没有办法能够生成的时候就不带分号呢&#xff1f;自然是有…

uni-app的网络请求库封装及使用(同时支持微信小程序)

其实uni-app中内置的uni.request()已经很强大了&#xff0c;简单且好用。为了让其更好用&#xff0c;同时支持拦截器&#xff0c;支持Promise 写法&#xff0c;特对其进行封装。同时支持H5和小程序环境&#xff0c;更好用啦。文中给出使用示例&#xff0c;可以看到使用变得如此…

【C++】——string模拟实现

前言 string的模拟实现其实就是增删改查&#xff0c;只不过加入了类的概念。 为了防止与std里面的string冲突&#xff0c;所以这里统一用String。 目录 前言 一 初始化和销毁 1.1 构造函数 1.2 析构函数 二 迭代器实现 三 容量大小及操作 四 运算符重载 4.1 bool…

Unity【入门】脚本基础

Unity脚本基础 文章目录 1、脚本基本规则1、创建规则2、MonoBehavior基类3、不继承MonoBehavior的类4、执行的先后顺序5、默认脚本内容 2、生命周期函数1、概念2、生命周期函数有哪些3、生命周期函数支持继承多态 3、Inspector窗口可编辑的变量4、Mono中的重要内容1、重要成员2…