[超水笔记之一]北大慕课:数据结构与算法Python版

前言

最近在自学数据结构,就把课堂记得笔记整理了一下,以便自己日后复习(我写的太水了,估计也就我自己看看···)。

hahaha
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的特性。

抽象数据类型栈定义为如下操作:

  1. stack() 创建一个空栈,不包含任何数据项

  2. push(item) 将item加入栈顶,无返回值

  3. pop() 将栈顶数据项移除,并返回,栈被修改

  4. peek() “窥视”栈顶数据项,返回栈顶的数据项,但不移除,栈不被修改

  5. isEmpty() 返回栈是否为空栈

  6. 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.表达式转换

  1. 中缀表达式
  • 概念 : 操作符 (operator)介于操作数(operand)中间的表示法,称为“中缀”表示法。
    例如:B*C => BC

  • 中缀表达式中的优先级 :括号优先级最高,括号嵌套,内层括号优先级更高。

  • 全括号中缀表达式 : 在所有的表达式两边都加上括号。

  • 前缀和后缀表达式 : 操作符在字符前,则前缀;在后,则后缀

步骤:

  1. 改写全括号表达式
  2. 将操作符左移或右移至括号外
  3. 去掉全部括号

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定义的操作

  1. deque() 创建空双端队列
  2. addfront(item) 将item加入队首
  3. addrear(item) 将item加入队尾
  4. removefront() 从队首移除数据项,返回值为移除的数据项
  5. removerear() 从队尾移除数据项,返回值为移除的数据项
  6. isempty() 返回deque是否为空
  7. size() 返回deque中包含数据项的个数**

在这里插入图片描述

1.4 无序表抽象数据类型

无序表操作

  1. list() 创建空列表
  2. add(item) 添加数据项到列表中
  3. remove(item) 从列表中移除item,列表被修改
  4. search(item) 在列表中查找item,返回布尔型值
  5. isempty() 返回列表是否为空
  6. size() 返回列表中包含了多少数据项**

1.5 有序表抽象数据类型

概念 : 有序表是一种数据项依照其某可比性质(如整数大小、字母表先后)来决定在表中的位置

OrderedList定义操作

  1. orderedlist() 创建空的有序表
  2. add(item) 表中添加一个数据项,保持整体顺序
  3. remove(item) 有序表中移除一个数据项
  4. search(item) 在有序表中查找数据项,返回是否存在
  5. isempty() 是否空
  6. size() 返回表中数据项的个数
  7. index(item) 返回数据项在表中位置
  8. pop() 移除并返回数据项在有序表中最后一项
  9. 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

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值