算法与数据结构(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 )

案例八:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Oracle12.2 RAC集群管理修改IP地址(DNS解析)

Oracle12.2 RAC集群管理之修改IP地址 该章节实验是基于此章节基础上操作&#xff1a; Oracle LinuxR7安装Oracle 12.2 RAC集群实施&#xff08;DNS解析&#xff09;-CSDN博客 环境 改前IP&#xff1a; 172.30.21.101 hefei1 hefei1.hefeidb.com 172.30.21.102 hefei2 …

【阅读笔记】Android广播的处理流程

关于Android的解析&#xff0c;有很多优质内容&#xff0c;看了后记录一下阅读笔记&#xff0c;也是一种有意义的事情&#xff0c; 今天就看看“那个写代码的”这位大佬关于广播的梳理&#xff0c; https://blog.csdn.net/a572423926/category_11509429.html https://blog.c…

基于rpcapd与wireshark的远程实时抓包的方法

基于rpcapd与wireshark的远程实时抓包的方法 服务端安装wireshark侧设置 嵌入式设备或服务器上没有图形界面&#xff0c;通常使用tcpdump抓包保存为pcap文件后&#xff0c;导出到本地使用wireshark打开分析&#xff0c;rpcapd可与wireshark配合提供一种远程实时抓包的方案&…

SpringBoot3如何基于ServletRequestHJandledEvent检测接口响应时间以及对应的参数

在 Spring Boot 3 中&#xff0c;可以通过实现 ServletRequestHandledEvent 事件来监测接口的响应时间以及相关的参数。ServletRequestHandledEvent 是 Spring 的应用事件之一&#xff0c;它在请求处理完成时发布&#xff0c;包含有关请求的信息。 以下是一个步骤指南&#xff…

MyBatis快速入门(中)

MyBatis快速入门&#xff08;中&#xff09; 四、全局配置文件configuration标签中子标签顺序1、子标签顺序2、子标签说明3、<properties> 标签和 <environments> 标签详述4、配置文件代码示例 五、MyBatis 基础功能之 resultMap1、建表语句2、解决表中字段名和类中…

【热门主题】000069 服务器虚拟化:开启高效资源管理新时代

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 【热…

day22:lamp项目部署

一&#xff0c;lamp概述 lamp概述 LAMP 是一组开源软件的缩写&#xff0c;用于搭建动态网站或Web应用程序的基础环境。LAMP 代表了四个主要的组成部分&#xff1a; Linux&#xff1a;操作系统&#xff0c;LAMP 环境的基础。通常使用的是 Linux 发行版&#xff0c;如 CentOS、…

通俗易懂:序列标注与命名实体识别(NER)概述及标注方法解析

目录 一、序列标注&#xff08;Sequence Tagging&#xff09;二、命名实体识别&#xff08;Named Entity Recognition&#xff0c;NER&#xff09;**命名实体识别的作用****命名实体识别的常见实体类别** &#xff1a; 三、标签类型四、序列标注的三种常见方法1. **BIO&#xf…

01-Ubuntu24.04LTS上安装PGSQL

目录 一、准备工作 1.1、系统要求 1.2 、更新 Ubuntu 系统 1.3 、安装依赖 1.4 、添加 PostgreSQL 16 软件源 二、安装 PostgreSQL 16 数据库 三、管理 PostgreSQL 服务 四、PostgreSQL 管理操作 4.1 、访问 Postgres 超级用户账户 4.2 、创建数据库并设置管理权限 4…

利用阿里云镜像仓库和 Github Action 同步镜像

利用阿里云镜像仓库和 Github Action 同步镜像 由于某些未知原因,国内无法直接从 DockerHub 拉取镜像,在不使用 VPN 等违法工具的情况下,可以利用 GitHub 的 Action 流水线功能,将镜像推送到阿里云的个人镜像仓库中。 这种方式相较于其他方式虽然相对麻烦,但好在免费,且实…

iOS与Windows间传文件

想用数据线从 windows 手提电脑传文件入 iPhone&#xff0c;有点迂回。 参考 [1]&#xff0c;要在 windows 装 Apple Devices。装完、打开、插线之后会检测到手机&#xff0c;界面&#xff1a; 点左侧栏「文件」&#xff0c;不是就直接可以传&#xff0c;而是要通过某个应用传…

如何使用Python解析从淘宝API接口获取到的JSON数据?

基本的 JSON 解析 当从淘宝 API 接口获取到数据后&#xff08;假设数据存储在变量response_data中&#xff09;&#xff0c;首先要判断数据类型是否为 JSON。如果是&#xff0c;就可以使用 Python 内置的json模块进行解析。示例代码如下&#xff1a; import json # 假设respon…

Cesium K-means自动聚合点的原理

Cesium K-means自动聚合点的原理 Cesium 是一个开源的 JavaScript 库&#xff0c;用于在 Web 环境中创建 3D 地球和地图应用。它能够处理地理空间数据&#xff0c;并允许开发者对大规模的地理数据进行可视化展示。在一些应用中&#xff0c;尤其是当处理大量地理坐标点时&#…

入门数据结构JAVADS——如何构建一棵简单二叉排序树

目录 前言 什么是二叉排序树 二叉排序树的特点 二叉排序树示意图 构建二叉排序树 插入元素 搜索元素 删除元素 完整代码 结尾 前言 在整个十一月,笔者因为一些原因停笔了,但马上迈入12月进而进入2025年,笔者决定不再偷懒了,继续更新以促进学习的积极性.闲话说到这,今天…

【深度学习】四大图像分类网络之AlexNet

AlexNet是由Alex Krizhevsky、Ilya Sutskever&#xff08;均为Hinton的学生&#xff09;和Geoffrey Hinton&#xff08;被誉为”人工智能教父“&#xff0c;首先将反向传播用于多层神经网络&#xff09;在2012年ImageNet图像分类竞赛中提出的一种经典的卷积神经网络。AlexNet在…

基于 Python、OpenCV 和 PyQt5 的人脸识别上课打卡系统

大家好&#xff0c;我是Java徐师兄&#xff0c;今天为大家带来的是基于 Python、OpenCV 和 PyQt5 的人脸识别上课签到系统。该系统采用 Python 语言开发&#xff0c;开发过程中采用了OpenCV框架&#xff0c;Sqlite db 作为数据库&#xff0c;系统功能完善 &#xff0c;实用性强…

DevOps工程技术价值流:Jenkins驱动的持续集成与交付实践

一、Jenkins系统概述 Jenkins&#xff1a;开源CI/CD引擎的佼佼者 Jenkins&#xff0c;作为一款基于Java的开源持续集成&#xff08;CI&#xff09;与持续交付&#xff08;CD&#xff09;系统&#xff0c;凭借其强大的插件生态系统&#xff0c;成为DevOps实践中不可或缺的核心…

亚马逊开发视频人工智能模型,The Information 报道

根据《The Information》周三的报道&#xff0c;电子商务巨头亚马逊&#xff08;AMZN&#xff09;已开发出一种新的生成式人工智能&#xff08;AI&#xff09;&#xff0c;不仅能处理文本&#xff0c;还能处理图片和视频&#xff0c;从而减少对人工智能初创公司Anthropic的依赖…

mac下安装Ollama + Open WebUI + Llama3.1

本文介绍mac下安装Ollama Open WebUI Llama3.1 8b具体步骤。 目录 推荐配置Ollama Open WebUI Llama3.1简介安装Ollama安装Open WebUI 推荐配置 m1以上芯片&#xff0c;16g内存&#xff0c;20g以上硬盘空间 Ollama Open WebUI Llama3.1简介 Ollama: 下载&#xff0c;管理…

Swift实现高效链表排序:一步步解读

文章目录 前言摘要问题描述题解解题思路Swift 实现代码代码分析示例测试与结果 时间复杂度空间复杂度总结关于我们 前言 本题由于没有合适答案为以往遗留问题&#xff0c;最近有时间将以往遗留问题一一完善。 148. 排序链表 不积跬步&#xff0c;无以至千里&#xff1b;不积小流…