优秀的程序员需要有丰富的知识储备,如计算机基础,操作系统,网络,编程语言,软件工程,系统设计,高等数学,算法等等。在职业初期,会接触很多知识,不断地摸索,学习,然后理解,应用,但是这些知识在脑海中往往是碎片化的,没有系统性的吸收,可能会用,但忘得很快,即便记住,也是模模糊糊,讲不清楚。所以,学过的东西,掌握的东西,要常常梳理,加深理解,不断地在脑海中建立知识间的联系,并持续加深这些联系。路漫漫其修远兮,吾将上下而求索!!!
1、二进制数(110.11)转是十进制数6.75
将十进制数转二进制数,对小数部分,连续乘2,并记录结果的整数和小数部分:
6.75 对应的二进制数为 110.11
2、
3、二级制补码
几乎所有的计算机都是用二进制补码表示法来存储位于 n 位存储单元的有符号整数。
正数的补码为原值;负数的补码为反码加1;
使用补码可以让存储的数值具有连续性:-1 + 1 =0, 7 + 1 = -8,并使 0 维持既不是正数也不是负数的特征。
使用补码,更容易进行整数的算术运算,比如正数与负数直接相加。
4、数据在存储到计算机内存之前被转换成二进制,有多种方法来处理符号,有两种方法来处理小数点:定点和浮点;
1、图灵模型是计算过程的抽象模型:(输入,程序,输出);
图灵完备:
在可计算性理论中,如果一系列操作数据的规则(如指令集、编程语言、细胞自动机)按照一定的顺序可以计算出结果,称为图灵完备。
简单的说就是: 输入 + 程序 = 输出
2、冯诺依曼模型清楚地将一台计算机定义为一台数据处理机,它的程序和数据都存储在存储器中,包括 4 个子系统: 存储器,算术逻辑单元,控制单元,输入输出单元;
3、计算机由 3 大部分组成:硬件,软件,数据;
4、机器计算机的代表是查尔斯.巴比奇发明的差分引擎,它不仅能够很容易地进行简单数学运算,还可以解多项式方程。
5、电子计算机发明于上世纪三十年代;
6、CPU 寄存器是用来存放临时数据的高速存储单元:数据寄存器,指令寄存器(存指令的内容),程序计数器(指向下一条指令的内存地址);
7、高速缓冲存储器的存取速度比主存块,但是比 CPU 及其内部的寄存器慢:
据观察,通常计算机花费 80% 的时间来读取 20% 的数据,也就是说相同的数据往往会被存取多次,因此高速缓冲存储器的效率很高。
8、磁盘
磁盘是一个随机存取设备,但是,在某一时间可以读取的最小存储区域只能是一个扇区。数据块可以存储在一个或多个扇区上,且该信息的获取不需要通过读取磁盘上的其他信息。
寻道时间定义了读/写磁头寻找数据所在磁道的时间;
传送时间定义了将数据从磁盘移到 CPU/内存 所需要的时间。
9、CPU 与内存之间通过总线相连,分为:数据总线,地址总线和控制总线。
64 位计算机就需要 63 根数据总线,每一根传送 1 位数据;
地址总线的线数取决于存储空间的大小,如果存储器的容量为 2 n 2^n 2n 个 byte,那么地址总线一次需要传送 n 位的地址数据,因此它需要 n 根线;
控制总线的线数取决于计算机所需的控制命令(比如读,写)的总数,如果计算机由 2 m 2^m 2m 条控制命令,那么就需要 m 根线。
10、输入/输出设备的寻址:I/O 独立寻址, I/O 存储器映射寻址;
11、CPU 利用重复的机器周期来执行程序中的指令:取指令,译码,执行;
12、I/O 同步:程序控制,中断控制,直接存储器存取(Direct Memory Access,DMA)
因为输入/输出设备的运行速度比CPU慢得多,因此CPU操作在某种程度上必须和输入/输出设备同步。
13、CISC:复杂指令集计算机;
有大量的简单和复杂的指令,简化了程序设计,但使得 CPU 和控制单元的电路非常复杂。也就是通过增加硬件复杂性来简化软件(汇编)开发。
14、RISC:精简指令集计算机;
与 CISC 的设计策略相反, RISC 体系结构使用了较少的指令,复杂操作通过简单指令的组合来实现。
15、改善吞吐量:流水线技术,并行处理
并行处理可能发生在数据流、指令流或者两者都有。一些专家认为 MIMD 组织是真正的并行处理体系结构。
1、网络结构:点对点,网状,星型,总线型,环型
如今,高速局域网中最常使用的是星型拓扑
2、ISP:因特网服务提供商
3、TCP/IP 协议族:应用层,输出层,网络层,数据链路层,物理层
以 HTTP 服务为例,HTTP 服务处于应用层,应用层的地址为 URL,比如 www.baidu.com,通过 DNS 能找到服务器计算机的 IP 地址。
端口,socket 与 进程之间的关系,需要理解清楚。
邮件服务也是应用层服务,邮箱地址跟具体的进程,端口没有直接关系
4、传输层的职责:多路复用和解多路复用,拥塞控制,流量控制,差错控制
5、传输层协议:UDP,TCP 和 SCTP
有些应用程序喜欢使用 UDP 是因为它们自己负责完成流量控制或差错控制,或者需要快速高效的相应,比如在线视频。
TCP是支持传输层所有职责的协议;
SCTP 结合了 UDP 和 TCP 的优点,适合用于音频和视频的实时传输,有差错控制和流量控制功能。
6、网络层使用它的路由表查找下一跳的逻辑地址,把这个地址传递给数据链路层。
7、路由选择协议向因特网上的所有路由器发送自己的消息,更新它们关于路由的信息,比如 RIP,OSPF 和 BGP.
8、ICMP:因特网控制消息协议,用来报告一定数目的差错给源计算机,例如,由于拥堵而丢失一个数据包。还可以用来检查因特网节点的状态。
9、ARP(地址解析协议),RARP(反向地址解析协议)
10、数据链路层负责数据帧(帧是数据链路层的传送单元)的节点到节点的发送。数据链路层地址经常被称为物理地址或介质访问控制(MAC)地址。数据链路层也使用差错控制和流量控制。
11、物理层传送的单元是二进制位,通过广播发送,不需要地址。
12、MIME:多用途因特网邮件扩充协议是允许非 ASCII 数据通过 SMTP 传输的补充协议。
13、FTP与其他客户端/服务器应用不同,它在两个主机间建立两个链接,一个连接用来传输数据,另一个连接用来传输控制信息(命令,响应)。两个链接使用不同的策略和不同的端口号。
操作系统是计算机硬件和用户(程序和人)的一个借口,它使得其他程序更加方便有效地运行,并能方便地对计算机硬件和软件资源进行访问。
1、操作系统的两个主要设计目标:有效地使用硬件,容易地使用资源;
2、系统启动过程
自举(bootstrap)程序存储在 ROM 中,当计算机加电时,CPU 计数器被设置为自举程序的第一条指令,开始执行自举程序;自举程序的唯一功能就是把操作系统程序装载到 RAM 中,当装载完成后,CPU 中的程序计数器被设置为 RAM 中操作系统的第一条指令,开始执行操作系统程序。
3、实时系统是指在特定时间限制内完成任务,可应用在交通控制、病人监控、军事控制系统,汽车控制系统中;
4、操作系统的组成部分:内存管理器,进程管理器,设备管理器,文件管理器(文件系统)
5、多道程序(多程序,multi-programming):同一时刻可以装入多个程序,并同时执行;CPU 轮流为其服务。
分区(partitioning)调度
和 分页(paging)调度
请求分页调度
和 请求分段segmentation()调度
:程序不需要整体载入内存,页是固定大小的,而段会根据程序员的配置进行划分;一个段也许太大不能载入到内存的空闲区,内存可以分成多个帧,一个模块可以分成很多页,一次载入内存运行。
虚拟内存
: 主要解决程序在内存中共享的问题。
6、进程管理器的调度策略有多种:先入先出 FIFO,最短长度优先,最高优先级等。
7、只要资源可以被多个用户同时使用,那么它就可能有两种问题状态:死锁
和饿死
8、UNIX 是多用户,多进程,可移植的操作系统,它由四部分构成:kernel(内核), shell(命令解释器),一组标准工具,和应用程序;Linux 由三部分组成:内核,系统工具,和系统库;Windows NT 是面向对象的、多层的操作系统,包括:硬件抽象层(HAL),执行层和环境子系统层。
算法是一种逐步解决问题或完成问题的方法;
算法是一组定义完好且排列有序的指令集合,它产生结果并在有限的时间内终止;
1、算法过程最基本的三种结构:顺序、判断(选择)、循环;
2、基本算法:求和,乘积,最大和最小,排序,查找;
3、基本排序算法:冒泡排序,选择排序,插入排序;其它的排序算法:快速排序,堆排序,希尔排序,归并排序,基排序,桶式排序。
4、顺序查找可以在任何列表中查找;折半查找则要求列表是有序的;
计算机语言是一组预定一定的单词,按照预定义的规则(语法),被组合进一个程序中;
1、高级语言的设计目标就是使程序员摆脱汇编语言繁琐的细节;汇编语言和高级语言都需要转换成机器语言,这个过程叫做解释或编译;
2、编译:源文件 -》词法分析 -》 语法分析 -》 语义分析 -》代码生成 -》 目标文件;
3、计算机语言可分成 4 种模式: 过程式(命令式)、面向对象,函数式,说明式(声明式);
说明式模式依据逻辑推理的原则响应查询,说明性语言有自身的缺陷,迄今为止仅局限于应用在人工智能领域。
4、编程语言中的基本概念:
软件工程是利用合理的工程方法和原则来开发计算机软件。
1、在软件生命周期中,开发过程包括四个阶段:分析、设计、实现和测试;
2、软件质量: 高质量的软件系统是一个能满足用户需求、符合组织操作标准,且能高效运行在硬件上的软件;软件的质量可以从可操作性、可维护性和可迁移性三个维度去度量;
4、文档的重要性
stack, push, pop, empty
编译器使用栈来检查所有的开括号与闭括号配对;
2、队列: queue, enqueue, dequeue, empty
3、广义线性表: list, insert, delete, retrieve, traverse, empty
4、树: tree, insert, delete, retrieve, traverse, empty
遍历分为:深度优先遍历(前序,中序,后序),广度优先遍历
索引中使用数;
二叉树的应用:霍夫曼编码,表达式树,
5、二叉搜索树(BST):每个节点的值大于左子树中的所有节点的值,小于右子树的所有节点的值;
6、图:分为有向图和无向图;
文件是数据的集合;
1、文件存取
从文件中检索信息(特定的记录),有时需要一个接一个地检索记录,即顺序检索;有时需要快速存取一个特定的记录而不关系其他的记录,即随机检索;能够随机检索的文件,如索引文件,散列文件。
数据库是一个组织内被应用程序使用的逻辑相一致的相关数据的集合。
1、三种传统的数据库模型:层次(ldap),网络(图)和关系;
层次模型中数据被组织成一个树;关系模型中,数据组织成称为关系的二维表中;
2、关系数据库中的操作: 插入,删除,更新,选择,投影,连接,并,交,差
insert into table_name (k1, k2, k3 ... ) values (v1, v2, v3 ...);
delete from table_name where condition;
update table_name set k1==v1, k2=v2, ... where condition;
select * from table_name where condition;
select k1, k2, ... from table_name where condition;
select key-list from table1, table2 where condition;
select * from table1 union select * from table2;
select * from table1 intersection select * from table2;
select * from table1 minus select * from table2;
交
,并
,差
操作的关系必须有相同的属性!
3、select 模糊匹配
SELECT 字段 FROM 表 WHERE 某字段 Like 条件
4、drop,truncate
5、关系数据库设计的范式
规范化是一个处理流程,将一组关系转化为具有更优结构的新关系!
第一范式,第二范式,其他范式
数据压缩通过部分消除数据中的冗余来减少发送或存储的数据量,提高数据传输或存储的效率。
1、游程长度编码是最简单的压缩方法,就是用字符加次数来代替连续重复出现的字符。
2、霍夫曼编码,对于出现更为频繁的字符分配较短的编码,而对于出现较少的字符分配较长的编码,通过改变字符信息的权重来增加信息的质量密度。
http://www.cnblogs.com/idreamo/archive/2018/06/27/9201966.html
3、Lempel Ziv 编码
1、机密性很好理解,就是不让别人知道,比如密码;完整性是指,在信息变更时需要授权;
2、密码技术设计三种不同的机制:对称密钥密码,非对称密钥密码,和散列
对称密钥,就是用相同的密钥来对明文加密或对密文解密!
Kerchhoff 原则
:假设偷听者知道加密算法(尤其是代码,它的算法逻辑是无法隐藏的),需要保密的唯一的东西就是密钥!这意味着需要一个安全信道来交换密钥。比如面对面交换密钥,或者由可信的第三方来提供密钥,等等。
3、传统对称密钥密码
传统密码
使用两种技术对入侵者隐藏信息:替换和置换。替换密码
就是用一个字符替代另一个字符,最简单的替换密码就是移位密码,有时称为凯撒密码
。
入侵者在截获米问候,可以通过对字符进行特征分析来进行破解,比如英文中字符 e
出现的频率比任何其他字符都高,可以推断出现频率最高的字符替代了 e
.
置换密码不是用一个符号代替另一个符号,而是改变符号的位置,也就是对符号进行重新排序(置换)。
4、现代对称密钥密码: DES
,AES
DES 是用得最为广泛的对称密钥块密码!
DES 密钥长度太短,很容易被硬破解,AES 最小密钥长度为 128 位,更加安全。
在非对称密钥技术中有两个密钥:公钥(加密),私钥(解密);
非对称密钥通过被用来加密和解密少量的信息。
RSA 算法是最常用的公钥算法,在 RSA 算法中,先选取两个素数 p 和 q,创建模 n = p x q
,然后计算两个指数 e
和 d
,那么生成的公钥就是 (n, e)
,私钥就是 (d)
。
6、非对称密钥与对称密钥的比较
对称密钥是基于共享秘密,非对称密钥是基于个人秘密;
总体上,一个由 n 个人的团体,对称密钥需要 n(n-1)/2
个共享记号,非对称密钥只需要 n 个!
任何时候,只要应用是基于个人秘密的,都需要使用非对称密钥技术。
7、使用摘要
来保证信息的完整性
消息
和摘要
的关系类似于生死状和指纹。消息摘要通过密码散列函数
生成。当检查消息或文件的完整性时,再次运行密码散列函数,比较新的消息摘要和原先的,如果二者相同,则说明消息没有被修改。
8、消息验证与数字签名
消息摘要用来证明收到的信息是不是原始信息,有没有被改变;而消息验证呢,是为了证明给我发信息的人有没有被坏人冒充。
简单的说,消息摘要确保消息的完整性,消息验证确保信源的安全性。
9、验证分类
10、密钥管理定义了创建和安全分发密钥的过程
在非对称密钥中,每个人都有权访问其他人的公钥,公钥对公众开放。
1、图灵机
图灵机是在 1936 年由 Alan M.Turning 提出用来解决可计算问题的,它是现代计算机的基础。
图灵机可以解决现代程序能解决的任何问题!
2、丘奇-图灵论题
如果存在一个能完成一个符号操作任务的算法,那么也存在一台完成这个任务的图灵机。
首先,尚未发现有图灵机不能模拟的算法;
其次,所有在数学上已经得到证明的计算机模型都与图灵机模型等价。
3、歌德尔数
4、停机问题
什么是停机问题,就是我们能否编写一个程序来测试任何可以用歌德尔数表示的程序是否会终止?
结论是: 停机问题是不可解决的
用反证法证明!
5、在计算机科学领域,一般来说问题可以分为两类:可解问题和不可解问题,可解问题又可以分为两种,多项式问题和非多项式问题。
6、可解问题的复杂度:大O表示法
,多项式问题
,非多项式问题
问题的复杂度可以用不同的方法来衡量,比如运行时间、所需的内存等等。
如果程序的复杂度为 O ( l o g n ) O(logn) O(logn), O ( n ) O(n) O(n), O ( n 2 ) O(n^2) O(n2), O ( n 3 ) O(n^3) O(n3), O ( n k ) O(n^k) O(nk),则被称为多项式问题。
如果程序的复杂度为 O ( 1 0 n ) O(10^n) O(10n), O ( n ! ) O(n!) O(n!),则称为非多项式问题,当 n 值很大时,非多项式的求解需要耗费较长的时间。
1、人工智能
人工智能是对程序系统的研究,该程序系统在一定程度上能模仿人类的活动,如感知,思考,学习和反应。
虽然人工智能作为一门独立的科学是相对年轻的,但它其起源历史久远。可以这么说,当 2400 年前希腊哲学家亚里斯多德发明了逻辑推理这个概念时,人工智能就开始了,接着莱布尼茨和牛顿完成了逻辑语言的定稿,乔治.布尔在 19 世纪提出的布尔代数奠定了计算机电子电路的基础。但是,思维计算机的主要思想来自于阿兰.图灵,他提出了图灵测试。
2、图灵测试
简单的说,就是当你用微信跟别人聊天,如果你无法区分对方是人还是计算机程序,就说明计算机通过了智能行为的图灵测试,计算机具有了智能。
3、编程语言: LISP 和 PROLOG
这两种语言是特别为人工智能设计的。
LISP 把数据和程序都当成表,这就意味着 LISP 程序能改变自身,这个特性和智能体的理念相吻合,智能体能从环境中学习并改善自身行为。
PROLOG 是一种能建立事实数据库和规则知识库的编程语言,使用 PROLOG 编程能使用逻辑推理来回答那些可以从知识库中推导出来的问题。
4、四种常见的知识表示方法:语义网
,框架
,谓词逻辑
和基于规则的系统
语义网使用有向图来表示知识,用节点表示概念,用箭头来表示两个概念间的关系。
谓词逻辑是最常见的知识表示,可以用来表示复杂的事实。
基于规则的系统使用一组规则来表示知识,这些规则能用来从已知的事实中推导出新的事实。