【数据结构】数据结构

本文是基于中国MOOC平台上,华中科技大学的《数据结构》课程和浙江大学的《数据结构》课程所作的一篇课程笔记,便于后期讲行系统性查阅和复习。

从个人感受而言,华中科技大学的课程讲解更适合初学者(缺点在于,从概念到应用之间的衔接生硬不易懂),浙江大学的课程更适合对基础概念有所了解的初学者(缺点在于,对完全不懂的初学者很不友好)。两个课程搭配学习,有奇效。


一、基础概念

1.1 什么是数据结构

1.1.1 解决问题方法的效率,与什么有关?

解决问题方法的效率,跟数据的组织方式有关。

解决问题方法的效率,跟空间的利用效率有关。

解决问题方法的效率,跟算法的巧妙程度有关。

引入案例:如何在书架上摆放书架?

分析案例:图书的摆放要使得两个操作方便实行

                  1.新书怎么插入?

                  2.怎么找到某本指定的书?

算法一:随便放。

              操作1有空就放,一步到位。操作2需要遍历书架,复杂度高。

算法二:按照书名的拼音字母顺序排放。

              操作1每插入一本新书就要把后面的书进行调整,复杂度高。操作2二分查找。

算法三:分而治之法,书架按块放不同类别的书,每一类里按拼音字母顺序排放。

               操作1先定类别,二分查找位置,移出空位。操作2先定类别,再二分查找。

对比之下,算法三更优。

优化:空间如何分配?类别应该分多细?

解决问题方法的效率,跟数据的组织方式有关。

引入案例:写程序实现一个函数PrintN,使得传入一个正整数为N的参数后,能顺序打印从1到N的全部正整数。

算法一:for循环

void PrintN(int N) {for (int i = 1; i < N + 1; i++) {printf("%d\n", i);}return;
}

算法二:递归函数

void PrintN(int N) {if (N) {PrintN(N - 1);printf("%d\n", N);}return;
}

实际上,在测试代码过程中,N的取值有10、100、1000、10000,而在10、100、1000时两种代码均能跑通。在10000时,递归函数出现了错误,原因是内存不足。

解决问题方法的效率,跟空间的利用效率有关。

引入案例:写程序计算给定多项式在给定点x处的值。

算法一:傻瓜法

double f(int n, double a[], double x) {int i;double p = a[0];for (i = 1; i <= n; i++) p += (a[i] * pow(x, i));return p;
}

算法二:秦久韶算法

double f(int n, double a[], double x) {int i;double p = a[n];for (i = n; i >0; i--) p = a[i - 1] + x * p;return p;
}

对比算法:算法二的运行时间更短。

解决问题方法的效率,跟算法的巧妙程度有关。

1.1.2 什么是数据结构?

 数据结构是数据对象在计算机中的组织方式。

(数据对象的逻辑结构,数据对象在计算机中的物理存储结构)

•数据对象必定与一系列加在其上操作相关联

•实现这些操作所用的方法就是算法。

抽象数据类型

•抽象数据类型是对数据的逻辑描述,而数据结构是对数据的物理描述。抽象数据类型定义了数据的操作和语义,而数据结构实现了这些操作和语义。因此,可以说抽象数据类型是数据结构的一种实现方式。

•数据类型:数据对象集+数据集合相关联的操作集

•抽象:描述数据类型的方法不依赖于具体实现。

(与存放数据的机器无关,与数据存储的物理结构无关,与实现操作的算法编程语言无关)

(只描述数据对象集和相关操作集”是什么“,并不涉及”如何做到“的问题)

1.2 什么是算法

1.2.1 算法的定义

•算法

   •一个有限指令集

   •接收一些输入(有些情况不需要输入),产生输出

   •有穷性:一定在有限步骤之后终止

   •确定性:每一条指令必须有充分明确的目标,不可以有歧义

   •可行性:每一条指令必须计算机能处理的范围之内

   •伪代码:算法描述应不依赖于任何一种计算机语言以及具体的实现手段

1.2.2 什么是好的算法

•衡量好算法的指标:空间复杂度S(n),时间复杂度T(n)。

•在分析一般算法的效率时,经常关注下面两种复杂度:

        1.最坏情况复杂度:T_{_{_{worst}}}(n)

        2.平均复杂度:T_{_{avg}}(n)

通常T_{avg}(n)\leq T_{worst}(n),我们更常用T_{_{_{worst}}}(n)

1.2.3 复杂度的渐进表示 

T(n)=O(f(n))最坏情况复杂度

表示存在常数C>0,n0>0,使得n>=n0时有T(n)\leq C*f(n)

T(n)=Ω(g(n))最好情况复杂度

表示存在常数C>0,n0>0,使得n>=n0时有T(n)\geq C*g(n)

T(n)=Θ(h(n))平均复杂度

表示同时有(n)=O(h(n))和T(n)=Ω(h(n))

 复杂度分析小窍门

•若两段算法分别有复杂度T_{1}(n)=O(f_{1}(n))T_{2}(n)=O(f_{2}(n)),则

 算法相接:T_{1}(n)+T_{2}(n)=max(O(f_{1}(n)),O(f_{2}(n)))

 算法嵌套:T_{1}(n)\times T_{2}(n)=O(f_{1}(n)\times f_{2}(n))

•若T(n)是关于n的k阶多项式,那么T(n)=\circleddash (n^{k})

•一个for循环的时间复杂度=循环次数*循环体代码复杂度

if-else语句的时间复杂度=max{if的条件判断复杂度,if分支的复杂度,else分支的复杂度}

1.3 应用实例

1.3.1 最大子列和问题

问题:给定N个整数的序列{A_{1},A_{2},...,A_{N}},求函数f(i,j)=max{0,\sum_{k=i}^{j}A_{k}}的最大值。

算法一:暴力破解(三个嵌套for循环,复杂度N^{3}T(N)=O(N^{^{3}})

int MaxSubseqSum1(int A[], int N) {int ThisSum=0, MaxSum = 0;int i, j, k;for (i = 0; i < N; i++) {for (j = i; j < N; j++) {for (k = i; k <= j; k++) {ThisSum += A[k];}if (ThisSum > MaxSum) {MaxSum = ThisSum;}}}return MaxSum;
}

算法二:暴力破解改良版(两个嵌套for循环,复杂度N^{2}T(N)=O(N^{^{2}})

int MaxSubseqSum1(int A[], int N) {int ThisSum=0, MaxSum = 0;int i, j, k;for (i = 0; i < N; i++) {for (j = i; j < N; j++) {ThisSum += A[j];if (ThisSum > MaxSum) {MaxSum = ThisSum;}}}return MaxSum;
}

算法三:分而治之(复杂度T(n)=O(N*log(N))

思想上,将大的问题划分为小的块,逐层划分到最小单位。行动上,从最小单位逐层解决问题,直到解决问题。

算法四:在线处理(复杂度T(n)=O(N)

int MaxSubseqSum4(int A[], int N)
{int thissum = 0, maxsum = 0;int i;for (i = 0; i < N; i++){thissum += A[i];if (thissum > maxsum)maxsum = thissum;else if (thissum < 0)thissum = 0;}return maxsum;
}

二、线性结构 

2.1 线性表及其实现

2.1.1 线性表的概念

线性表的定义

•线性表是一种数据结构,是由n(n≥0)个数据元素(a1,a2,…,an)构成的有限序列。

记作:L=(a1,a2,…,an)

a1——首元素,an——尾元素

•表的长度(表长)——线性表中数据元素的数目。

•空表——不含数据元素的线性表。

•对于线性表L=(a1,a2,…,a(i-1),ai,a(i+1),...,an),前驱和后驱:

  a(i-1)在ai之前,称a(i-1)是ai的直接前驱(1<i≤n)

  a(i+1)在ai之后,称a(i+1)是ai的直接后继(1≤i<n)

  a1没有前驱,an没有后继

  ai(1<i<n)有且仅有一个直接前驱和一个直接后继

常见线性表举例

•字母表:L1=(A,B,...,Z),表长为26

•姓名表:L2=(李明,翠菊,方宏名,王林)表长为4

•表格

2.1.2 线性表的基本操作 

线性表的基本操作函数

IniList(&L)//构造空表LListLength (L)//求表L的长度GetElem(L,i,&e)//取元素ai,由e返回aiPriorElem(L,ce,&pre_e)//求ce的前驱,由pre_e返回InsertElem(&L,i,e)//在元素ai之前插入新元素eDeleteElem(&L,i)//删除第i个元素EmptyList(L)//判断L是否为空表

删除操作:DeleteElem(&L,i)

1.删除表中的第i个数据元素(1\leq i\leq n),记作DeleteElem(&L,i)

   即删去表中第i个元素a_{i}

   (a_{1},a_{2},...,a_{i-1},a_{i},a_{i+1},...,a_{n})——>(a_{1},a_{2},...,a_{i-1},a_{i+1},...,a_{n})

2.指定元素值x,删除表L中的值为x的元素,记作:DeleteElem(&L,x)

   即删去表中值为x的元素。若a_{i-1}=x,则

   (a_{1},a_{2},...,a_{i-1},a_{i},a_{i+1},...,a_{n})——>(a_{1},a_{2},...,a_{i},a_{i+1},...,a_{n})

插入操作:InsertElem(&L,i,e)

在元素ai之前插入新元素e(1<=i<=n+1),记作: InsertElem(&L,i,e)

(a_{1},a_{2},...,a_{i-1},a_{i},a_{i+1},...,a_{n})——>(a_{1},a_{2},...,a_{i-1},e,a_{i},a_{i+1},...,a_{n})

查找操作: 确定元素值(或数据项的值)为e的元素。

给定:L=(a1,a2,.….,ai,….,an)和元素e

若有一个ai=e,则称“查找成功”(i=1,2,…n);否则,称“查找失败”。

排序操作:按元素值或某个数据项值的递增(或递减)次序重新排列表中各元素的位置。

例:排序前:L=(90,60,80,10,20,30)

       排序后:L=(10,20,30,60,80,90)

       L变为有序表

 合并操作:将有序表L_{_{a}}L_{b}合并为有序表L_{c}

例:设有序表:La=(2,14,20,45,80)

                         Lb=(8,10,19,20,22,85,90)

           合并为表Lc=(2,8,10,14,19,20,20,22,45,80,85,90)

复制操作:将表L_{_{a}}复制为表L_{b}L_{b}

 

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

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

相关文章

linux 07 存储管理

02. ext4是一种索引文件系统 上面是索引节点inode&#xff0c;存放数据的元数据 下面是存储块block&#xff0c;主要存放有关的信息 03.linux上的inode 查看文件中的inode ll -i 文件名 磁盘中的inode与文件数量

STM32学习笔记——定时器

目录 一、定时器功能概述 1、基本定时器&#xff08;TIM6&TIM7&#xff09; 工作原理 时序 2、通用计时器&#xff08;TIM2&TIM3&TIM4&TIM5&#xff09; 时钟源 外部时钟源模式1&2 外部时钟源模式2 外部时钟源模式1 定时器的主模式输出 输入捕获…

PySpark(四)PySpark SQL、Catalyst优化器、Spark SQL的执行流程、Spark新特性

目录 PySpark SQL 基础 SparkSession对象 DataFrame入门 DataFrame构建 DataFrame代码风格 DSL SQL SparkSQL Shuffle 分区数目 DataFrame数据写出 Spark UDF Catalyst优化器 Spark SQL的执行流程 Spark新特性 自适应查询(SparkSQL) 动态合并 动态调整Join策略 …

一周学会Django5 Python Web开发-Django5创建项目(用命令方式)

锋哥原创的Python Web开发 Django5视频教程&#xff1a; 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计11条视频&#xff0c;包括&#xff1a;2024版 Django5 Python we…

js中new操作符详解

文章目录 一、是什么二、流程三、手写new操作符 一、是什么 在JavaScript中&#xff0c;new操作符用于创建一个给定构造函数的实例对象 例子 function Person(name, age){this.name name;this.age age; } Person.prototype.sayName function () {console.log(this.name) …

编曲学习:旋律创作基础概念 和弦进行作曲 和弦外音使用 作曲技巧

旋律创作基础概念 和弦进行作曲 和弦外音使用 作曲技巧https://app8epdhy0u9502.pc.xiaoe-tech.com/live_pc/l_65be1ba7e4b064a83b92a3d7?course_id=course_2XLKtQnQx9GrQHac7OPmHD9tqbv文档https://app8epdhy0u9502.pc.xiaoe-tech.com/p/t_pc/course_pc_detail/camp_pro/cour…

【Larry】英语学习笔记语法篇——从句=连词+简单句

目录 三、从句连词简单句 1、必须有连词 主从结构 疑问词的词性 2、名词性从句 同位语从句 形式主语 形式宾语 that的省略 3、形容词性从句&#xff08;上&#xff09; 关系代词 关系词的作用 介词前置问题 4、形容词性从句&#xff08;中&#xff09; 定语关系…

【开源】SpringBoot框架开发医院门诊预约挂号系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 功能性需求2.1.1 数据中心模块2.1.2 科室医生档案模块2.1.3 预约挂号模块2.1.4 医院时政模块 2.2 可行性分析2.2.1 可靠性2.2.2 易用性2.2.3 维护性 三、数据库设计3.1 用户表3.2 科室档案表3.3 医生档案表3.4 医生放号…

vue3 之 商城项目—home

home—整体结构搭建 根据上面五个模块建目录图如下&#xff1a; home/index.vue <script setup> import HomeCategory from ./components/HomeCategory.vue import HomeBanner from ./components/HomeBanner.vue import HomeNew from ./components/HomeNew.vue import…

基于SSM的网络在线考试系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的网络在线考试系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring …

《MySQL 简易速速上手小册》第6章:MySQL 复制和分布式数据库(2024 最新版)

文章目录 6.1 设置和管理复制6.1.1 基础知识6.1.2 重点案例&#xff1a;使用 Python 设置 MySQL 主从复制6.1.3 拓展案例 1&#xff1a;自动故障转移6.1.4 拓展案例 2&#xff1a;设置双主复制 6.2 复制的类型和策略6.2.1 基础知识6.2.2 重点案例&#xff1a;使用 Python 设置半…

架构整洁之道-软件架构-测试边界、整洁的嵌入式架构、实现细节

6 软件架构 6.14 测试边界 和程序代码一样&#xff0c;测试代码也是系统的一部分。甚至&#xff0c;测试代码有时在系统架构中的地位还要比其他部分更独特一些。 测试也是一种系统组件。 从架构的角度来讲&#xff0c;所有的测试都是一样的。不论它们是小型的TDD测试&#xff…

windowsserver 2016 PostgreSQL9.6.3-2升级解决其安全漏洞问题

PostgreSQL 身份验证绕过漏洞(CVE-2017-7546) PostgreSQL 输入验证错误漏洞(CVE-2019-10211) PostgreSQL adminpack扩展安全漏洞(CVE-2018-1115) PostgreSQL 输入验证错误漏洞(CVE-2021-32027) PostgreSQL SQL注入漏洞(CVE-2019-10208) PostgreSQL 安全漏洞(CVE-2018-1058) …

数据库管理-第146期 最强Oracle监控EMCC深入使用-03(20240206)

数据库管理145期 2024-02-06 数据库管理-第146期 最强Oracle监控EMCC深入使用-03&#xff08;20240206&#xff09;1 概览2 性能中心3 性能中心-Exadata总结 数据库管理-第146期 最强Oracle监控EMCC深入使用-03&#xff08;20240206&#xff09; 作者&#xff1a;胖头鱼的鱼缸&…

dddddddddddddddddddd

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起探讨和分享Linux C/C/Python/Shell编程、机器人技术、机器学习、机器视觉、嵌入式AI相关领域的知识和技术。 磁盘满的本质分析 专栏&#xff1a;《Linux从小白到大神》 | 系统学习Linux开发、VIM/GCC/GDB/Make工具…

安全之护网(HVV)、红蓝对抗

文章目录 红蓝对抗什么是护网行动&#xff1f;护网分类护网的时间 什么是红蓝对抗红蓝对抗演练的目的什么是企业红蓝对抗红蓝对抗价值参考 红蓝对抗 什么是护网行动&#xff1f; 护网的定义是以国家组织组织事业单位、国企单位、名企单位等开展攻防两方的网络安全演习。进攻方…

基于CNN卷积网络的MNIST手写数字识别matlab仿真,CNN编程实现不使用matlab工具箱

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 卷积神经网络&#xff08;CNN&#xff09; 4.2 损失函数和优化 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ......................…

Bert下载和使用(以bert-base-uncased为例)

Bert官方github地址&#xff1a;https://github.com/google-research/bert?tabreadme-ov-file 【hugging face无法加载预训练模型】OSError&#xff1a;Can‘t load config for ‘./bert-base-uncased‘. If you‘re trying 如何下载和在本地使用Bert预训练模型 以bert-base-u…

计算机网络基本知识(一)

文章目录 概要速率带宽、吞吐量带宽吞吐量 时延发送&#xff08;传输&#xff09;时延传播时延排队时延处理时延时延带宽积 利用率 概要 速率、带宽、吞吐量、时延、利用率 速率 记忆要点&#xff1a;10的三次方 记忆要点&#xff1a;2的10次方 带宽、吞吐量 带宽 单位&…

【lesson11】高并发内存池性能优化

文章目录 高并发内存池性能问题基数树优化性能代码一层基数树两层基数树三层基数树 一层基数树替代mapPageCache.hPageCache.cpp基数树线程安全的原因 高并发内存池性能问题 我们知道&#xff0c;我们实现的高并发内存池存在大量的申请锁和&#xff0c;释放锁&#xff0c;而这…