震撼,刚刚发现我已经一年多没写过学习类的博客了!
写“略”的地方是我认为OIer应该都知道的(能看到这篇博客的应该主要是OIer吧)
明天就要考试了,今天晚上打算复习一下CS基础,正好写篇博客记录一下。参考书里其实还有网络、数据库等内容,但上课没讲,所以就不写了捏。
由于考试是英文卷子……所以以下会有较多英文单词。
Data Storage
信息熵:$H_i=-\sum p_i \log p_i$
And: Or: Xor: Not:
Flip-flop(触发器):用于存储一个bit的computer circuit(计算机电路);
if a=1 then x=1;
if a=0,b=1 then x=0;
if a=0,b=0 then x保持原状(所以可以储存bit)
1 Byte=8 bits
Main Memory(主存,容量有限),包括RAM(内存,断电后数据丢失)、ROM(只读存储器)等。
Mass Storage(外储存器,容量较大),有很多种,例如磁盘(Magnetic disk),CD,Flash Memory(如USB,SSD)等;
磁盘很容易摔坏,而Flash Memory用多了容易坏,光盘(课上没说,但显然很容易摔裂对吧……)。
原码(True Form):$-(2^{n-1}-1)~+(2^{n-1}-1)$,$+0,-0$被表示为两个数;最早位是符号位;坏处是加法比较麻烦,因为要先看符号;
反码(One's complement):正数的反码和原码相同,负数的反码是把原码中“除符号位以外的位”取反;
补码(Two's complement):对于负数,补码=反码+1;
补码的优势:1.只有唯一的0;2.补码的和=和的补码;3.减法=加法+取负;4.乘法=补码相乘;
移码(Excess):移码$=2^n+X,2^n > X \geq -2^N$;
小数的表示:SEEEMMMM;S:符号位;E(阶码):表示要移动几位;M(尾数):数值;即默认小数点在最前面,也就是0.MMMM,再将小数点右移E-4位,得到真正代表的数值;注意,除非数字正好等于0,否则要保证M的首位是1;
举个例子:01101011,E-4=2,所以0.1011,再右移两位,得到10.11,由于符号位是0,所以等于2.75;
Data Manipulation
图灵机(Turing Machine)包括一条纸带,上面有许多格子,格子里写着一些符号;一个读写头,可以左右移动、阅读纸带上的字、修改纸袋带上的字;一套控制规则,根据当前的状态和所指格子上的符号来决定之后做什么(移动方向、改写符号、更改状态等);一个状态寄存器,记录机器当前所处的状态。
冯诺依曼架构(Von Neumann architecture):Memory+ALU+Control Unit+I/O System(+System Bus,即总线)。
CPU(The Central Processing Unit),包括ALU,Control Unit,Registers。各种运算都需要先把数据放到Register中后再进行;举个例子,先把a,b分别从主存里拿过来放到寄存器里,加起来,存在另一个寄存器里,再送回主存;(Cache一般也集成在CPU里)
程序也是数据:更早的时候程序主要靠人工连线实现,但是现在的程序本身也是储存在电脑里的数据了。此处我们学习了V8虚拟机(16个寄存器,每个1byte;256个main memory,每个1byte;每条指令用两个byte表示),而且好几次的作业都是写虚拟代码、看虚拟代码写结果,但是好像没必要写到复习笔记里。
Operating Systems
操作系统(OS):是一种软件,用于管理电脑资源、给软件调配资源;
打开电脑时,有一段特殊的引导程序(boot loader)放在ROM里面。运行引导程序,效果是把OS从DISK里加载到Main Memory。加载完成后,开始运行OS。
不同的用户、软件共用一台电脑,但是电脑不能同时运行许多程序(多核电脑或许也可?)。解决方案,快速在不同程序之间换来换去,看起来就像是在同时运行好多程序了!时间被切成若干Timeslice,每个时间片运行不同的程序。写不清楚了呜呜,看图(注意,这张图的比例是错的,事实上每个时间片远远长于切换时间):
具体来看(指习题里出现过的):当有多个进程等待执行的时候,先执行优先级高的;如果某进程进入等待状态,那么即使这个时间片还没结束也需要换别的进程执行;因此应该把输入输出多的进程赋予高优先级,这样整体运行效率会更高;
但实际运行中可能没有这么简单,如模拟题中的AB两个程序互相依赖,但是换进程的频率太低,导致一直在互相等、浪费时间;这就要求操作系统合理调配资源;
$1s=10^3ms=10^6\mu s$
Algorithm
好耶,是算法!
"An algorithm is an ordered set of unambiguous,executable steps, defining a terminating process."
有限、确切、可执行、可终止;
伪代码(Pseudocode):像代码、但又不太像的东西,用于表示程序的思路;
流程图(Flowchart):似乎有一些书写规范,比如分支结构用菱形之类。但没讲,所以也没学[鳄鱼_哈哈.jpg]
一些词语区分:
迭代(Iteration),递归(Recursive):课件上定义略微模糊,大约可以概括为“循环就算迭代、调用自身就算递归”;
函数(Function),过程(Process):没有返回值就是过程,有返回值就是函数;
正确性、效率:略……不过有一个没见过的词(Sequential search),是顺序搜索,复杂度 $O(n)$;
Programming Languages
机器语言(Machine Lauguage):二进制编码,缺点是人难以理解;
汇编语言(Assembly Language):把二进制编码转换成符号表示,本质上还是直接操作内存、寄存器等,只是便于理解;
第三代编程语言:需要编译翻译后才能运行;
第四代编程语言:非专业人员也可以用的,比如(∑老师最爱的)Matlab,SQL等;
论goto:建议少用goto,否则程序容易变成蜘蛛网。但是,会不会有些功能只有goto才能实现呢?答案是不会。方法如下:把整个程序括到一个大循环里,每句话都套个if;当源程序里需要goto的时候,就打一个flag表示下次循环去执行goto到的那一句……看起来比较离谱,但至少说明goto不是必须的;
执行(Implementation):解析代码产生语法树的时候,作为整体的一些符号会被一起考虑,比如 "shzr:=shzr+shy" 中,"shzr","shy", "+",":=" 会被视为token,而 "s","h" 则不会;
Data Structure
我真的想直接写“略”,但是还是随便写点:
数组……就是数组;栈先进后出;队列先进先出;链表应该有一个头指针;二叉树里每个节点最多有两个孩子,多叉树则不一定;
对于二维数组,行优先(row major order)是指如下的编号方法:
1 2 3 4 5
6 7 8 9 10
列优先(column major order)则是:
1 3 5 7 9
2 4 6 8 10
File Structures
这里上课讲了归并排序,虽然我并不非常理解归并排序和文件存储的关系;
关于目录,讲了分级目录……?
哈希(Hash):众所周知哈希有很多方法,上课主要讲的取模那种(用质数当模数会比较好);
好,我承认这节课我极度摸以至于不知道讲了什么,看课件和练习题的话似乎就只有这些;
Artificial Intelligence
AI(x),A*(√)
这节课讲的“非故事性”的内容似乎只有用A*解决八数码:考虑每个数最少要几步移到目标位置,求和再加上“已经走了几步”得到估值函数,每次从已有的状态中选择一个估值函数最小的开始扩展,如果得到的状态从未出现过,就丢进堆里接着做;
Theory of Computation
P问题:能在多项式时间内被算法解决的问题;
NP问题:不确定是否存在(而不是一定不存在)多项式时间的求解算法,但可以在多项式时间内验证一个解是否对;(旅行商问题)
NPC问题:一种特殊的NP问题,其他所有的NP问题都可以多项式时间内规约到它;
NP-Hard问题:与NPC问题类似,但是它本身可以不是一个NP问题;(感谢djh的补充)
多项式时间确实解决不了的问题:如输出n个数的全排列,光是输出就要 $n!$ ;
不可判定问题:不存在算法能在有限时间内解决它;(停机问题)
(题外话:大家应该看出来了,这门课属实比较简单,名言“上课但不上课的时候效率很高”就是出自这门课)然而,我们还做过10次作业,这10次作业和上课内容相关吗?
事实上,相关,但不完全相关;因为我们这门课还学了一个东西叫V8虚拟机,所以作业有很大一部分是“模拟V8代码(其实是一种汇编语言)”、“写V8代码”、“写伪代码”,“读伪代码”,“模拟图灵机”……
比如有次作业是理解如下V8代码,同学们直呼裂开:
下附V8代码对照表(先吃饭,吃完填坑)
2022.1.3:不愧是鸽子啊。