两本趣味算法书

简介: 两本趣味算法书

一、枕边算法书

枕边算法书》是一本关于算法的数,此书读起来比较轻松,能够一口气读完。但内容却很丰富,很多方面都触及到了,下面简单记录该书的关键内容。

1.2 逻辑推理题

1.3 数据结构 二叉树 字符串 递归

1.5 寻找BUG 逻辑思维 防御型编程

1.6 对事业的热情和执着 全身投入的专业精神 团结与配合

1.7 回文 196算法(回文数值问题)

1.8 康威的末日算法(根据日期猜星期几) 能被100和400整除的年份就是闰年


2.1 排序算法 分治递归优化内存 快速排序 理解之后再怀疑

2.2 搜索 二分检索

2.3 动态规划 斐波那契数列 将计算过的结果保存到列表的存储单元中

2.4 散列(Hash)给定键值查找保存的数据

2.5 Soundex算法 遵循4个规则

2.6 梅森素数 素数p中2^p-1也是素数

2.8 文学编程 代码书写端正,理论要精密,性能要有效率,概念要具备独创性


3.1 欧几里得算法 最大公约数

3.2 递归 调用函数时会把函数地址保存到系统内部的栈,需要知道应当返回的位置 尾递归

3.3 RSA算法 公钥和私钥

3.5 单链表 杯中水超过一半还是不到一半 内存泄露

3.6 RSA加密过程

3.7 涂鸦代码 波兰式 栈和队列


4.1 N皇后问题 回溯法(backtracking)

4.3 无法重现一带而过

4.5 Jeff Somers的皇后算法 不愿阅读别人代码很难成为优秀程序员

4.6 位运算 位相当于构成水和空气的粒子 按位与 按位或 按位异或 左移 右移 取反

4.7 二进制补码 以1开头的表示负数

4.8 分析Jeff Somers算法 删除注释,对剩下的if、while、for等能够调节逻辑流程的部分进行探究 20%的代码影响80%的性能

 

二、编程之美

在《编程之美》中收集了约60道算法和程序设计题目,作者试图从书中各种有趣的问题出发,引导读者发现问题,分析问题,解决问题,寻找更优的解法。下面简单记录该书的关键内容。

第二章

1. 统计二进制中1的个数,解法一是不断地除以2,解法二是向右移位,解法三N和N-1之间的与运算,解法四预定义结果查表

2. 计算N的阶乘N!末尾0的个数,解法一统计因式分解5的个数。N!二进制中表示最低位1的位置,质因数2的个数:N/2+N/4+N/8+...

3. 寻找发帖水王,避免使用排序,每次删除两个不同的ID,在剩下的ID列表中水王的ID仍然超过总数的一半。

4. 从1到N,统计1出现的个数,用推倒,有两种方法

5. 寻找最大的K个数,第一种是类似于快速排序分成两组,第二种是同二分搜索找第K大的数,第三种是用最小堆,堆顶就是第K个数中最小的一个,第四种申请空间,把整数作为数组下标,记录每个整数出现的次数

6. 精确表达浮点数,有个递推公式:((a1a2...an)*(10^m-1)+(b1b2...bn))/((10^m-1)*10^n)

7. 最大公约数,辗转相除法f(x, y)=f(y, y%x),直到其中一个数为0,另一种方法是f(x, y)=f(x-y, y),还有一种是用移位运算。

8. 找符合条件的整数

9. 斐波那契数列,用数组储存所有已计算过的项,求解通项公式。

10. 寻找数组中的最大值和最小值,首先将数组中相邻的数分在同一组,然后利用两个变量max和min与同一组的两个数比较,较大的数赋给max,较小的数赋给min,时间复杂度O(1.5*N)。

11. 寻找最近点,先让数组有序,然后找最小差值只需要O(N)的时间,总时间复杂度是O(N*logN)

12. 快速寻找满足条件的两个数,使得这两个数之和等于一个给定的数字,先排序,然后在一个循环体里利用两个变量进行反向的遍历,从而保证遍历算法的时间复杂度是O(n)。

13. 子数组的最大乘积,正数、负数和0

14. 求子数组之和的最大值,解法一双层for循环枚举,解法二用分治算法把数组分为两段,

15. 求子数组之和的最大值(二维)

16. 找出数组中最长递增子序列的长度,解法一根据无后效性定义使用动态规划来解决,如果arr[i+1]大于arr[k],那么可以接在最长子序列L[k]之后,解法二记录递增子序列中最大元素的最小值。

17. 数组循环K位,时间复杂度为O(N),解法一考虑循环右移的特点:K=K%N,解法二将数组分成两个整体,最后交换一下。

18. 将数组分成两个长度为n的数组,并且数组之和最接近。

19. 区间重合判断,解法一将源区间和目标区间投影到坐标轴上,解法二把数组预处理(合并、排序等),将无序数组转化成一个目标区间,再用二分查找判定。

20. 程序理解和时间分析

 

第三章

1. 一个字符串通过移位能包含另一个字符串,解法一利用循环移位,解法二移位得到的字符串是第一个字符串对自身拼接后的字符串。

2. 电话号码对应英语单词,将字母转换成一棵树,使用直接循环法和递归法。

3. 计算字符串的相似程度

4. 从无头单链表中删除节点,单链表的狸猫换太子,先把C的内容赋给B,然后再删除C。

5. 最短摘要的生成

6. 判断两个链表是否相交,解法一将第一个链表的节点地址进行hash排序,建立hash表,然后用第二个链表查询hash表,解法二把第二个链表接在第一个链表之后,再判断是否有环,解法三判断两个链表的最后一个节点

7. 在队列中取最大值,解法一维护最大堆,解法二保存队列中元素相对大小关系的指针集合

8. 求二叉树中节点的最大距离

9. 重建二叉树

10. 分层遍历二叉树

 

第四章

1. 计算坐到自己原位置的概率

2. 用1*2的瓷砖覆盖N*M的地板

3. 买票找零,转化为括号匹配

4. 点在三角形内,解法一用海伦公式(三斜求积数)算四个三角形的面积,解法二沿着三条边逆时针旋转点D,点D一定在边的左边

5. 磁带文件存放优化

6. 桶中只留下一个黑球的概率

7. 蚂蚁离开木杆的最短和最长时间

8. 输入三条边,判断能否构成三角形

9. 数独,每一行每一列都没有重复的数字

10. 数字哑谜和回文,问题1剪枝法和罗列整除的条件

11. 挖到雷的概率

相关文章
|
5月前
|
SQL 算法 NoSQL
三面头条,靠P9级算法大牛分享的两本算法pdf书籍,轻松拿到offer
头条一面(Java+项目) 1.倒排索引 2.讲讲redis里面的哈希表? 3.happen-before的规则? 4.volatile修饰符,synchronize锁 5.java单例模式的实现,懒汉、饿汉? 6.进程与线程的区别,多进程和多线程的区别?
|
9月前
|
SQL 算法 NoSQL
三面头条,靠P9级算法大牛分享的两本算法pdf书籍,轻松拿到offer
头条一面(Java+项目) 1.倒排索引 2.讲讲redis里面的哈希表? 3.happen-before的规则? 4.volatile修饰符,synchronize锁 5.java单例模式的实现,懒汉、饿汉? 6.进程与线程的区别,多进程和多线程的区别? 7.HashMap原理,为什么用红黑树,红黑树的特点? 8.快排时间空间复杂度,最好最坏的情况,优化方案?
|
13天前
|
机器学习/深度学习 人工智能 算法
基于DCT和扩频的音频水印嵌入提取算法matlab仿真
本文介绍了结合DCT和扩频技术的音频水印算法,用于在不降低音质的情况下嵌入版权信息。在matlab2022a中实现,算法利用DCT进行频域处理,通过扩频增强水印的隐蔽性和抗攻击性。核心程序展示了水印的嵌入与提取过程,包括DCT变换、水印扩频及反变换步骤。该方法有效且专业,未来研究将侧重于提高实用性和安全性。
|
28天前
|
机器学习/深度学习 算法
【MATLAB】GA_BP神经网络时序预测算法
【MATLAB】GA_BP神经网络时序预测算法
35 8
|
21小时前
|
存储 算法
m基于LDPC编译码的matlab误码率仿真,对比SP,MS,NMS以及OMS四种译码算法
MATLAB 2022a仿真实现了LDPC译码算法比较,包括Sum-Product (SP),Min-Sum (MS),Normalized Min-Sum (NMS)和Offset Min-Sum (OMS)。四种算法在不同通信场景有各自优势:SP最准确但计算复杂度高;MS计算复杂度最低但性能略逊;NMS通过归一化提升低SNR性能;OMS引入偏置优化高SNR表现。适用于资源有限或高性能需求的场景。提供的MATLAB代码用于仿真并绘制不同SNR下的误码率曲线。
14 3
|
3天前
|
算法 数据安全/隐私保护 计算机视觉
基于DCT变换的彩色图像双重水印嵌入和提取算法matlab仿真
**算法摘要:** - 图形展示:展示灰度与彩色图像水印应用,主辅水印嵌入。 - 软件环境:MATLAB 2022a。 - 算法原理:双重水印,转换至YCbCr/YIQ,仅影响亮度;图像分割为M×N块,DCT变换后嵌入水印。 - 流程概览:两步水印嵌入,每步对应不同图示表示。 - 核心代码未提供。
|
3天前
|
机器学习/深度学习 算法 数据可视化
Matlab决策树、模糊C-均值聚类算法分析高校教师职称学历评分可视化
Matlab决策树、模糊C-均值聚类算法分析高校教师职称学历评分可视化
10 0
|
4天前
|
算法 TensorFlow 算法框架/工具
基于直方图的图像阈值计算和分割算法FPGA实现,包含tb测试文件和MATLAB辅助验证
这是一个关于图像处理的算法实现摘要,主要包括四部分:展示了四张算法运行的效果图;提到了使用的软件版本为VIVADO 2019.2和matlab 2022a;介绍了算法理论,即基于直方图的图像阈值分割,通过灰度直方图分布选取阈值来区分图像区域;并提供了部分Verilog代码,该代码读取图像数据,进行处理,并输出结果到"result.txt"以供MATLAB显示图像分割效果。
|
5天前
|
算法 搜索推荐 数据挖掘
MATLAB模糊C均值聚类FCM改进的推荐系统协同过滤算法分析MovieLens电影数据集
MATLAB模糊C均值聚类FCM改进的推荐系统协同过滤算法分析MovieLens电影数据集
13 0
|
6天前
|
数据采集 机器学习/深度学习 存储
MATLAB用改进K-Means(K-均值)聚类算法数据挖掘高校学生的期末考试成绩
MATLAB用改进K-Means(K-均值)聚类算法数据挖掘高校学生的期末考试成绩
13 0