编程语言、算法和数据结构

211 阅读5分钟

本人计算机科学小白,有理工科基础,课程来源是《计算机科学速成课》 B站链接:www.bilibili.com/video/BV1EW…

封面是旧都なぎ老师ヾ(>∀<)(ノ∀`●)⊃老师的画风真是太好看了!

10 早期的编程方式

程序如何“进入”计算机?程序需要加载进内存。

为了纺织图案而利用不同可穿孔卡纸连起来的纺织机,形成连续指令,被认为是最早的编程。

为了执行不同的计算,需要某种控制面板,面板有很多小插孔,可以让需要的两个孔连接起来。所以也叫“插线板”。带来一个问题,就是不同的程序需要重新接线。改进后,变成了可插拔式,但是线多复杂很容易混乱。

用插线板编程,起初不仅用于机电计算机,还用于电子计算机。程序在纸上设计好之后,给计算机连线,最多需要花费三周,过于麻烦。

经过改进,将程序存在了内存中,这样程序易于修改、方便CPU快速读取,这类机器叫存储程序计算机

程序和数据都存在一个地方,叫冯诺依曼结构

冯诺依曼计算机的标志:一个处理器(有算术逻辑单元)+数据寄存器+指令寄存器+指令地址寄存器+内存(负责存数据和指令)。

除了插线板和穿孔纸卡,1980s之前,还有一种是面板编程,面板上有指示灯,代表各种函数的状态和内存中的值。

早期编程都是“专家活”,需要非常了解底层硬件。

11 编程语言发展史

计算机能处理二进制,二进制是处理器的“母语”,就类似摩斯电码。它们只能理解二进制。所以二进制叫做机器语言或机器码

在计算机早期,必须用机器码写程序,所以会先写一个伪代码,即对程序的高层次描述。使用操作码表把伪代码转乘二进制机器码,翻译完成后,程序可以进入计算机并运行。

所以开发出了一种新语言,更可读,更高层次,每个操作码分配一个简单名字,叫助记符,助记符后紧跟数据,形成完整指令。

汇编器的作用就是将文字指令自动转成二进制指令。汇编器读取用汇编语言写的程序,然后转成机器码

上一次提到的JUMP程序,在汇编语言中,可以插入可跳转的标签,汇编器会自己搞定跳转地址。

汇编码只是修饰了机器码,但是仍然需要思考用什么寄存器和内存地址。

编程语言省去了寄存器和内存地址的思考,程序员只需要创建代表内存地址的抽象,叫变量,给变量取名字。

编程的抽象让现在各个领域的人都可以使用编程来更好地完成工作。

12 编程基础 - 语句和函数

语法:规定句子结构的一系列规则

:现代编程语言中很多预先写好的函数集合

(这节大学c语言课程都学过,内容简单基础,所以跳过)

13 算法入门

算法:解决问题的具体步骤

排序算法

  • 选择排序:每个数组位置都跑一遍循环,找最小数然后互换位置(N²次)

复杂度:算法的输入大小和运行步骤间的关系,表示运算速度的量级

可以用大O表示法表示复杂度,选择排序即O(n²)

  • 归并排序:先检查数组是否>1,是就分成两半,依然>1,再分成两半,直到每个数字存在于一个数组。然后将两个数组合并再归并一次,重复,再将两个含两个数字的数组合并再归并,以此类推。O(n*log n),所以归并排序效率更高。

图搜索问题:指从一个节点经过不同节点到达终点所需的最小路程数。

传统方法:直接尝试每一种方法,最终比较大小。O(n!)

Dijkstra算法:总从成本最低的节点开始,更新到达每个节点最小的路程数,最终选出一个成本最小的。O(n²),改进后O(n log n+l)(n:节点数,l:多少条线)

14 数据结构

数据在内存中存放得很乱,所以需要数据结构来有序地调度数据方便使用。

  • 数组:列表/向量,值连续存在内存里。

    如果需要从数组中拿出某个值,需要指定一个下标。数组的下标一般都从0开始,用[]表示访问数组。

    与数组类似是字符串:由字母、数字、标点符号等组成的数组。字符串在内存里以0结尾,叫字符“null”,表示字符串结尾,即输出字符到这里为止,不再持续输出后面的字符。

    矩阵存在的方式也是数组形式,将每一行的数字存到连续的数组中,并按行分组。

    结构体:多个变量打包到一起。

  • 链表:数组创建时就有固定大小,不能动态增加大小;在内存中按顺序存储;中间不可以插值。利用结构体(叫节点)可以连接上指针,作链表。

    循环链表:尾指向头,反之,非循环链表,最后一个指针是0,“null”表示链表尽头。

    链表很方便重新排序,两端缩减,插入新值,分割,倒序等操作,灵活。

    • 队列:谁先来谁就排前面,先进先出
    • :谁后来谁就排前面,后进先出
    • :一对多。最高叫根节点,下面的都叫子节点,任何直属上层节点是母节点,最下面结束的节点是叶节点。
    • 二叉树:节点最多只有两个子节点。根到叶是单向的