《我的第一本算法书》总结

《我的第一本算法书》总结

一、算法的基本知识
1. 算法与程序的区别
算法:计算或者解决问题的步骤,以人类能够理解的方式描述的,用于编写程序之前。
程序:以计算机能够理解的编程语言编写而成的,可以在计算机上运行。
2. 如何选择算法
1)易于人类理解
2)消耗空间资源
3)算法的运行时间

二、数据结构
2.1什么是数据结构?
数据存储于内存时,决定了数据顺序和位置关系的便是“数据结构”。
2.2 数据结构 - 链表

链表的特点:
	1)数据呈线性排列
	2)数据的添加和删除较为方便
	3)访问比较耗时间
  1. 数据存储方式
    1)数据分散存储于内存中,无须存储在连续的空间内。
    2)由于数据都是分散存储的,所以如果想要访问数据,只能从第1个数据开始,顺着指针的指向一一往下访问(顺序访问)。
    3)添加数据, 只需要改变添加位置前后的指针指向就可以,非常简单。
    4)删除数据,只需要改变指针的指向就可以删除。

  2. 几种其他链表
    1)循环链表(也叫环形链表)
    通常用于想要保存数量固定的最新数据时。
    2)双向链表
    优点:不仅可以从前往后,还可以从后往前遍历数据,十分方便
    缺点:①指针数的增加会导致存储空间需要增加;②添加和删除数据时需要改变更多的指针指向。

2.3 数据结构 - 数组

数组特点:
1. 数据呈线性排列的一种数据结构。
2. 访问数据十分简单。
3. 添加和删除数据比较耗功夫。
  1. 数据存储方式
    1)数据按照顺序存储在内存的连续空间内。
    2)每个数据的内存地址都可以通过数组下表算出。

  2. 链表和数组的比较
    | 访问 | 添加 | 删除
    |链表 |-慢- | 快 | 快
    |数组 | 快 | 慢 | 慢

2.4 数据结构 - 栈

栈的特点:
1. 数据呈线性排列的数据结构。
2. 只能访问最新添加的数据。
3. 添加和删除数据只能在一端进行,访问数据也只能访问到顶端数据。
  1. 数据存储方式与特点
  • 往栈中添加数据的时候,新数据被放在最上面。
  • 添加数据(入栈),从栈中取出数据(出栈)。
  • 最后添加的数据最先被取出,即“后进先出”的架构。LIFO

2.5 数据结构 - 队列

队的特点:
1. 数据呈线性排列的数据结构。
2. 添加与删除数据的操作分别在两端进行。
  1. 数据存储方式特点
  • 往队列中添加数据时(“入队”),数据被添加在最上面。
  • 从队列中取出(删除)数据时(“出队”),是从最下面开始的,也就是从最早入队的数据开始的。
  • 最近进去的数据最先被取出来,即 - 先进先出。FIFO

2.6 数据结构哈希表

特点:
1. 哈希表存储有key和value组成的数据。
2. 一般来说,可以吧key当成数据的标志符,把值当成数据的内容。
3. 快速访问到数组中的目标数据。
4. 需要给数组设定合适的空间,如果空间太小,容易发生冲突,如果空间太大,就会出现很多空箱子,造成内存的浪费。

2.7 数据结构 - 堆

特点:
1. 堆是一种图的树形结构,被用于实现优先队列。
2. 优先队列是一种数据结构,可以自由添加数据。,但取出数据时要从最小值开始顺序取出。
3. 堆得树形结构中,各个顶点被称为节点,数据就存储在这些节点中。
  1. 数据存储的方式与特点
  • 节点内的数字就是存储的数据。
  • 堆中的每个节点最多两个子节点。
  • 结点的排列顺序为从上到下,同一行里则为从左到右。
  • 子节点吸顶大于父节点。
  • 最小值被存储在顶端的根节点中。
  • 往堆中添加数据时,为了遵守这条规则,一般会把新数据放在最下面一行靠左的位置。
  • 如果需要频繁地从管理的数据中取出最小值,使用堆来操作会非常方便。

2.8 数据结构 - 二叉查找树

特点:
1. 图的树形结构
2. 数据存储于二叉查找树的各个结点中。每个结点最多有两个子节点。
3. 每个结点的值均大于其左子树上任意一个结点的值。
4. 每个结点的值均小于其右子树上任意一个结点的值。

三、排序
3.1 冒泡排序
重复“从序列右边开始比较相邻两个数字的大小,再根据结果交换两个数字的位置”。

3.2 选择排序
从待排序数据中寻找最小值,将最小值与数列最左边的数字进行交换。

3.3 插入排序
3.4 堆排序

四、数组的查找
4.1 线性查找
线性查找需要从头开始依次按顺序往下检查数据。
在数据量大且目标数据靠后,或者目标数据不存在时,比较耗时。

4.2 二分查找

1. 数据已排好序
2. 每一次查找都可以将查找范围减半。

五、图的搜索
5.1 什么是图
1. 概念
计算机科学或离散数学中的“图”指的是:由顶点和连接没对顶点的边所构成的图形。
2. 图可以表示各种关系
① 图可以表示社会中的各种关系。
② 可以在计算机网络中把路由器作为顶点,将相互连接的两个路由器用边连接,这样就能用图来表现图的连接关系了。
3. 加权图
给边加上一个值,叫做边的权重或者权。

5.2 广度优先搜索
1. 广度优先搜索是一种对图形进行搜索的算法。
2. 特点:从起点开始,由近及远进行广泛的搜索。因此,目标顶点离起点越近,搜索结束得就越快。

5.3 深度优先搜索
1. 特点:沿着一条路劲不断往下进行深度搜索。

5.4 贝尔曼-福特算法
1. 对所有顶点不断计算和更新权重
2. 若存在权重有负,依旧可以正常运行。

5.5 狄克斯特拉算法
1. 若图中含有负数权重,可能会无法得出正确答案。
2. 多了一步选择顶点的操作,使得算法在求最短路径上更加高效。

六、安全算法
6.1 安全算法
传输时的四个问题:

  1. 窃听 — 加密
  2. 假冒 — 消息认证码 或 数字签名
  3. 篡改 — 消息认证码 或 数字签名
  4. 事后否认 — 数字签名

6.2 加密的基础知识

  1. 对计算机来说,数据就是一窜有意义的数字罗列。
  2. 密文也是数字罗列,只不过他是计算机无法理解的无规律的数字罗列。
  3. 加密:数据经过某种运算后(秘钥对数据进行数值运算),把数据变成计算机无法理解的数的过程。
  4. 解密:通过秘钥进行数值运算,把密文恢复成原本数据的过程。
  5. 加密技术:加密和解密的一系列操作。

6.3 哈希函数

哈希函数的特点:
1. 哈希函数可以把给定的数据转换成固定长度的无规律数值。
2. 哈希函数输出的哈希值数据长度不变。
3. 如果输入的数据相同,那么输出的哈希值也一定相同。
4. 输入相似的数据,输出的哈希值也会有很大的差异。 
5. 输入完全不同的两个数据,输出的哈希值也有可能是相同的。 - 也叫作:哈希冲突
6. 不可能从哈希值反推算出原本的数据,即输入和输出不可逆。
7. 求哈希值的计算相对容易。

6.4 共享密钥加密

  1. 共享秘钥加密:加密和解密都是用相同的秘钥。(也叫对称加密)

6.5 公开秘钥加密

  1. 公开秘钥加密:加密和解密使用不同秘钥的一种加密方式。(也叫非对称加密)

  2. 加密用的秘钥:公开秘钥,私有秘钥。

     特点:
     1. 安全性很高
     2. 加密和解密比较耗时。
    

6.6 混合加密
1. 混合加密在安全性和处理速度上都有优势。(SSL也应用了混合加密)

6.7 消息认证码

特点:
1. 实现了认证和检测篡改。
2. 消息认证码:将秘钥和密文生成一个值。(MAC)

6.8 数字签名

特点:
1. 实现了认证、检测篡改和乙方时候否认的问题。
2. 数字签名使用的是公开密钥加密。
3. 发消息者准备公开密钥和私有秘钥。
4. 发消息者使用私有秘钥加密消息,加密后的消息就是数字签名。

6.9 数字证书
1. 发送消息者需要向认证中心申请发行证书,证明公开密钥确实由自己生产。
七、其他算法
1. 欧几里得算法 - 辗转相除法

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值