前言
最近在自学数据结构,就把课堂记得笔记整理了一下,以便自己日后复习(我写的太水了,估计也就我自己看看···)。
OK,言归正传,笔记呈上。
python数据类型
python数据类型比较
列表与字典的比较
1.列表list
- 最常用:索引与赋值。执行时间与列表长度无关,
复杂度都是O(1) - 列表增长:append 复杂度为O(1);
“+”复杂度为O(n+k),其中k为被加列表长度
注:可用timeit模块对函数计时
from timeit import Timer
t = Timer(func)
print('t1=%f'%t1.timeit(number=1000))
time : list range<列表生成式<append<concat
2.字典dict
这个只记了查询速度更快。具体参考 新世界大门.
基本结构
1.线性结构
1.线性结构是一种有序数据项集合,其中每个数据项都有唯一的前驱和后继
2.线性结构总有两端
3.包括:栈stack,队列query,双端队列deque和列表list
这些数据集的共同点在于,数据项之间只存在先后的次序甚,都是线性结构
- 进程队列;消息队列;调用栈
##2.基本结构
###线性结构
1.线性结构是一种有序数据项集合,其中每个数据项都有唯一的前驱和后继
2.线性结构总有两端
3.包括:
栈stack,队列query,双端队列deque和列表list
这些数据集的共同点在于,数据项之间只存在先后的次序甚,都是线性结构
具体包括:进程队列;消息队列;调用栈
1.1栈抽象数据类型
概念:一种有次序的数据项集合,在栈中,数据项的加入和移除都仅发生在同一端
这一端叫栈“顶top”,另一端叫栈“底base”
距离栈底越近的数据项,留在栈中的时间就越长,而最新加入栈的数据项会被最先移除
这种次序常称为“后进先出LIFO(last in first out)”
这是一种基于数据项保存时间的次序,时间越短的离栈顶越近,而时间越长的离栈底越近
话不多说,上截图
总结:
1.抽象数据类型“栈”是一个有次序的数据集,每个数据项仅从“栈顶”一端加入到数据集中、从数据集中移除。
2.栈具有后进先出LIFO的特性。
抽象数据类型栈定义为如下操作:
-
stack() 创建一个空栈,不包含任何数据项
-
push(item) 将item加入栈顶,无返回值
-
pop() 将栈顶数据项移除,并返回,栈被修改
-
peek() “窥视”栈顶数据项,返回栈顶的数据项,但不移除,栈不被修改
-
isEmpty() 返回栈是否为空栈
-
size() 返回栈中有多少个数据项
上图体会一下
1.1.1栈的应用
1.简单括号匹配
2.十进制转换为二进制
简单例子:
十进制 => 二进制
法一:
( 233 ) 10 = 2 × 1 0 2 + 3 × 1 0 1 + 3 × 1 0 0 (233)_{10}=2\times10^{2}+3\times10^{1}+3\times10^{0} (233)10=2×102+3×101+3×100
法二:233除以2取余数。反转输出
二进制 => 十进制
( 11101001 ) 2 = 1 × 2 7 + 1 × 2 6 + 1 × 2 5 + 0 × 2 4 + 1 × 2 3 + 0 × 2 2 + 0 × 2 1 + 1 × 2 0 (11101001)_{2}=1\times2^{7}+1\times2^{6}+1\times2^{5}+0\times2^{4}+1\times2^{3}+0\times2^{2}+0\times2^{1}+1\times2^{0} (11101001)2=1×27+1×26+1×25+0×24+1×23+0×22+0×21+1×20
3.表达式转换
- 中缀表达式
-
概念 : 操作符 (operator)介于操作数(operand)中间的表示法,称为“中缀”表示法。
例如:B*C => BC -
中缀表达式中的优先级 :括号优先级最高,括号嵌套,内层括号优先级更高。
-
全括号中缀表达式 : 在所有的表达式两边都加上括号。
-
前缀和后缀表达式 : 操作符在字符前,则前缀;在后,则后缀
步骤:
- 改写全括号表达式
- 将操作符左移或右移至括号外
- 去掉全部括号
1.2 队列抽象数据类型
概念 :队列是一种有次序的数据集合,其特征是,新数据项的添加总发生在一端(通常称为"尾(rear)"端);
而现存数据项的移除总发生在另一端(通常称为”首(front)“端)
当数据项加入队列,首先出现在队尾,随着首数据项的移除,它逐渐接近队首。
新加入的数据项必须在数据集末尾等待。这种次序安排的原则称为先进先出(FIFO:first in first out)
或 先到先服务(first-come first-served)
总结 : 抽象数据类型队列是一个有次序的数据集合
数据项仅添加到“尾rear”端而且仅从“首front”端移除。
队列具有FIFO的操作次序。
队列操作定义
- queue() 创建一个空队列对象,返回值为queue对象
- enqueue(item) 将数据项item添加到队尾,无返回值
- dequeue() 从队首移除数据项,返回值为队首数据项,队列被修改
- isEmpty() 测试是否为空队列,返回值为布尔型
- size() 返回队列中数据项的个数
1.2.1 队列的应用
队列应用:热土豆
队列应用:打印任务
1.3 双端队列
deque定义的操作
- deque() 创建空双端队列
- addfront(item) 将item加入队首
- addrear(item) 将item加入队尾
- removefront() 从队首移除数据项,返回值为移除的数据项
- removerear() 从队尾移除数据项,返回值为移除的数据项
- isempty() 返回deque是否为空
- size() 返回deque中包含数据项的个数**
1.4 无序表抽象数据类型
无序表操作
- list() 创建空列表
- add(item) 添加数据项到列表中
- remove(item) 从列表中移除item,列表被修改
- search(item) 在列表中查找item,返回布尔型值
- isempty() 返回列表是否为空
- size() 返回列表中包含了多少数据项**
1.5 有序表抽象数据类型
概念 : 有序表是一种数据项依照其某可比性质(如整数大小、字母表先后)来决定在表中的位置
OrderedList定义操作
- orderedlist() 创建空的有序表
- add(item) 表中添加一个数据项,保持整体顺序
- remove(item) 有序表中移除一个数据项
- search(item) 在有序表中查找数据项,返回是否存在
- isempty() 是否空
- size() 返回表中数据项的个数
- index(item) 返回数据项在表中位置
- pop() 移除并返回数据项在有序表中最后一项
- pop(pos) 移除并返回有序表中指定位置的数据项
1.6 线性结构小结
- 线性结构将数据项以某种线性的次序组织起来
- 栈stack维持了数据项后进先出LIFO的次序。
stack的基本操作包括push,pop,isempty - 队列queue维持了数据项先进先出FIFO的次序。
queue的基本操作包括:enqueue,dequeue,isempty - 书写表达式的方法有前缀prefix,中缀infix,后缀postfix三种
由于栈结构具有次序反转的特性,所以栈结构适合用于开发表达式求值和转换的算法 - “模拟系统”可以通过一个对现实世界问题进行抽象建模,并加入随机数动态运行,为复杂问题的决策提供各种情况的参考。
队列可用于模拟系统的开发 - 双端队列可以同时具有栈和队列的功能。
主要操作包括:addfront,addrear,removefront,removerear,isempty - 链表是数据项能够维持相对位置的数据集
- 链表实现时,其各种方法,对链表头部需要特别处理
未完待续。。。
参考文献:
[1]: https://blog.csdn.net/weixin_42681866/article/details/82785127?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase