当前位置: 首页 > news >正文

算法与数据结构(1)

一:数据结构概论

数据结构分为初阶数据结构(主要由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 )

案例八:

相关文章:

算法与数据结构(1)

一&#xff1a;数据结构概论 数据结构分为初阶数据结构&#xff08;主要由C语言实现&#xff09;和高阶数据结构&#xff08;由C实现&#xff09; 初阶数据结构当中&#xff0c;我们会学到顺序表、链表、栈和队列、二叉树、常见排序算法等内容。 高阶数据结构当中&#xff0…...

FTP介绍与配置

前言&#xff1a; FTP是用来传送文件的协议。使用FTP实现远程文件传输的同时&#xff0c;还可以保证数据传输的可靠性和高效性。 介绍 FTP的应用 在企业网络中部署一台FTP服务器&#xff0c;将网络设备配置为FTP客户端&#xff0c;则可以使用FTP来备份或更新VRP文件和配置文件…...

SQL面试题——抖音SQL面试题 最近一笔有效订单

最近一笔有效订单 题目背景如下,现有订单表order,包含订单ID,订单时间,下单用户,当前订单是否有效 +---------+----------------------+----------+-----------+ | ord_id | ord_time | user_id | is_valid | +---------+----------------------+--------…...

【线程】Java多线程代码案例(1)

【线程】Java多线程代码案例&#xff08;1&#xff09; 一、“单例模式” 的实现1.1“饿汉模式”1.2 “懒汉模式”1.3 线程安全问题 二、“阻塞队列”的实现2.1阻塞队列2.2生产者消费者模型2.3 阻塞队列的实现2.4 再谈生产者消费者模型 一、“单例模式” 的实现 “单例模式”即…...

go使用mysql实现增删改查操作

1、安装MySQL驱动 go get -u github.com/go-sql-driver/mysql2、go连接MySQL import ("database/sql""log"_ "github.com/go-sql-driver/mysql" // 导入 mysql 驱动 )type Users struct {ID intName stringEmail string }var db *sql.DBfu…...

【Rust】unsafe rust入门

这篇文章简单介绍下unsafe rust的几个要点 1. 解引用裸指针 裸指针其实就是C或者说C的指针&#xff0c;与C的指针不同的是&#xff0c;Rust的裸指针还是要分为可变和不可变&#xff0c;*const T 和 *mut T&#xff1a; 基于引用创建裸指针 let mut num 5;let r1 &num …...

dpwwn02靶场

靶机下载地址&#xff1a;https://download.vulnhub.com/dpwwn/dpwwn-02.zip 信息收集 ip add 查看kali Linux虚拟机的IP为&#xff1a;10.10.10.128 https://vulnhub.com/entry/dpwwn-2,343/中查看靶机的信息&#xff0c;IP固定为10.10.10.10 所以kali Linux添加仅主机网卡…...

K8S疑难概念理解——Pod,应该以哪种Kind来部署应用,为什么不直接Pod这种kind?

文章目录 一、Pod概念深度理解&#xff0c;为什么一般不直接以kindPod资源类型来部署应用?二、究竟应该以哪种资源类型来部署应用 一、Pod概念深度理解&#xff0c;为什么一般不直接以kindPod资源类型来部署应用? Pod是Kubernetes中的最小部署单元&#xff0c;可以包含一个或…...

LabVIEW进行仪器串行通信与模拟信号采集的比较

在现代测试、测量和控制系统中&#xff0c;设备通常采用两种主要方式与计算机进行交互&#xff1a;一种是通过数字通信接口&#xff08;如RS-232、RS-485、GPIB等&#xff09;&#xff0c;另一种是通过模拟信号&#xff08;电压、电流&#xff09;进行数据输出。每种方式具有其…...

D81【 python 接口自动化学习】- python基础之HTTP

day81 requests请求session用法 学习日期&#xff1a;20241127 学习目标&#xff1a;http定义及实战 -- requests请求session用法 学习笔记&#xff1a; requests请求session用法 import requests# 创建一个会话 reqrequests.session() url "http://sellshop.5istud…...

白鹿 Hands-on:消除冷启动——基于 Amazon Lambda SnapStart 轻松打造 Serverless Web 应用(二)

文章目录 前言一、前文回顾二、在 Lambda 上运行2.1、查看 Amazon SAM template2.2、编译和部署到 Amazon Lambda2.3、功能测试与验证 三、对比 Snapstart 效果四、资源清理五、实验总结总结 前言 在这个环节中&#xff0c;我们将延续《白鹿 Hands-on&#xff1a;消除冷启动——…...

ROC曲线

文章目录 前言一、ROC的应用&#xff1f;二、使用方式1. 数据准备2.绘图可视化 前言 在差异分析中&#xff0c;ROC曲线可以用来评估不同组之间的分类性能差异。差异分析旨在比较不同组之间的特征差异&#xff0c;例如在基因表达研究中比较不同基因在不同条件或组织中的表达水平…...

c++ 位图和布隆过滤器

位图&#xff08;bitmap&#xff09; 定义 位图是一种使用位数组存储数据的结构。每一位表示一个状态&#xff0c;通常用于快速判断某个值是否存在&#xff0c;或者用来表示布尔类型的集合。 特点 节省空间&#xff1a;一个字节可以表示8个状态。高效操作&#xff1a;位操作…...

阿里云CPU过载的一点思考

现象&#xff1a;阿里云ECS服务器连续5个周期CPU超90%告警 分析&#xff1a; max_connections和max_user_connections都做了限制&#xff0c;但是依然告警&#xff0c;服务器上有四个子服务&#xff0c;查看了每个服务的配置文件&#xff0c;发现使用同一个数据库账号&#x…...

单片机学习笔记 15. 串口通信(理论)

更多单片机学习笔记&#xff1a;单片机学习笔记 1. 点亮一个LED灯单片机学习笔记 2. LED灯闪烁单片机学习笔记 3. LED灯流水灯单片机学习笔记 4. 蜂鸣器滴~滴~滴~单片机学习笔记 5. 数码管静态显示单片机学习笔记 6. 数码管动态显示单片机学习笔记 7. 独立键盘单片机学习笔记 8…...

算法训练营day22(二叉树08:二叉搜索树的最近公共祖先,插入,删除)

第六章 二叉树part08 今日内容&#xff1a; ● 235. 二叉搜索树的最近公共祖先 ● 701.二叉搜索树中的插入操作 ● 450.删除二叉搜索树中的节点 详细布置 235. 二叉搜索树的最近公共祖先 相对于 二叉树的最近公共祖先 本题就简单一些了&#xff0c;因为 可以利用二叉搜索树的…...

Linux history 命令详解

简介 history 命令显示当前 shell 会话中以前执行过的命令列表。这对于无需重新输入命令即可重新调用或重新执行命令特别有用。 示例用法 显示命令历史列表 history# 示例输出如下&#xff1a;1 ls -l 2 cd /var/log 3 cat syslog执行历史记录中的命令 !<number>…...

Kafka知识体系

一、认识Kafka 1. kafka适用场景 消息系统&#xff1a;kafka不仅具备传统的系统解耦、流量削峰、缓冲、异步通信、可扩展性、可恢复性等功能&#xff0c;还有其他消息系统难以实现的消息顺序消费及消息回溯功能。 存储系统&#xff1a;kafka把消息持久化到磁盘上&#xff0c…...

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

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

【大数据学习 | Spark调优篇】Spark之内存调优

1. 内存的花费 1&#xff09;每个Java对象&#xff0c;都有一个对象头&#xff0c;会占用16个字节&#xff0c;主要是包括了一些对象的元信息&#xff0c;比如指向它的类的指针。如果一个对象本身很小&#xff0c;比如就包括了一个int类型的field&#xff0c;那么它的对象头实…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

MySQL 主从同步异常处理

阅读原文&#xff1a;https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主&#xff0c;遇到的这个错误&#xff1a; Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一&#xff0c;通常表示&#xff…...

Matlab实现任意伪彩色图像可视化显示

Matlab实现任意伪彩色图像可视化显示 1、灰度原始图像2、RGB彩色原始图像 在科研研究中&#xff0c;如何展示好看的实验结果图像非常重要&#xff01;&#xff01;&#xff01; 1、灰度原始图像 灰度图像每个像素点只有一个数值&#xff0c;代表该点的​​亮度&#xff08;或…...

Mysql故障排插与环境优化

前置知识点 最上层是一些客户端和连接服务&#xff0c;包含本 sock 通信和大多数jiyukehuduan/服务端工具实现的TCP/IP通信。主要完成一些简介处理、授权认证、及相关的安全方案等。在该层上引入了线程池的概念&#xff0c;为通过安全认证接入的客户端提供线程。同样在该层上可…...

STM32标准库-ADC数模转换器

文章目录 一、ADC1.1简介1. 2逐次逼近型ADC1.3ADC框图1.4ADC基本结构1.4.1 信号 “上车点”&#xff1a;输入模块&#xff08;GPIO、温度、V_REFINT&#xff09;1.4.2 信号 “调度站”&#xff1a;多路开关1.4.3 信号 “加工厂”&#xff1a;ADC 转换器&#xff08;规则组 注入…...

npm安装electron下载太慢,导致报错

npm安装electron下载太慢&#xff0c;导致报错 背景 想学习electron框架做个桌面应用&#xff0c;卡在了安装依赖&#xff08;无语了&#xff09;。。。一开始以为node版本或者npm版本太低问题&#xff0c;调整版本后还是报错。偶尔执行install命令后&#xff0c;可以开始下载…...