《我的第一本算法书》读书笔记

概述

面试造大炮,工作扭螺丝。现在的面试,算法和数据结果是必备的环节,甚至很多国内的大厂纷纷效仿国外大厂如Google,Microsoft,面试只考核算法。

序章

算法的定义:计算或者解决问题的步骤;
算法与程序的区别;
全排列算法:n!种不同的结果;效率非常低;
时间复杂度:用来定量标志算法的运行效率,用步数来计算,1步是计算的一个基本单位。用O表示,忽略重要项以外的内容,言外之意对一个算法执行步数的计算结果只考虑指数级最大的一部分;O(n^2)的含义:算法的运行时间最长也就是n^2的常数倍。

延伸

延伸表示在书中不曾出现,但是关联性极强的内容,个人的读书笔记。
空间复杂度:如何计算?

时空变换思想

  1. 以空间换时间:常见,毕竟内存,硬盘等空间不是多贵,时间越短越好倒是多数人对一个算法的判断标准。常见的实现:缓存、
  2. 以时间换空间:不常见

第一章 数据结构

定义:数据存储于内存时,决定数据顺序和位置关系的便是数据结构。选择合适的数据结构,可以提高内存的利用率;

链表

数据的添加和删除都较为方便,就是访问比较耗费时间。

数组

队列

哈希表

二叉查找树

第二章 排序

第三章 查找

线性查找
二分查找

第四章 图的搜索

第五章 安全算法

第六章 聚类

聚类:在输入为多个数据时,将相似数据分为一组的操作。
相似:

k-means

第七章 其他

欧几里得

辗转相除法,用于计算两个数的最大公约数(GCD,Greatest Common Divisor)。
Java版本实现:

素性测试

素性测试,即判断一个自然数是否为素数的测试。素数:prime number,就是只能被1和其自身整除,且大于1的自然数。
判断一个素是否为素数的常规方法:

public boolean isPrime(long n) {
for (int i = 2; i <= sqrt(n); i++) {
	if () {
		continue;
	}
}
}

分析:这个算法在n比较大时,耗时久效率很低。

费马小定理:对于任意素数p,以下公式都成立:
在这里插入图片描述
费马测试:根据是否满足费马小定理来判断一个数是否为素数,是一种概率性素性测试,用来判断某个数是素数的概率大不大。

确认n和余数一致的次数越多,需要判断的数确实为素数的可能性就越大。但若每一个小于p的数都计算并判断一遍,就会非常耗时。实际上如果确认几组n和余数之后就能判断该数是素数的可能性非常高,则该数大概率是素数。在RSA算法中,基于费马测试改良的米勒-拉宾(Miller-Rabin)素性测试,重复测试后当数不是素数的概率小于0.580时,就可以大致判断该数为素数。

另外,若p是素数,所有小于p的数都满足n^p mod p = n这个条件。反之,即使所有n都满足条件,p也有可能不是素数。在极低概率下会出现所有n都满足条件的合数(非素数的自然数)。这种合数,叫做卡迈克尔数,Carmichael numbers,绝对伪素数,前面几个绝对伪素数:
在这里插入图片描述

能不能在输入规模的多项式时间内进行(非概率意义,而是决定性的)素性测试,对于这个问题的研究,AKS算法被提出。不过,虽说是在多项式时间内,但该算法的计算次数仍然较多,所以费马测试这样的高速算法更为实用,应用范围也更加广泛。

应用:
加密RSA算法

网页排名

PageRank,佩奇排名,一种在搜索网页时对搜索结果进行排序的算法,利用网页之间的链接结构计算出网页价值的算法。
链接结构为环状的特殊处理?

随机游走模型,random walk model

汉诺塔

posted @ 2020-05-21 11:53  johnny233  阅读(22)  评论(0编辑  收藏  举报  来源