算法与数据结构(1)

news2024/12/27 7:52:36

一:数据结构概论

数据结构分为初阶数据结构(主要由C语言实现)和高阶数据结构(由C++实现)

初阶数据结构当中,我们会学到顺序表、链表、栈和队列、二叉树、常见排序算法等内容。

高阶数据结构当中,我们会学到图、哈希表、红黑数等内容。

二:数据结构前言

1.数据结构:

数据结构是计算机存储与组织数据的方式(包括增加数据、删除数据、查找数据、改写数据等)指相互之间存在一种或多种特定关系的数据元素的集合。没有一种单一的数据结构对所有的用途都有用,所以我们要学习各种各样的数据结构,如:线性表、树、图、哈希……

数组 int arr[4]={0,1,2,3};就是一个简单的数据结构。

可以插入删除查找修改其中的元素。

但是数组元素只能时同类型的,数组这一单一的数据结构不是对所有的用途都有用,比如不同类型的数据,这时候我们就可以用另外一种数据结构————结构体。

2.算法:

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

算法是有好坏之分(效率高低之分)的,可以通过复杂度这一概念来判断算法的好坏。

算法和数据结构是紧密联系的,二者不可分割。

如何学好算法与数据结构?

1.死磕代码     2.画图画图画图+思考

三:算法效率

如何衡量一个算法的好坏呢?

案例:请看下面这道算法题:https://leetcode.cn/problems/rotate-array/description/

思路:循环K次每次将数组所有元素向后移一位。

代码点击执行可以通过,然而点击提交却无法通过,那该如何衡量其好与坏呢?

1.复杂度的概念

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

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

时间:快慢————5ms V,S 5s

空间:占用内存大小————1G VS 1kB

时间复杂度主要衡量一个算法的运行快慢,而空间复杂度主要衡量一个算法运行所需要的额外空间

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

2.复杂度的重要性

复杂度在校招中的考察已经很常见。

3.时间复杂度

定义:在计算机科学中,算法的时间复杂度是一个函数式T(N),它定量描述了该算法的运行时间。时间复杂度衡量程序的时间效率,我们其实可以在程序中计算程序的运行时间。

用到C语言中的一个库函数clock()#include <time.h>.

返回的时间单位是毫秒。

既然我们可以在程序中计算一个算法的运行时间,那为什么还要引入时间复杂度这一概念呢?

其实使用clock()来计算算法的运行时间有一些弊端:

1.这种计算算法运行时间的方法只能在编写完程序后再去计算。

2.当代电脑CPU处理数据的速度一秒可以执行上亿次,对于循环次数较少的程序几种不同的算法打印出的结构可能都是0,就没有办法比较算法的好坏了。

3.程序运行时间和编译环境和运行机器的配置都有关系,比如同一个算法程序,用一个老编译器和新编译器编译,在同一台机器侠运行时间就不同。同一个程序,用低配置的设备和高配置的设备运行,时间也不同。

那我们有没有办法在想出有一种算法后就知道该算法的时间复杂度,进而判断这个算法的好坏呢?

这时候就要用到时间复杂度来进行判断。

算法的时间复杂度是一个函数式T(N),这个函数计算了程序的执行次数。通过C语言的学习,我们知道算法编译后会形成二进制指令,程序运行,CPU就去执行这些指令。那么我们通过程序代码或者理论思想计算出程序的执⾏次数的函数式T(N),假设每 句指令执⾏时间基本⼀样(实际中有差别,但是微乎其微),那么执⾏次数和运⾏时间就是等⽐正相关, 这样也脱离了具体的编译运⾏环境。执⾏次数就可以代表程序时间效率的优劣。⽐如解决⼀个问题的 算法a程序T(N) = N,算法b程序T(N) = N^2,那么算法a的效率⼀定优于算法b。

接下来我们通过几个程序的案例来进一步加深对于一个算法时间复杂度的理解。

案例一:

首先这个算法创建了变量count,又进行了N次循环,这N次循环中每次循环又嵌套了N次循环,循环过后又进行了2*N次循环,然后创建变量M,在进行M次循环。(M是一个确定的数)

据此我们可以得出本程序的基本操作次数(执行次数)T(N)=1+N^2+2*N+1+10

通过对N的取值分析,当N越来越大时,对结果影响最大的一项是N^2。

实际上我们计算复杂度时,也只是粗略的计算算法大概的执行次数,精确计算是很麻烦的(不同的一个语句编译出的二进制指令是不同的)(CPU处理数据时一秒可以处理上亿条指令)是可以允许一些计算误差的。

所以我们计算算法的时间复杂度时,只需要计算程序的大概执行次数就可以了,复杂度的表示通常使用大O的渐进表示法:

大O的渐进表示法:

推导大O规则

1.时间复杂度函数时T(N)中,只保留最高阶项,去掉那些低阶项,因为当N不断增大时,低阶项对结果的影响越来越小,当N无穷大时,就可以忽略不计了。

2.如果最高阶项存在且不是1,则去除这个项目的常数系数,因为当N不断增大时,这个系数对结果的影响越来越小,当N无穷大时,就可以忽略不计了。

3.T(N)中如果没有N相关的项目,只有常数项,用常数项1取代所有加法常熟。

通过以上分析,案例一的时间复杂度为O(N^2).

案例二:

分析:本算法进行了2*N次循环,又进行了M次循环,还进行了两次变量创建,一次打印。

T(N)=1+2*N+1+M+1

忽略掉可忽略项 T(N)=2*N+M (M=10)

又因为M是已知的。

所以根据大O的渐进表示法可得本算法的时间复杂O(N)。(注意不是O(2*N))

案例三:

本算法根据大O的渐近表示法可得时间复杂度为O(M+N).

需要分类讨论{1.M>>N时———O(M)   2.M<<N时——O(N)  3.M和N差不多时—O(M)或O(N)}

案例四:

本算法的执行次数为T(N)=100;

根据大O的渐近表示法可的本算法的时间复杂度为O(1).

案例五:

本算法的目的是进行查找字符在字符串中出现的位置

该算法的执行次数不是一个固定的值,而是需要根据实际的情况来确定,如果要查找的字符出现在字符串的前端,执行次数相对就少。反之,如果要查找的字符串出现在字符串的后端,执行的系数就会较多。

如果要查找的字符出现在字符串的第一个位置,T(N)=1.

如果要查找的字符出现在字符串的最后位置,T(N)=N.

如果要查找的字符出现在字符串的中间,T(N)=N/2.(N为字符串的长度)

因此,本算法的时间复杂度分为:

最好情况:O(1)

中间情况:O(N)

最坏情况:O(N)

案例六:

冒泡排序的时间复杂度:

趟数:n-1    每趟内部n-1-i次

也是分情况讨论:

1.若数组有序:则T(N)=N;

2.如果数组有序且为降序:则T(N)=N*(N-1)/2;

3.数组介于有序和无序之间。

判断一个算法的好坏要看最差的那种情况,因此本算法的时间复杂度取O(N^2)。

案例七:

本算法的执行次数直接分析的话不太容易

我们给n取值,查找其中的规律:

n==1时   T=0(T指循环执行次数)

n==2时   T=1

n==4时   T=2

n==5时   T=3

由此我们可以推断出规律  假设循环执行X次n=2^X,因此执行次数T=log2X(2是底数,X是真数)

因此:func5的时间复杂度取最差情况为: O (log 2 n )

案例八:

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

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

相关文章

【Android】EventBus的使用及源码分析

文章目录 介绍优点基本用法线程模式POSTINGMAINMAIN_ORDEREDBACKGROUNDASYNC 黏性事件 源码注册getDefault()registerfindSubscriberMethods小结 postpostStickyunregister 介绍 优点 简化组件之间的通信 解耦事件发送者和接收者在 Activity、Fragment 和后台线程中表现良好避…

深度学习笔记——生成对抗网络GAN

本文详细介绍早期生成式AI的代表性模型&#xff1a;生成对抗网络GAN。 文章目录 一、基本结构生成器判别器 二、损失函数判别器生成器交替优化目标函数 三、GAN 的训练过程训练流程概述训练流程步骤1. 初始化参数和超参数2. 定义损失函数3. 训练过程的迭代判别器训练步骤生成器…

成都睿明智科技有限公司抖音电商服务的新引擎

在这个短视频风起云涌的时代&#xff0c;抖音不仅成为了人们休闲娱乐的首选&#xff0c;更是商家们竞相角逐的电商新蓝海。在这片充满机遇与挑战的海域中&#xff0c;成都睿明智科技有限公司如同一艘装备精良的航船&#xff0c;引领着众多企业向抖音电商的深水区进发。今天&…

51c视觉~YOLO~合集4

我自己的原文哦~ https://blog.51cto.com/whaosoft/12512597 1、Yolo8 1.1、检测PCB元件 技术世界正在以惊人的速度发展&#xff0c;而这种转变的核心是一个革命性的工具 — 计算机视觉。它最有趣的应用之一是电子印刷电路板 &#xff08;PCB&#xff09; 的检测和分析。本文…

Jenkins的使用

文章目录 一、Jenkins是什么\有什么用\与GitLab的对比二、Jenkins的安装与配置Jenkins的安装方式在Linux上安装Jenkins&#xff1a;在Windows上安装Jenkins&#xff1a;配置Jenkins&#xff1a; &#xff08;可选&#xff09;配置启动用户为root&#xff08;一定要是root吗??…

图论入门教程:GTM173 Graph Theory

这是本图论的入门教材&#xff0c;Graph Theory Fifth Edition&#xff0c;隶属于著名的GTM系列&#xff0c;作者是Reinhard Diestel。这是本对新人友好的教材&#xff0c;之前本科上离散数学的课时&#xff0c;因为涉及到图论&#xff0c;而学校的课堂又太水让我心生不满&…

QT5 Creator (Mingw编译器) 调用VS2019 (阿里云 oss C++库) 报错的解决方法

方法就是不要用VS2019编译&#xff0c;要用MINgw32编译。 编译命令如下&#xff1a; cmake -G "MinGW Makefiles" ^-DCMAKE_MAKE_PROGRAMD:\qt\Tools\mingw810_32\bin\mingw32-make.exe ^-DCMAKE_C_COMPILERD:\qt\Tools\mingw810_32\bin\gcc.exe ^-DCMAKE_CXX_COMP…

反向传播、梯度下降与学习率:深度学习中的优化艺术

目录 反向传播&#xff1a;神经网络的学习机制 梯度下降&#xff1a;优化算法的基石 学习率&#xff1a;平衡速度与稳定性的关键 学习率的调整策略 固定学习率 学习率衰减 自适应学习率 梯度消失与梯度爆炸 结语 在深度学习的领域中&#xff0c;构建一个有效的神经网络…

论文笔记(五十九)A survey of robot manipulation in contact

A survey of robot manipulation in contact 文章概括摘要1. 引言解释柔顺性控制的概念&#xff1a;应用实例&#xff1a; 2. 需要接触操控的任务2.1 环境塑造2.2 工件对齐2.3 关节运动2.4 双臂接触操控 3. 接触操控中的控制3.1 力控制3.2 阻抗控制3.3 顺应控制 4. 接触操控中的…

881.救生艇

目录 题目过程 题目 给定数组 people 。people[i]表示第 i 个人的体重 &#xff0c;船的数量不限&#xff0c;每艘船可以承载的最大重量为 limit。 每艘船最多可同时载两人&#xff0c;但条件是这些人的重量之和最多为 limit。 返回 承载所有人所需的最小船数 。 过程 cla…

【汇编】逻辑指令

文章目录 一、逻辑运算指令&#xff08;一&#xff09;各逻辑运算指令格式及操作&#xff08;1&#xff09;逻辑非指令 NOT&#xff08;2&#xff09;逻辑与指令 AND&#xff08;3&#xff09;逻辑或指令 OR&#xff08;4&#xff09;异或指令 XOR&#xff08;5&#xff09;测试…

网页开发的http基础知识

请求方式-GET&#xff1a;请求参数在请求行中&#xff0c;没有请求体&#xff0c;如&#xff1a;/brand/findAll?nameoPPo&status1。GET请求大小在浏览器中是有限制的请求方式-POST&#xff1a;请求参数在请求体中&#xff0c;POST请求大小是没有限制的 HTTP请求&#xf…

如何做好一份技术文档

如何做好一份技术文档 以下是本人的一些微不足道的经验&#xff0c;希望可以与大家互相交流学习 方向一&#xff1a;技术文档的规划布局 确定整体架构 创建一份优秀技术文档的第一步是规划其整体架构。一个好的架构应能引导读者理解文档的内容&#xff0c;同时提供一个逻辑清…

Springboot——SseEmitter流式输出

文章目录 前言SseEmitter 简介测试demo注意点异常一 ResponseBodyEmitter is already set complete 前言 最近做AI类的开发&#xff0c;看到各大AI模型的输出方式都是采取的一种EventStream的方式实现。 不是通常的等接口处理完成后&#xff0c;一次性返回。 而是片段式的处理…

Java 虚拟机:承载 Java 生态的神奇魔盒

在软件开发的世界里&#xff0c;Java 虚拟机&#xff08;JVM&#xff09;就像一位智慧的管家&#xff0c;默默守护着 Java 生态系统的运行。它不仅让 Java 实现了"一次编写&#xff0c;到处运行"的梦想&#xff0c;更是成为了多种编程语言的运行平台。让我们一起走进…

sqlmap详细使用

SQLmap使用详解 SQLmap&#xff08;常规&#xff09;使用步骤 1、查询注入点 python sqlmap.py -u http://127.0.0.1/sqli-labs/Less-1/?id12、查询所有数据库 python sqlmap.py -u http://127.0.0.1/sqli-labs/Less-1/?id1 --dbs3、查询当前数据库 python sqlmap.py -u htt…

【Linux】Linux2.6内核进程调度队列与调度原理

目录 一、进程管理中的部分概念二、寄存器三、进程切换四、Linux2.6内核进程调度队列与调度原理结尾 一、进程管理中的部分概念 竞争性: 系统进程数目众多&#xff0c;而CPU资源只有少量&#xff0c;甚至1个&#xff0c;所以进程之间是具有竞争属性的。为了高效完成任务&#…

Qt 详解QRubberBand

文章目录 QRubberBand 简介前言 QRubberBand 的作用QRubberBand 的主要功能QRubberBand 的常用方法QRubberBand 的典型应用场景示例代码总结 QRubberBand 简介 前言 在 Qt 中&#xff0c;QRubberBand 是一个非常实用的控件&#xff0c;它通常用于图形界面中的“选择区域”功能…

python股票数据分析(Pandas)练习

需求&#xff1a; 使用pandas读取一个CSV文件&#xff0c;文件内容包括股票名称、价格和交易量。完成以下任务&#xff1a; 找出价格最高的股票&#xff1b; 计算总交易量&#xff1b; 绘制价格折线图。 代码实现&#xff1a; import pandas as pd import matplotlib.pyplot …

Jenkins Nginx Vue项目自动化部署

目录 一、环境准备 1.1 Jenkins搭建 1.2 NVM和Nodejs安装 1.3 Nginx安装 二、Jenkins配置 2.1 相关插件安装 2.2 全局工具安装 2.3 环境变量配置 2.4 邮箱配置&#xff08;构建后发送邮件&#xff09; 2.5 任务配置 三、Nginx配置 3.1 配置路由转发 四、部署项目 …