当前位置: 首页 > 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;那么它的对象头实…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

scikit-learn机器学习

# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...

MySQL 8.0 事务全面讲解

以下是一个结合两次回答的 MySQL 8.0 事务全面讲解&#xff0c;涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容&#xff0c;并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念&#xff08;ACID&#xff09; 事务是…...

用鸿蒙HarmonyOS5实现中国象棋小游戏的过程

下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...

xmind转换为markdown

文章目录 解锁思维导图新姿势&#xff1a;将XMind转为结构化Markdown 一、认识Xmind结构二、核心转换流程详解1.解压XMind文件&#xff08;ZIP处理&#xff09;2.解析JSON数据结构3&#xff1a;递归转换树形结构4&#xff1a;Markdown层级生成逻辑 三、完整代码 解锁思维导图新…...