本周由于前一半在忙实验室汇报,后面还带了家教,所以暂时还未完成全部课程学习。不过基本已经学完了,只剩最后两课。现先给出已看课程的总结。
5月22日更新,已看完所有视频,收获良多,下面的任务是看算法和刷题,总结已更新完毕。个人也做了50多页的笔记,以后还是要温故的。
总体上,看这个视频花了较长时间。看的是2014版,没有中文字幕,不过语言整体上较为清晰易懂。因为花了大量时间做笔记和编程练习,所以整体上进度较慢。做笔记一方面是总结以便以后查看,一方面也当是练习英语了。演讲人是William Eric Grimson,今天心血来潮查了一下,是个大牛,IEEE,AAAI和ACM fellow,最近几年还当了MIT的校长。讲的内容逻辑很清晰,虽然用的是Python语言,但思想是共通的,把程序设计的主要思想都给涵盖了。有个小缺陷,就是视频里基于的是Python2,用新的Python Interpreter有些地方会报错,需要自己上网查阅修改。
下面这个视频课程需要注意的几个内容。首先,本门计算机科学和编程入门课程使用的语言是Python,演讲人也给出了原因:语法简单易学,解释型语言(bug容易定位),不用进行内存管理。这样,初学者可以把更多的精力集中于理解思想,而不是浪费在细节上(吐槽下C++)。而且,需要指出的时,随着存储和计算能力的大幅提高,modernstyle programming language都将趋向Python这样的风格,更人性化,而不是为了点内存锱铢必较。其次,本文希望突出的几个重点:系统性,算法及其复杂度,抽象。其中,系统性是指一个人编写,测试,调试代码的整体行为,是一个coder的基本功。而抽象,是演讲者所一直强调的computationalthinking的核心,包括如何将实际问题化简为已有成熟解法问题的集合的形式,如何降低代码的耦合方便日后修改,如何分离实现和使用等。算法及其复杂度则是另一个需要花费大量时间的领域,一个好的算法,能将一个看似复杂的问题解的清晰易懂,对于常见算法的熟知是一项基本功。最后,对于程序设计,递归和迭代的思想很重要,面向对象编程的现代编程风格也是需要仔细理解体会的。
下文仅给出每节课的总结,按课分类。
2017.05.06 Lesson 1 Introduction to this subject
1. 给出了本节课的目标: 1)善于用计算机实现自己的想法,2)学会computational thinking
2. 介绍了计算机的功能,局限和基本结构
3. 讲述了编程语言的语法(Syntax),静态语义(Static Semantics)和语义(Semantics),与自然语言做对比,并指出编程中可能出错的地方。
2017.05.07 Lesson 2 Introduction to Python
1. 介绍了语言的分类:low level or high level; compiled or interpreted及其各自特点,指出本课程将采用高级解释性语言——Python
2. 讲述了Python的入门知识:object,scalar object(int,float,bool),表达式(expression),运算符(operator),类型转换,对象—值绑定,non-scalar objects(strings)
3. 介绍了Python的程序,首先介绍了直线程序(straight-line programs)和条件语句(conditional statements)
2017.05.08 Lesson 3 Iteration(迭代)
1. 首先接着上次的if语句,讲述了迭代的概念,并给出了迭代的方法:while和for循环
2. 讲述了循环特性,介绍了十进制整数和浮点数转二进制的方法
3. 讲述了3种求一非负数平方根的方法:穷举法(Exhaustive Enumeration),二分搜索法(Bisection Search),牛顿法(Newton-Raphson)
2017.05.09 Lesson 4 函数(Functions)
1. 指出了循环结构的缺点,并说明还需要一种更为抽象的概念——函数
2. 介绍了Python中函数的定义,函数调用,返回值及优势
3. 说明了模块化设计,建议将函数封装,然后用import在其他文件中调用
2017.05.10 Lesson 5 递归(Recursion)
1. 引入递归函数,并给出递归的数学论证——数学归纳法
2. 给出了几个典型的递归应用:数乘,河内塔(Towers of Hanoi), Fibonacci数列和回文
3. 最后介绍了用global定义全局变量,并告之慎用
2017.05.10 Lesson 6 复合数据类型(Compound Data Types)
1. 本章主要介绍了三种Python中常用的复合数据类型和函数的一些特性。
1) tuple:有序元素序列,元素类型不限(可混合类型);
2) list: 基本同tuple,区别在于list可以修改,增减其中元素
3) dictionary: 无序元素序列,元素为
2.说明Python中函数为第一类对象,可作为list元素,可用map(C++中函数为第二类对象)
2017.05.11 Lesson 7 测试和调试(Testing and Debugging)
1. 本节主要讲述了代码的testing(确定bug)和debugging(修复bug)
2. 给出了testing的方法:分类并确定testing suite(测试集),并说明了分裂的原则和方法(黑箱,白箱),及进行测试的流程和工具
3. 介绍了bug的分类和debug的技巧
3. 最后花大篇幅介绍了如何用二分查找和print语句 来debug。
2017.05.12 Lesson 8 Exceptions(异常)和Assertions(声明)
1. 说明了excepton的定义和处理方法
2. 讲演了Python处理异常的方法: try, except 语句
3. 介绍了Python中异常的分类;介绍了 else和finally语句,以及raise语句
4. 示范了防错性程序设计,即assert语句的使用
2017.05.18 Lesson 9 Algorithm Complexity(算法复杂度)
1. 提出了复杂度的概念,衡量算法复杂度的方法,并着重介绍了大O记法(关注最差情形的时间复杂度衡量方法)
2. 对常见的大O复杂度进行了详细解读和应用实例,并进行对比
2017.05.19 Lesson 10 Search Algorithms(搜索算法)
1. 首先介绍了解决问题的思路:将复杂问题简化,并用成熟的算法给出方案
2. 确定了在数据结构无序状态下,只能做到线性查找,复杂度O(n)
3. 说明对sorted lists,二分查找复杂度为O(logn),效率很高。是否排序+二分取决于查找的频次
4. 介绍了几种排序算法:选择O(n方), 归并O(n),及哈希O(1)
2017.05.20 Lesson 11 OOP(面向对象编程)
1. 本节重新讲解了object,介绍了OOP,以及用class关键字实现创建类及新类型。
2. 说明了OOP的意义:抽象与封装,分离实现(implemention)和应用(use),及其优势
3. 详述了用class关键字创建新类型,给出了其具体实现的过程
4. 讲述了方法(method,类成员函数)的重载和定义,并举实例说明
Lesson 12为5个人讲述计算机跨学科应用的介绍,跳过
2017.05.21 Lesson 13 OOP and Inheritance(继承)
1. 讲述了类继承体系和替换原则(类成员函数重载,C++中用virtual)
2. 讲演了一个复杂的类继承实例:Person, MITPerson, Grades
3. 介绍了Generators及其意义
2017.05.22 Lesson 14 Tree
1. 介绍了树的定义,二叉树和树搜索算法:DFS,BFS
2. 讲演了决策树,详细说明了用Python语言和树结构解决背包问题的算法
3. 最后介绍了避免死循环的方法
2017.05.22 Lesson 15 Conclusion
1. 最后一节对本门课程的内容进行了总结,并为未来的学习指明了方向
2. 重申了一下computational thinking: Abstraction,Automation and Algorithms
3. 高度概括了本书的主要内容:1)语言—Python;2)程序(write,test and debug);3)Estimating Complexity;
4)Abstraction(solve problems with programs); 5)Algorithms