这两节课的内容主要还是关于python的基础数据结构的问题,如果学过python的话可以过一遍ppt内容即可,所以将两个lec合成了一个记录。

一、lecture

lec11 : https://inst.eecs.berkeley.edu/~cs61a/sp21/assets/slides/11-Data_Abstraction_full.pdf

lec12 : https://inst.eecs.berkeley.edu/~cs61a/sp21/assets/slides/12-Trees_full.pdf

1.1 Data Abstraction

数据抽象有点类似于我们数据结构中学到的ADT类型,我的理解为可以说比较偏向于类,就是说当我们遇到语言中无法提供基础语法的数据情况时,我们应该如何自己构建出一个基本的数据类型。使用的时候我们只需要将接口调用给外部使用者,内部封装起来(这非常像类的思想)。

图1 : Data Abstraction 的哲学(doge)

就像 我们上个lec构造出的pair类型一样,那也是我们构建出的一个简单的数据机构,用来表示一组数对之间的关系,我们回忆一下我们都需要构建那些基础的部分?首先是需要有类似构造的部分,即给你两个数,需要返回一个经过特定运算的值;其次是给你了一个值,可以返回出构建这个值得数对;最后是可以对这个机构做一些基础的运算。这样我们就简单构建出了一项python中没有内置的数据结构。

同理,我们的数据抽象也需要类似的构造方法。

图2 :通用的构建方法(省事我直接粘图了)

然后ppt里提到了一种有理数的特殊的数据类型,可以理解为一种分数的表示方式。(下一节课会有诸如树等的更多抽象结构出现,这里我就不在列举更多的结构)。

图3 : 有理数的基本要求

可以看到一个有理数,一个分数的表示形式是由分子和分母构成,所以外部接口是只要给丁两个数,我就可以给你返回一个有理数;同时,给定一个有理数,我可以返回构成这个有理数的两个数。但是这样的构建会出现问题,比如我们的分子和分母如果出现了公约数怎么办?我们该如何对两个有理数进行计算?

回答这些问题我们可以想到用一些方法可以求出两个数的最大公约数,同时我们应该创造一种表示使得我们在屏幕上打印时可以更好的显示出效果,并且可以对有理数进行加减乘除运算。

from math import gcddef make_rat_ini(n, d):"""The rational number N/D, assuming N, D are integers, D!=0"""#g = gcd(n, d)#n //= g; d //= greturn (n, d)def make_rat(n, d):"""The rational number N/D, assuming N, D are integers, D!=0"""g = gcd(n, d)n //= g; d //= greturn (n, d)def numer(r):"""The numerator of rational number R in lowest terms."""return r[0]def denom(r):"""The denominator of rational number R in lowest terms.Always positive."""return r[1]def add_rat(x, y):return make_rat(numer(x) * denom(y) + numer(y) * denom(x),denom(x) * denom(y))def mul_rat(x, y):return make_rat(numer(x) * numer(y), denom(x) * denom(y))def str_rat(r):  # (For fun: a little new Python string magic)return str(numer(r)) if denom(r) == 1 else f"{numer(r)}/{denom(r)}" def equal_rat(x, y):return numer(x) * denom(y) == numer(y) * denom(x)

这就是我们对于有理数的基本定义,我们可以在这个基础上做一些基础的应用比如数列求和。

def exact_harmonic_number(n):"""Return 1 + 1/2 + 1/3 + ... + 1/N as a rational number.>>> str_rat(exact_harmonic_number(1))'1'>>> str_rat(exact_harmonic_number(3))'11/6'>>> str_rat(exact_harmonic_number(10))'7381/2520'"""s = make_rat(0, 1)for k in range(1, n + 1):s = add_rat(s, make_rat(1, k))return s

最后我们总结一下我们数据抽象。

图4 : 数据抽象总结

1.2 Dic、Matrices、Trees

这一节课主要介绍的内容如标题所示,因为主要还是一些python语法和衍生的一些问题,所以不再赘述。

首先介绍一下词典,这是python中非常有特点的数据类型,相当于数据结构中的散列表,是以键值对的形式组成的,详细的可以参考网上的资料进一步学习。

Python Dictionaries

然后是词典的使用有如下注意事项:

1、key不能是任何可更改的类型,如list、dic等;

2、字典中所有的key具有唯一性,即key不可重复;

3、 value可以是任何类型;

接下来我们介绍一下这节课提到的两类有趣的数据抽象,矩阵和树。

想象一下我们线性代数中学到的最基础的矩阵,我们应该如何自己简单在python中实现这类表示?嵌套列表?或者是列表内嵌套元组?

我们可以尝试如下所展示的嵌套列表的方式实现简单的矩阵初始化和赋值操作。

def matrix(rows, cols):mat = []for i in range(rows):curt_row = []for j in range(cols):curt_row.append(0)mat += curt_rowreturn mat#return [ [0 for col in range(cols)] for row in range(rows) ]def value(matrix, row, col):return matrix[row][col]def set_value(matrix, row, col, val):matrix[row][col] = val

这只是一种简单普通的实现矩阵的方式,同时也是基础python中最常见,同时课上老师还提到并实现了元组和列表组合的方式来实现矩阵,可以参考ppt简单过一遍,在此处不赘述。

然后重点介绍一下树这种抽象数据结构,因为之前接触的较少并且数据结构学的不太好的缘故,所以这类着重加深一下理解,首先什么是树?

图5 : 树的定义

这页ppt的树比较直观,事实上这是一种比较完美的二叉树,即每个节点最多有两个child节点的结构,我们之前也学习过树形递归,这里也就不展开说了。我们要实现这个数据结构需要的步骤就复杂一些,首先构造方面需要根据用户需求构造出一棵树,同时还要有判断这棵树是否是叶子结点,并且需要有返回一个节点的孩子节点的函数,具体要求可以看下这页ppt。然后给出的是这些函数的简单实现。(ps:判断是否属于叶子结点只需要看其子树的个数即可,子树个数为0即为叶子结点)

图6: 树的抽象

def tree(label, child = []):return [label] + childdef label_tree(tree):return tree[0]def child_tree(tree):return tree[1:]def is_leaf(tree):return len(children(tree)) == 0

同时说明一下,这种结构也是我个人比较喜欢的结构,老师上课也讲到了由字典和列表构成的结构,有兴趣可以看一下ppt。然后我们来一个对树的应用,比如给定一个树,计算其叶子结点的个数。下面给出递归实现的方法(强烈建议自己理解敲一边加深记忆)。首先先给出思路,考虑推出条件,如果当前递归到了叶子结点,那么我们应该返回1,记住这是退出的条件;然后对于非叶子结点,我们应该遍历其所有的子树,然后计算各个子树的叶子树值。

def count_leaves(t):"""Returns the number of leaf nodes in T."""if is_leaf(t):return 1else:child_leaf = 0for tt in child_tree(t):child_leaf += count_leaves(tt)return child_leaf

以上即为这两节的主要内容,数据抽象和树的部分都比较重要,python基础语法部分不太理解的可以再找资料学习一下。

【菜gou的CS61A学习笔记10 Abstraction Trees】相关推荐

  1. thinkphp学习笔记10—看不懂的路由规则

    原文:thinkphp学习笔记10-看不懂的路由规则 路由这部分貌似在实际工作中没有怎么设计过,只是在用默认的设置,在手册里面看到部分,艰涩难懂. 1.路由定义 要使用路由功能需要支持PATH_INF ...

  2. SpringMVC:学习笔记(10)——整合Ckeditor且实现图片上传

    SpringMVC:学习笔记(10)--整合Ckeditor且实现图片上传 配置CKEDITOR 精简文件 解压之后可以看到ckeditor/lang下面有很多语言的js,如果不需要那么多种语言的,可 ...

  3. springmvc学习笔记(10)-springmvc注解开发之商品改动功能

    springmvc学习笔记(10)-springmvc注解开发之商品改动功能 springmvc学习笔记(10)-springmvc注解开发之商品改动功能 标签: springmvc springmv ...

  4. Hadoop学习笔记—10.Shuffle过程那点事儿

    Hadoop学习笔记-10.Shuffle过程那点事儿 一.回顾Reduce阶段三大步骤 在第四篇博文<初识MapReduce>中,我们认识了MapReduce的八大步骤,其中在Reduc ...

  5. Linux学习笔记10

    Linux学习笔记10 Linux学习笔记10 正则表达式 源码包约定目录 Shell脚本约定目录 Shell脚本的创建与执行 date命令 同步时间 Shell脚本预设变量 与用户交互 数学计算 S ...

  6. HALCON 20.11:深度学习笔记(10)---分类

    HALCON 20.11:深度学习笔记(10)---分类 HALCON 20.11.0.0中,实现了深度学习方法. 本章解释了如何在训练和推理阶段使用基于深度学习的分类. 基于深度学习的分类是一种对一 ...

  7. 台大李宏毅Machine Learning 2017Fall学习笔记 (10)Tips for Deep Learning

    台大李宏毅Machine Learning 2017Fall学习笔记 (10)Tips for Deep Learning 注:本博客主要参照 http://blog.csdn.net/xzy_thu ...

  8. Python学习笔记--10.Django框架快速入门之后台管理admin(书籍管理系统)

    Python学习笔记--10.Django框架快速入门之后台管理 一.Django框架介绍 二.创建第一个Django项目 三.应用的创建和使用 四.项目的数据库模型 ORM对象关系映射 sqlite ...

  9. 史上最牛最强的linux学习笔记 10.shell基础

    史上最牛最强的linux学习笔记 10.shell基础 写在最前面: 本文是基于某站的视频学习所得,第一个链接如下: https://www.bilibili.com/video/BV1mW411i7 ...

  10. 【论文学习笔记-10】ActiveStereoNet(Google ECCV2018)主动式双目相机自监督学习立体匹配网络

    [论文学习笔记-10]ActiveStereoNet(Google ECCV2018)主动式双目相机自监督学习立体匹配网络) 自监督训练方法 Experiment ORAL 针对双目立体匹配中无监督存 ...

最新文章

  1. 浅析php反序列化字符串逃逸
  2. EventBus设计与实现分析——订阅者的注册
  3. 小程序卡片叠层切换卡片_现在,卡片和清单在哪里?
  4. MATLAB(二)数据的输入
  5. 2016第三届科学数据大会诚邀商务合作
  6. (收藏)Android VoIP
  7. android gpu 编程,Android设备上的GPU编程
  8. vs2005用正则表达式统计有效代码行数
  9. npm ERR! y@1.0.0 dev: `webpack-dev-server --inline --progress --config build/webpack.dev.conf.js`
  10. Unity官方支持中文版啦!!!附教程——无需破解!
  11. 上海工程技术大学c语言商店存货管理系统,商店存货管理系统课程设计.doc
  12. hbase--索引概念(含二级索引)
  13. 计算机自检报错无法开机,常见电脑开机自检BIOS错误提示解决方法
  14. 六一小学生计算机创新活动总结,2020小学生六一儿童节活动总结
  15. C#判断线段是否相交
  16. 百战归来再读书--一个程序员的2008年阅读书目
  17. “京东红”托起“松石绿” 湖北十堰让世界发现中国珠宝之美
  18. 木兰开源社区分论坛 | ChinaOSC
  19. Scyther工具形式化分析Woo-Lam协议
  20. 【非原创】完全用Linux工作(上)(r4笔记第86天)

热门文章

  1. 使用 SOUI 开发高 DPI 桌面应用程序
  2. 卸载华为系统wifi服务器,如何安装随行WiFi驱动及如何卸载驱动
  3. PPT计算机辅助教学,计算机辅助教学与多媒体课件制作
  4. 如何在EXCEL中练习VBA?
  5. Honor V10 BKL-AL20 ROOT(Magisk方式)
  6. vue.draggable的中文文档链接
  7. Uniapp引入和使用阿里矢量图
  8. 最小二乘法计算平面度
  9. 推导多元最小二乘法的计算方法
  10. linux fdisk指定ext4,如何在Linux中创建新的Ext4文件系统(分区)