数据结构-1

cpp 复制代码
数据结构的模拟实现不会采⽤ malloc 和 free ,或者 new 和 delete 的⽅式,⽽是采⽤
静态的⾜够⼤的数组来模拟实现。

第一章 数据结构、算法与 STL

1.什么是数据结构?

cpp 复制代码
官⽅定义:在计算机科学中,数据结构是⼀种数据组织、管理和存储的格式。它是相互之间存在⼀种
或多种特定关系的数据元素的集合。
说点通俗易懂的话,数据结构就是数据的组织形式,研究的就是把数据按照何种形式存储在计算机
中。

为什么会有数据结构?
随着计算机的发展和应⽤范围的拓展,计算机需要处理的数据量越来越⼤,数据类型越来越多,数
据之间的关系也越来越复杂。
这就要求⼈们对计算机加⼯处理的数据进⾏系统的研究,即研究数据的特性、数据之间存在的关
系,以及如何有效的组织、管理存储数据,从⽽提⾼计算机处理数据的效率。
数据结构这⻔学科就是在此背景上逐渐形成和发展起来的。

对数据结构更深层次的理解:数据结构研究的是数据本⾝的特性、数据与数据之间的关系,以及如何
在计算机中存储数据,从⽽⾼效的处理这些数据。

2.数据结构的三要素

1.逻辑结构

cpp 复制代码
逻辑结构:数据中各元素之间的逻辑关系。
它只关⼼数据中各个元素之间的关系,并不关⼼数据是怎么在内存中存储的。

2.存储结构

cpp 复制代码
存储结构⼜称物理结构,但是存储⼆字更能体现本意,后续我们统称存储结构。
存储结构顾名思义,就是数据在计算机中是如何存储的。
⽤⼤⽩话就是,怎么把这个数据结构存到计算机中。

数据的存储结构主要有顺序存储以及链式存储。


3.数据的运算

cpp 复制代码
数据的运算(针对数据的各种操作),包括数据结构的实现,以及基于数据结构上的各种操作。

• 此时我们已经知道这⼀堆数据中各个元素之间的关系,也知道这堆数据应该在内存中如何存储。
• 接下来要做的就是实现我们的想法,就是真真正正的把数据存在计算机中(写代码),并且在存储
的基础上对数据进⾏各种操作。

各种操作就包括:
创建这个数据结构;增加数据;删除数据;查找数据;
修改数据;排序数据;输出数据;
总结下来就是:创 + 增删查改 + 其他

3.什么是算法

cpp 复制代码
算法(Algorithm)是指解题⽅案的准确⽽完整的描述,是⼀系列解决问题的清晰指令,算法代表着
⽤系统的⽅法描述解决问题的策略机制。也就是说,能够对⼀定规范的输⼊,在有限时间内获得所
要求的输出。
算法是可以没有输⼊的,⼀定要有输出的。没有输出的算法是没有意义的。
简单来说算法就是⼀系列的步骤,⽤来将输⼊数据转化成输出结果。

4.算法好坏的度量

时间和空间的消耗情况就是我们度量⼀个算法好坏的标准,也就是时间复杂度和空间复杂度

cpp 复制代码
【事前分析法】
算法设计好后,根据算法的设计原理,只要问题规模确定,算法中基本语句执⾏次数和需求资源个数
基本也就确定了。
⽐如求 1 + 2 + 3 + ... + n − 1 + n ,可以设计三种算法:


算法执行所需资源的个数与问题规模有关。因此可以根据算法执行过程中对空间的消耗来衡量算法的好坏,这就是空间复杂度


算法中基本语句总的执行次数与问题规模有关。因此可以根据算法执行过程中,所有语句被执行的次数之和来衡量算法的好坏,这就是时间复杂度

5.时间复杂度-大O表法

大O表法

最优、平均和最差时间复杂度

案例

6.空间复杂度

冒泡排序

递归求阶乘

7.STL

for循环在c++11中被引用

第二章 顺序表和vector

1.顺序表的概念

线性表的定义

线性表的每一个元素的类型都是一致的,例如:int a ={1,2,3,4,5};

a1是表头 a5是表尾 a3是a4的前驱 a4是a3的后继 如果一个表里面什么也没有是空表 也就是空集

a1也可以是a2的前驱 是相对来说的

线性表的顺序存储 - 顺序表

2.顺序表的模拟实现

往后实现各种数据结构的时候,如果不做特殊说明,默认里面存储的就是 int 类型的数据。

顺序表的实现方式

按照数组的申请方式,有以下两种实现方式:

动态申请是用new和delete

静态申请是int a =

3.创建

4.添加⼀个元素

尾插:

**时间复杂度:**直接放在后⾯即可,时间复杂度为 O(1)

头插:


时间复杂度:由于需要将所有元素右移⼀位,时间复杂度为 O (N) 。

任意位置插入

p后面的元素全部往后面进行平移


时间复杂度: 最坏情况下需要数组中所有元素右移,时间复杂度为 O (N) 。

5.删除⼀个元素

删除之前,要判断⼀下顺序表里面有没有元素

尾删


时间复杂度: 直接放在后面即可,时间复杂度为 O(1)

头删


全部左移删除最后一个
时间复杂度: 需要所有元素整体左移,时间复杂度为 O (N) 。

任意位置删除



时间复杂度: 最坏情况下,所有元素都需要左移,时间复杂度为 O (N) 。

6.查找元素

按值查找

时间复杂度: 最坏情况下需要遍历整个数组,时间复杂度为 O (N) 。
按位查找

时间复杂度: 这就是顺序表随机存取的特性,只要给我⼀个下标,就能快速访问到该元素。
时间复杂度为 O(1) 。

7.修改元素


时间复杂度为 O(1) 。

8. 清空顺序表


正常的情况是从后往前不断的进行遍历 然后进行一个一个删除,直接让n=0,会导致内存的泄露

9.封装静态顺序表


利用 C++ 中的结构体和类把我们实现的顺序表封装起来,就能简化操作



10.动态顺序表 - vector



int a10={ }这个创建方式就跟大小n的数组 所以vector<int> a8N就是创建N个vector

11.size / empty




12.begin / end

13.push_back / pop_back




14.resize+clear



.size会变成0

15.询问学号


16.寄包柜



17.移动零




因为是不复制数组 所以需要使用& swap() 是 交换两个变量值的函数。

18.颜色分类




19.合并两个有序数组






因为 nums2 剩下的元素肯定都比 nums1 当前处理过的部分小,所以直接无条件复制到 nums1 的前端即可。

时间复杂度是o(n+m)

20.pair

cpp 复制代码
pair 是 C++ 标准库中的⼀个模板类,⽤于将两个值组合成⼀个单⼀对象,通常⽤于存储键值对或返
回多个值。它有两个公有成员 first 和 second ,分别表⽰第⼀个值和第⼆个值。


想要第一个值:p1.first 第二个值是:p2.second
typedef进行重命名

21.The Blocks Problem



本质是⼀个模拟题,可以用vector来模拟,注意细节问题。

22.拓展:ACM 模式 vs 核心代码模式



相关推荐
闪电悠米17 小时前
力扣hot100-41.缺失的第一个正数-原地哈希详解
数据结构·算法·哈希算法
WL学习笔记17 小时前
堆(数据结构)
数据结构·
wabs66621 小时前
关于图论【卡码网100.最大岛屿的面积的思考】
数据结构·算法·图论
yuannl101 天前
图的最短路径Dijkstra
数据结构
fpcc1 天前
数据结构和算法—拓扑的应用
数据结构·c++·算法
zander2581 天前
138. 随机链表的复制
数据结构·算法·链表
过期动态1 天前
【LeetCode 热题 100】找到字符串中所有字母异位词
java·数据结构·算法·leetcode·职场和发展·rabbitmq
来一碗刘肉面1 天前
栈在递归中的应用
数据结构·算法
皓月斯语1 天前
程序设计语言的特点
开发语言·数据结构·c++