CS基础复习笔记

  震撼,刚刚发现我已经一年多没写过学习类的博客了!

  写“略”的地方是我认为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:不愧是鸽子啊。

 

posted @ 2021-12-21 19:50  shzr  阅读(320)  评论(0编辑  收藏  举报