037-学编程二算法和数据结构的费曼法

037-学编程二算法和数据结构的费曼法 费曼学习法系列 · 第037篇用费曼学习法学编程(二):算法和数据结构的费曼法一、算法不是"背解法"很多初学算法的人认为:算法就是"别人想出来的标准解法,我把它背下来,遇到类似的题目就套用"。这个想法是算法学习最大的障碍。费曼式的算法学习完全不同。它关注的是:这个算法要解决什么问题?为什么它的设计者认为这种方法是好的?如果是你,你会怎么想?当你把一个算法当作"别人想好的解法"来背时,你永远学不会设计算法。当你把它当作"一个聪明人面对某个问题时想到的解法,我来理解他为什么这样想"时,你才开始真正地学习算法思维。二、费曼式理解排序算法以"冒泡排序"为例。普通学法:记住两层循环、相邻比较、交换的代码模板,死记硬背。费曼学法:第一步——问题是什么?“给你一堆乱序的数字,请把它们从小到大排好。”第二步——如果是你,你会怎么做?你可以说:“我就像打扑克牌理牌一样,从左到右看,如果前一张比后一张大,就交换它们。一遍走完,最大的数字就’冒泡’到了最右边。然后重复这个过程,排除掉已经排好的最后一位。”第三步——这个算法的本质是什么?“每一轮遍历,把未排序部分中最大的那个数,像气泡一样推到最右边。”第四步——它好在哪?不好在哪?“好处是简单直观,新手能理解。坏处是效率低——10万个数据要排大概100亿次比较。”如果你能这样理解冒泡排序,那当你学习更快的排序(快速排序、归并排序)时,你不是在"背新解法",而是在想——“冒泡太慢了,怎么才能更快?如果我把数据分成两部分分别排,是不是更快?这就是归并排序的思路。”三、数据结构是"数据的组织形式"数据结构的费曼式理解:数据结构就是"怎么把数据组织起来,让常用