听课笔记-《计算机科学速成课》10-14 编程基础

视频链接

视频目录

1 - 早期的计算 - Early Computing
2 - 电子计算 - Electronic Computing
3 - 布尔逻辑与逻辑电路 - Boolean Logic & Logic Gates
4 - 二进制 - Representing Numbers and Letters with Binary
5 - 算术逻辑单元 - How Computers Calculate - the ALU
6 - 寄存器 & 内存 - Registers and RAM
7 - 中央处理器 - The Central Processing Unit(CPU)
8 - 指令和程序 - Instructions & Programs
9 - 高级 CPU 设计 - Advanced CPU Designs
10 - 编程史话 - Early Programming
11 - 编程语言 - The First Programming Languages
12 - 编程原理:语句和函数 - Programming Basics: Statements & Functions
13 - 算法初步 - Intro to Algorithms
14 - 数据结构 - Data Structures
15 - 阿兰·图灵 - Alan Turing
16 - 软件工程 - Software Engineering
17 - 集成电路、摩尔定律 - Integrated Circuits & Moore’s Law
18 - 操作系统 - Operating Systems
19 - 内存 & 储存介质 - Memory & Storage
20 - 文件系统 - Files & File Systems
21 - 压缩 - Compression
22 - 命令行界面 - Keyboards & Command Line Interfaces
23 - 屏幕 & 2D 图形显示 - Screens & 2D Graphics
24 - 冷战和消费主义 - The Cold War and Consumerism
25 - 个人计算机革命 - The Personal Computer Revolution
26 - 图形用户界面 - Graphical User Interfaces
27 - 3D 图形 - 3D Graphics
28 - 计算机网络 - Computer Networks
29 - 互联网 - The Internet
30 - 万维网 - The World Wide Web
31 - 网络安全 - Cybersecurity
32 - 黑客与攻击 - Hackers & Cyber Attacks
33 - 加密 - Cryptography
34 - 机器学习与人工智能 - Machine Learning & Artificial Intelligence
35 - 计算机视觉 - Computer Vision
36 - 自然语言处理 - Natural Language Processing
37 - 机器人 - Robots
38 - 计算机中的心理学 - Psychology of Computing
39 - 教育型科技 - Educational Technology
40 - (完结) 奇点,天网,计算机的未来 - The Singularity, Skynet, and the Future of Computing

多图预警

笔记

第10集·编程史话

早期的计算机

在这里插入图片描述
计算机的发展经历了很多不同的交互界面,从大如房屋的继电器式的计算机,到现如今能便捷携带的计算机,都是一点点的突破发展改进。这幅图是利用开关来操作以编程好的指令,相当于选哪几条指令组合来运行程序。

第11集·编程语言

伪代码

请添加图片描述
早期的编程需要写编译语言,非常不直观,所以计算机科学家先把要做的事情用简单语句的方式记录下来,再按照记录内容来输入指令。这种就是伪代码,伪代码是我们思路的一种保存形式,代码只是工具。

指令演化

在这里插入图片描述
指令由开始的00101000诸如此类的二进制原始表达方式,改进成了 用简单语言代替指令,要便于记忆和理解很多,在原二进制式的指令中,想要从一个地址跳转到另一个地址,检索地址编码很不方便,用标签的方式就很好地解决的了跳转位置的问题,而且即便是动态的添加了数据指令,原先的地址发生了变化,但我们要鉴别的位置是标签,就不会受到地址变化的影响。

编译器

在这里插入图片描述
编译器就是将二进制到抽象语言反过来的过程,从高级语言转换成机器码,cpu可直接识别运行。

编程语言

请添加图片描述
有了编程语言,我们不用管寄存器或内存位置,简单的申明变量,编译器会帮你把这条语句转化成需要的所有的指令。

第12集·编程原理:语句和函数

if语句

请添加图片描述
如果 xxx 那么 xxx ,不然的话 xxx。这在编程中是运用的非常多的语句。当满足设置的条件,就会执行对应的内容,不满足的话就执行另一个内容。俗话说的讲条件。

while循环

请添加图片描述
设置一个条件,只要条件满足,循环内的语句就会一直执行。直到条件不满足,写whlie的时候要小心哦,否则电脑很可能死机。

函数

请添加图片描述
这是一个求指数的函数,运用for循环,执行设定的次数,将这个封装成一个方法,当下次要用计算指数的情况,就直接调用这个方法就好了,不用再写一遍。

函数调用函数

请添加图片描述
在函数里面调用函数,就像是你封装了一个一个的工具,到它合适的地方直接拿来用即可。
突然想到一个问题,对于底层原理的理解和深入是有必要的吗,这其实取决于自己的发展方向和兴趣。就像一个画手,他不一定要掌握PS 的底层原理,但是他能数量使用就能画出上好的作品。同理,如果你是做一款游戏,你能熟练使用编程的一些语法,不一定要掌握里面的底层设计和原理,也能开发游戏需要的功能。什么情况下需要掌握底层的东西呢,我觉得一方面是往这个方向发展,做一个计算机专家,另一方面是兴趣。

第13集·算法初步 - Intro to Algorithms

归并排序

请添加图片描述
归并排序的思想就是一组待排序的数,对它进行对半划分,当分得的集数量小于等于2时,便不再划分,分好之后,再对集自身进行排序,这时候排序是简单的,应该里面只有最多2个元素,只需要最多做1次
比较即可,排好序的集再与兄弟集进行比较合并,注意这时候的排序比较相较于完全随机的集要简单,因为集里面本身是有序,的你只需要拿A集最前面的元素a1与B集最前面的元素b1比较,a1比较小,则记录保存,这时候再拿a2与b1比较,谁小记录保存谁,假如还是a2,那么就取a3与b1比较,如果b1比较小,则记录保存b1,这时候再取b2与a3比较,如此往复,直到集合中的元素记录保存完成,再往上归并更大的兄弟集。用通俗点的例子就像是,我有一副从小到大排好序的扑克牌,你也有一副从小到大排好序的扑克牌, 咱们先出最小的,看看谁的更小, 谁的更小就把这个更小的牌 放到指定的位置,这时候放了牌的人手上的最小的牌就变了(最小了已经放到一边了),得继续取手上最小的扑克牌,继续和对方比较,谁更小,谁就把这张更小的牌放到指定的地方,知道所有的牌都放完 ,这里为什么比完全随机的排序要快呢? 一是,我确定最小的牌,不需要把所有的牌都比较一遍,我只要比较一次就知道了。二是当一方没牌了,另一方就不需要比较了。全部依次放入即可。

选择排序

请添加图片描述
选择排序的思想就是,我在一堆元素中,先全部找一遍,但找的过程中得一个一个的看,看第一个的时候,这个就是最小的,我记录下来这个最小值和它的索引,然后看第二个数,与我手上的这个最小值比较,凡是比我手上的值更小的值,我就记录它和索引,直到看完所有的元素,这个时候我们就确定了全场最小元素,我们把这个元素与第一个元素的位置进行交换,这个时候全场最小的元素就放到第一个的位置了,好,接下来,我们从第二个位置开始看(为什么从第二个呢,因为第一个已经确定好了,不用再比较了), 跟第一次的方式一样,谁更小,我就记录它的值和索引,比较完所有元素,就当前这个最小值与第二个元素交换,接下来第三个,按同样的方式进行,这就是选择排序。像不像是你从一群人中找那个最高的,先全场比较找到最高的,让他站在指定位置,然后再剩下的这群人中继续找最高的,找到了就让他站在刚才的那个指定位置,排在前一个人的后面,继续,一个一个的选出最高的,正如其名,选择排序。

第14集·数据结构 - Data Structures

二维数组

请添加图片描述
二维数组在内存中的布局如图,将一组一组的内容布局好,j[2][1]的位置就是第3组的第2个位置的数据。无论是三维数据还是更多维数据,都是可以的。

链表

请添加图片描述
链表的结构是一个一个的元素有一个指向下一个元素的指针,想要知道下一个元素就查看本元素的next指针就知道下一个元素,当最后一个元素的next指向第一个元素,这就是循链表。链表的增删是方便的,比如上图的增加,只需要把112的next指向的元素14先记录下, 然后next指向要新增的42, 把42的next指向14,就完成增加了, 要想删除也容易,比如把42删除,就把112的next指向42的next指向的元素14, 然后把42删除。
相较于数组,增删操作比较方便,数组的初始空间大小是固定的,想要增加元素不能够,得重新申请空间,想要删除元素,除了把指定的元素删除外,还需要把该元素之后的元素都分别往前挪1位。优势是读取随机元素速度快,由于是连续地址,任意元素都能直接找到。而链表就得从头部开始一个一个往下找。

字符串

请添加图片描述
字符串就是一列数组在内存中按序分布,注意结尾有个zero的标识,如果没有那么这些函数将不能确定字符串的结束位置在哪儿,从而引起一些不必要的错误。

请添加图片描述
节点与连线组成的图,每个节点都可能会与若干个节点相连,在图中,如何找到指定两个点之间的最短路径,如图。高庭到凛冬城的最短路径,最笨的办法就是将 高庭到凛冬城的所有可能的路线,一一比较,得出结论,这样的计算复杂度是n!。
我们可以稍微做些改进,从高庭出发,找到所有其它的点与高庭的距离,派克城14,奔流城10,君临城8,三叉戟河max,凛冬城max,这个时候高庭的所有连接已经计算完成,将高庭做好标记。接下来我们找到与高庭相连的最近的点,从这个点出发找能连接的点计算距离,所以是君临城8,君临城到高庭不用管了,高庭已经做了标记,就说明高庭到君临城肯定已经计算过了。然后是奔流城求最小min(dis(君临城-奔流城,奔流城10)),没有变化,然后是三叉戟河min(dis(君临城-奔流城,三叉戟河max)),做了更新三叉戟13,这个时候君临城的所有点都完成计算,做好标记,再继续遍历最短距离,为奔流城10,高庭和君临城已经标记了,就剩下三叉戟河min(dis(奔流城-三叉戟河,三叉戟河13)),要做更新三叉戟河为12,还有派克城min(dis(奔流城-派克城,派克城14)),要做更新派克城13,奔流城的所有连接都做了计算,做好标记。然后继续遍历找未被标记的最近的节点,应该是三叉戟河,三叉戟河能连接的点就只剩下凛冬城了,凛冬城min(dis(三叉戟河-凛冬城,凛冬城max)),凛冬城为22,三叉戟河做好标记,再继续遍历未标记的最小距离,是派克城,派克城相连的未被标记的也只有凛冬城min(dis(派克城-凛冬城,凛冬城22)),不用做更新,派克城也被标记,再继续遍历,发现没有未被标记的最近的点了,就只剩下凛冬城,所以计算结束,最终的结果是高庭-奔流城-三叉戟河-凛冬城,路径长22。
上面的图重点是看每次变化找的起点和与出发点路径的变化。
当前起点是当前未被标记且到出发点距离最近的点。
更新的点都是与该起点直接相连并未被标记的点。
参考内容:Dijkstra 最短路径算法详解 无向图

1-4课笔记-计算机历史

5-9课笔记-计算机硬件

10-14课笔记-编程基础

15-17课笔记-计算机发展

18-21课笔记-操作系统

22-27课笔记-计算机交互

28-33课笔记-网络安全

34-40课笔记-人工智能

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值