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

news2024/11/18 6:20:29

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

 漫谈数据结构

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

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

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

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

官方的话是 :

数据结构(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;
        else
            return 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.coloradmin.cn/o/1721216.html

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

相关文章

PHP框架开发的内容付费问答解惑系统附带seo优化

default默认是百度问答模板 sowenda是高仿360问答的。 soso模板是仿腾讯soso问答界面。 一套wap模板&#xff0c;仿天涯问答的手机版。 pc和wap模板后台设置里自由切换&#xff0c;还可以绑定手机独立二级域名。 强大的搜索功能&#xff0c;支持xunsearch全文检索&#xff0c;s…

springboot基本使用十二(PageHelper分页查询)

引入依赖&#xff1a; <dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.3.0</version> </dependency> 通个PageHelper.startPage(page,pageSize)方…

02 在虚拟机中安装Linux

课程目标 1、理解VMware中各个选项的作用 2、理解Linux安装过程中的各种选项和配置作用 课程实验 在VMware中安装centos7.9操作系统并确保网络通常 课堂引入 在看过了Linux桌面的各种炫酷的效果后(其实很多操作&#xff0c;在互动上并不比Windows和MacOS差多少)&#xff…

Compose CompositionLocal

文章目录 Compose CompositionLocal概述使用compositionLocalOfstaticCompositionLocalOf 和 compositionLocalOf 总结 Compose CompositionLocal 概述 Compose 提供了 CompostionLocal 用来完成 composable 树中共享数据方式。CompositionLocals 是具有层级的&#xff0c;可…

文明互鉴促发展——2024“国际山地旅游日”主题活动在法国启幕

5月29日&#xff0c;2024“国际山地旅游日”主题活动在法国尼斯市成功举办。中国驻法国使领馆、法国文化旅游部门、地方政府、国际组织、国际山地旅游联盟会员代表、旅游机构、企业、专家、媒体等围绕“文明互鉴的山地旅游”大会主题和“气候变化与山地旅游应对之策”论坛主题展…

变压器励磁涌流MATLAB仿真模型

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 变压器励磁涌流的产生机理 1、变压器是电力系统的关键部分&#xff0c;在实际的 运行中&#xff0c;变压器需要进行相应的充电&#xff0c;而在充电的过 程中&#xff0c;就需要进行开合闸作业。在开合闸作业…

一文读懂存内计算与近存计算的分类与应用

存内计算与近存计算-基础理论及分类 技术基础知识和分类 "近存计算"与"存内计算"易混淆&#xff0c;本章明晰其分类&#xff0c;并比较各内存驱动方法的独特优势。可计算存储器设备可作分立加速器或替代现有存储模块。我们深入剖析每种方法的利弊&#xf…

SOFA-RPC学习记录

文章目录 需求分析模块划分微服务模块交互模块 可拓展架构插件机制 功能分析交互模块 学习微服务模块交互模块 dubbo与nacos集成学习Nacos配置中心实战 dubbo与apollo集成学习配置中心组件与k8s的抉择参考资料 结论 本报告旨在深入学习SOFA-RPC框架&#xff0c;特别是其动态配置…

深入解析芯片背后的技术:揭开半导体产业的神秘面纱

引言&#xff1a; 在这个数字化、信息化的时代&#xff0c;芯片已经成为了现代科技发展的重要基石。从智能手机、电脑到汽车、物联网设备&#xff0c;芯片无处不在。然而&#xff0c;对于大多数人来说&#xff0c;芯片背后的技术仍然是一个神秘而遥不可及的领域。本文将深入解…

双指针练习:快乐数

1.题目链接&#xff1a;202.快乐数 2.题目描述&#xff1a; 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1&#xff0c;也可能是 无…

vue2+antv/x6实现er图

效果图 安装依赖 npm install antv/x6 --save 我目前的项目安装的版本是antv/x6 2.18.1 人狠话不多&#xff0c;直接上代码 <template><div class"er-graph-container"><!-- 画布容器 --><div ref"graphContainerRef" id"gr…

先导微型数控桌面式加工中心

随着数控技术、传感器技术、人工智能等技术的不断发展&#xff0c;制造业的快速发展和技术的不断进步&#xff0c;小型五轴加工中心的性能将不断提升&#xff0c;五轴联动技术作为解决异性复杂零件高效优质加工问题的重要手段&#xff0c;使其具有更广泛的应用前景。小型五轴加…

企业微信接入系列-上传临时素材

企业微信接入系列-上传临时素材 文档介绍上传临时素材写在最后 文档介绍 创建企业群发的文档地址&#xff1a;https://developer.work.weixin.qq.com/document/path/92135&#xff0c;在创建企业群发消息或者群发群消息接口中涉及到上传临时素材的操作&#xff0c;具体文档地址…

【二进制部署k8s-1.29.4】七、验证master的安装

文章目录 简介 一.确认kubectl命令是否正常运行二.确认etcd安装是否正常运行三.确认kube-apiserver,kube-controller-manager,kube-scheduler安装是否正常四.配置apiserver和kubelet的访问授权五.master端安装脚本4.1.安装master端所需文件4.2.master快捷安装脚本 简介 本章节主…

北邮22级信通院DSP:IIR_DF系统3.0版:从H(p)到H(s):一种更为严谨精确的运算模式

北邮22信通一枚~ 跟随课程进度更新北邮信通院DSP的笔记、代码和文章&#xff0c;欢迎关注~ 获取更多文章&#xff0c;请访问专栏&#xff1a; 北邮22级信通院DSP_青山入墨雨如画的博客-CSDN博客 承接上一篇博客 北邮22级信通院DSP&#xff1a;IIR_DF系统2.0版&#xff1a;…

深入pandas:数据分析

目录 前言 第一点&#xff1a;导入模块 第二点&#xff1a;准备数据 第三点&#xff1a;简单的分析数据 第四点&#xff1a;【重点】数据透支 总结 前言 在数据分析与挖掘的领域&#xff0c;了解如何使用工具和方法来探索数据是至关重要的。本文将探讨如何利用Python中的…

洛谷P1035 级数求和 题解

#题外话&#xff08;第42篇题解&#xff09; #先看题目 题目链接https://www.luogu.com.cn/problem/P1035#思路 没啥思路&#xff0c;这其实偏向模拟一点&#xff0c;按照题目说的做就行了。 #代码 原来是这个熊样的&#xff08;都能AC&#xff0c;优化的问题&#xff09; …

营造科技展厅主题氛围,多媒体应用有哪些新策略?

长久以来&#xff0c;展厅作为线下向公众传递信息的窗口&#xff0c;其设计风格与内容主题紧密相连&#xff0c;展现出千姿百态的面貌。然而&#xff0c;随着数字多媒体技术的日新月异&#xff0c;展厅不再仅仅是传统的信息展示平台&#xff0c;而是成为了引领内容展示潮流的风…

521源码-源码下载-个人网盘源码2024最新web网盘系统源码一键安装版源码分享

主要功能&#xff1a; 1.支持用户管理系统。支持用户注册功能&#xff08;后台可关闭&#xff09;&#xff0c;管理可为每个用户分配一定数额的存储空间&#xff0c;还可以限制单个上传文件大小。 2.支持管理员查看每个会员的文件上传、分享情况&#xff0c;可对用户文件进行删…

mac电脑鼠标键盘共享软件:ShareMouse for Mac 激活版

ShareMouse 是一款跨平台的键盘和鼠标共享软件&#xff0c;它允许用户在多台计算机之间共享同一组键盘和鼠标&#xff0c;实现无缝的操作和控制。该软件适用于 Windows 和 macOS 系统&#xff0c;并且支持多种连接方式&#xff0c;包括局域网连接和无线连接。 使用 ShareMouse&…