Grokking Algorithms

Aditya Bhargava

出版时间

2016-05-01

ISBN

9781617292231

评分

★★★★★
书籍介绍
这是一本敢把算法'说人话'的入门书。它刻意剥离了大部头里令人望而生畏的公式推导,转而用漫画式的图解和能直接运行的 Python 代码,把大O表示法、二分查找、快速排序、动态规划这些概念讲得浅显生动。读者最津津乐道的,是它让你'用大脑过一遍就能跟上'——算法课不再需要啃大部头,躺床上也能读。不过正因其定位为'算法简介',习题偏少、几处小瑕疵也是真实存在的代价:它负责帮你推开那扇门、建立直觉,而真正要在工作中驾驭算法,仍需你翻过门槛后自行练习。
作者简介
Aditya Bhargava is a Software Engineer with a dual background in Computer Science and Fine Arts. He blogs on programming at adit.io.
AI导读
核心看点
  • 全彩图解,将抽象算法具象化,让枯燥概念秒懂。
  • Python代码示例,比伪代码更直观,降低阅读门槛。
  • 涵盖二分查找、递归、散列表等核心算法与数据结构。
读者共识
  • 公认最友好的算法入门书,图文并茂,阅读体验极佳。
  • 大O表示法讲解清晰,是理解算法效率的最佳起点。
  • 虽内容精简,但能激发兴趣,是告别算法恐惧的良药。
精彩摘录
  • "大O表示法(稍后介绍)讨论运行时间时, log指的都是log2。 使用大O表示法,这个运行时间为O(n)。单位秒呢?没有——大O表示法指的并非以秒为单位的速度。 大O表示法让你能够比较操作数,它指出了算法运行时间的增速。"
  • "下面按从快到慢的顺序列出了你经常会遇到的5种大O运行时间。  O(log n),也叫对数时间,这样的算法包括二分查找。  O(n),也叫线性时间,这样的算法包括简单查找。  O(n * log n),这样的算法包括第4章将介绍的快速排序——一种速度较快的排序算法。  O(n2),这样的算法包括第2章将介绍的选择排序——一种速度较慢的排序算法。  O(n!),这样的算法包括接下来将介绍的旅行商问题的解决方案——一种非常慢的算法。"
  • "当前,我们获得的主要启示如下  算法的速度指的并非时间,而是操作数的增速。  谈论算法的速度时,我们说的是随着输入的增加,其运行时间将以什么样的速度增加。  算法的运行时间用大O表示法表示。  O(log n)比O(n)快,当需要搜索的元素越多时,前者比后者快得越多。"
  • "'use strict'; function binary_search(list, item) { let low = 0; let high = list.length - 1; while (low <= high) { let mid = Math.floor((low + high) / 2); let guess = list[mid]; if (guess === item) { return mid; } if (guess > item) { high = mid - 1; } else { low = mid + 1; } } return null;} const my_"
  • "'use strict';// Selection Sort - O(n^2)// Parameter:// 1. random array // 1. Finds the smallest value in an arrayfunction findSmallestIndex(array) { var smallestElement = array[0]; // Stores the smallest value var smallestIndex = 0; // Stores the index of the smallest value for (var i = 0; i < array"
  • "我很喜欢Leigh Caldwell在Stack Overflow上说的一句 话: “如果使用循环, 程序的性能可能更高; 如果使用递归, 程序可能 更容易理解。 如何选择要看什么对你来说更重要。 ”"
  • "编写递归函数时, 必须告诉它何时停止递归。 正因为如此, 每个递归 函数都有两部分: 基线条件 ( base case) 和递归条件 ( recursive case) 。 递归条件指的是函数调用自己, 而基线条件则指的是函数不再 调用自己, 从而避免形成无限循环。"
  • "使用栈虽然很方便, 但是也要付出代价: 存储详尽的信息可能占用大量 的内存。 每个函数调用都要占用一定的内存, 如果栈很高, 就意味着计 算机存储了大量函数调用的信息。 在这种情况下, 你有两种选择。 重新编写代码, 转而使用循环。 使用尾递归 。 这是一个高级递归主题, 不在本书的讨论范围内。 另外, 并非所有的语言都支持尾递归 递归指的是调用自己的函数。 每个递归函数都有两个条件: 基线条件和递归条件。 栈有两种操作: 压入和弹出。 所有函数调用都进入调用栈。 调用栈可能很长, 这将占用大量的内存。"
用户评论
挺久之前就看完了,拖到现在才写新年第一条书评。学过数据结构的话会觉得偏简单,最后两章讲得有点简略,但条理清晰,舍弃了晦涩的底层知识和推导,可读性强,配图也很棒。
描述得很形象,通俗易懂,很好的科普入门级读物
本科时候看这个多好。不过算法有点少。dp写得有点绕。要出本进阶版就好了。
没有什么新东西 当复习吧 不过最后一章介绍一些书里不讲的算法时倒是有看到几个原来不知道的 哪天再搜来看看吧
不是一本高大全的算法和数据结构书,通篇只简单讲解了分治、递归、BFS、Dijkstra、动态规划、贪婪算法等。但是配图有趣易懂,使用python代码,比伪代码更易懂,比Java或C更容易写。我认为非常适合作为算法和数据结构的入门读物,读完会对算法和数据结构有不错的了解,并且皆有可能勾起深入学些了解的兴趣。
明白了为啥要刷data structure leetcode
这也写太好了吧 惊呆 小学生都能懂的算法书
太适合我这种算法小白了!
不错
可以搭配一门算法入门课一起阅读
下载
全部深度解读 →主题书单高分榜最近更新