《枕边算法书》阅读笔记:一场从热爱到实践的算法启蒙之旅

目录:

目录

目录:

前言:

第一章:思维与团队------算法世界的基石

第二章:初窥门径------排序、速度与数据结构

第三章:缘分与进阶------递归的魔术

第四章:温故知新------回溯法与基础巩固

总结与收获

致谢


前言

最近拜读了一本颇为有趣的算法书------《枕边算法书》。它不像教材那样刻板,更像是一位前辈的娓娓道来,记录了我从兴趣盎然到动手实践的完整心路历程。在此将我的阅读笔记与思考分享给大家,希望能为同样在算法之路上的你带来一些启发。

第一章:思维与团队------算法世界的基石

开篇作者以自身经历引入,从学生到从业者的转变,充满了对编程工作的真挚热爱。他立刻点出一个关键:Bug往往源于微小的思维盲点 。书中举了一个有趣的例子:a=b的前提下,推导出 (a-b)(a+b)=b(a+b),最终竟得出 2=1的荒谬结论。这让我深刻意识到,严谨的逻辑是程序员的立身之本。

随后,作者借高斯和冯·诺依曼的故事,升华了主题:个人能力再强,也不可忽视团队的力量 。在团队中,学会解读他人的代码和思想是至关重要的能力。本章末尾提出了三个实战问题(集合、回文、末日算法)来让读者练手,可惜我还在消化中,未能完全解决。

第二章:初窥门径------排序、速度与数据结构

时隔几日,我进入了第二章,终于接触到了算法的"老朋友"------排序算法 。作者通过搜索算法与优化问题,自然地引入了算法运行速度的表示方法 (如 O(n), O(n log n) 等),并由此过渡到动态规划。这一部分让我绞尽脑汁,花了三天时间才勉强理解。

紧接着是散列算法(Hash) ,这属于数据结构的内容。坦白说,由于我尚未系统学习数据结构,初看时感到有些枯燥和无趣。书中还提到了一个名为 Soundex ​ 的算法,用于按名字快速分类,但我觉得在国内应用场景可能不多。本章后半部分(2.5, 2.7, 2.8节)更多是在探讨时间与空间的权衡,为下一章阅读他人代码做了铺垫。

这本书是我上个暑假看的,在这个篇章让我对数据结构产生了深厚的兴趣,我认为这本书对我的启发也是我现在正在写《Java数据结构与算法》的原因之一。

第三章:缘分与进阶------递归的魔术

在第二章读完的当晚,我就迫不及待地开始了第三章的阅读。因为这本书,我对阅读"别人有趣的代码"产生了浓厚的兴趣,真可谓是 I can't help

开篇的欧几里得算法让我倍感亲切!因为我前不久刚用它解决过一个实际问题:

问题:很多速度不同的同学在操场上跑步,每两个同学相遇一次就打一次招呼,当所有人同时到达终点时停止。问总共打了多少次招呼?

我的解法:正是利用了欧几里得算法计算最大公约数,先解决了两两同学之间需要跑多少圈才能相遇的问题。其核心伪代码如下:

复制代码
令 m > n
while (n > 0) {
    r = m % n;
    m = n;
    n = r;
}
// 最终m即为最大公约数

当然,实际问题涉及多位同学,这就引出了本章的重点------递归 。在这里,我学到了一个新概念:尾递归。它能有效解决普通递归中内存占用大、运算慢的问题。我的理解是,尾递归就是让递归调用发生在函数的最后一步操作,这样编译器可以进行优化。

我用尾递归重写了欧几里得算法:

复制代码
int gcd(int a, int b) {
    if (a < b) {
        swap(a, b);
    }
    if (b == 0) {
        return a;
    } else {
        return gcd(b, a % b); // 尾递归调用
    }
}

本章后续提到了后缀数组等更高级的内容,但由于我C语言和指针知识薄弱,只能暂时搁置,但也让我清楚看到了自己的知识短板。

第四章:温故知新------回溯法与基础巩固

这一章的开篇就遇到了老朋友------N皇后问题 。我之前用遍历递归实现过"八皇后",而书中介绍的是回溯法。这个名词让我既熟悉又陌生。

欣慰的是,曾经觉得很难的八皇后问题,我现在可以轻松地写出检查位置是否安全的函数(尽管代码排版在笔记中有些混乱):

复制代码
public boolean test(int arr[][], int i, int b) {
    // 检查同一列
    for (int a = 0; a < i; a++) {
        if (arr[a][b] == 1) {
            return false;
        }
    }
    // 检查左上对角线
    for (int a = i - 1, j = b - 1; a >= 0 && j >= 0; a--, j--) {
        if (arr[a][j] == 1) {
            return false;
        }
    }
    // 检查右上对角线
    for (int a = i - 1, j = b + 1; a >= 0 && j < arr[0].length; a--, j++) {
        if (arr[a][j] == 1) {
            return false;
        }
    }
    return true;
}

在作者讲解递归调用栈时,用到了API等前端相关知识,这又成了我的知识盲区,只能暂时跳过。本书的最后复习了位运算符2的补码,这些我在学习Java基础时已经掌握,算是为这次阅读画上了一个圆满的句号。

总结与收获

通读《枕边算法书》,我最大的收获不是学会了多少个具体算法,而是建立了一个完整的算法学习观

  1. 态度:从热爱出发,以严谨的逻辑思维对待每一个细节。

  2. 方法:理解基础(如复杂度),掌握核心思想(如递归、回溯),并勇于动手实践。

  3. 视野:认识到计算机知识的广博(数据结构、组成原理、网络等),明确了未来需要补足的方向。

这本书确实是一本优秀的"枕边书",它点燃了我对算法的兴趣,并指引了我接下来的学习路径。接下来,我的计划是补足数据结构和C语言指针的短板,然后继续跟随韩老师深造Java。

**路漫漫其修远兮,吾将上下而求索。**​ 与诸君共勉!

致谢

终于到了文章的尾声。如果您能看到这里,说明您和我一样,对算法世界抱有着一份耐心与好奇。这篇笔记篇幅不短,感谢您愿意花费宝贵的时间,陪伴我一起重温这段充满挑战与乐趣的阅读旅程。

您的阅读,就是我分享的最大动力。写作的过程,也是我重新梳理和深化的过程,希望能为您带来一些启发或共鸣。当然,由于个人知识水平有限,文中难免有理解不当或表述不清之处,非常欢迎您在评论区指正、交流,我们一起探讨,共同进步。

如果这篇文章对您有所帮助,或者您也读过这本有趣的《枕边算法书》,欢迎点赞、收藏或分享。您的每一次互动,都是对我莫大的鼓励。

山高水长,我们下一篇博客再见!

祝您编程愉快!

相关推荐
IMPYLH2 小时前
Lua 的 pairs 函数
开发语言·笔记·后端·junit·单元测试·lua
摇滚侠3 小时前
Vue 项目实战《尚医通》,利用 Qrcode 获取二维码,笔记51
vue.js·笔记
星星20254 小时前
新能源汽车六大变革重塑中国汽车制造格局
笔记·团队开发
代码游侠4 小时前
复习笔记——C语言指针
linux·c语言·开发语言·笔记·学习
LO嘉嘉VE4 小时前
学习笔记十七:神经网络基础概念
笔记·神经网络·学习·机器学习
八年。。5 小时前
Ai笔记(二)-PyTorch 中各类数据类型(numpy array、list、FloatTensor、LongTensor、Tensor)的区别
人工智能·pytorch·笔记
不羁的木木5 小时前
【开源鸿蒙跨平台开发学习笔记】Day02:React Native 开发 HarmonyOS-环境搭建篇(填坑记录)
笔记·学习·react native·harmonyos·har
必胜的思想钢印12 小时前
修改主频&睡眠模式&停机模式&待机模式
笔记·stm32·单片机·嵌入式硬件·学习
Dream Algorithm14 小时前
价格在走盘整,但是头寸持仓量增加说明什么
笔记