著做权归做者全部。
商业转载请联系做者得到受权,非商业转载请注明出处。
做者:invalid s
连接:http://www.zhihu.com/question/20066988/answer/26968999
来源:知乎
通常来讲,数据结构和算法这本书上提到的任何算法/数据结构,你都不会有机会从新实现一次。 由于,早有就各类各样的库,对外提供了工业级的、充分泛化的实现,只需拿来用就是了。 重写的话,一个代码质量/执行速度,显然都极难超过通过千锤百炼的、在无数项目中通过充分测试的库实现;另外一个,书上都是为了教学而作的简化实现,实际使用中,须要对算法作必定的泛化。(好比,c的qsort库函数,只要保证数据是以指针数组索引的、对自定义数据须传入比较大小的功能函数,那么任何数据均可以用这个qsort算法排序;C++里面呢,则是和容器、迭代器之类东西结合通盘考虑的,可泛用于任何符合规范的容器和原生数据类型。而课本上的实现,仅能支持数组中的整数。想作到工业水平,没有足够的经验是不可能的。) 但,另外一方面,全部这些算法/数据结构的设计思路,却会贯穿于绝大部分项目之中。 好比说,简单的冒泡算法,它是否是只是“屡次扫描一个数组,交换遇到的每一对相邻的、顺序反了的数字;当再也不发生交换时,数组已完成排序”甚至”好不容易才死记硬背下来的一段代码“? 若是你只学会了这个,那么,你真就彻底白学了。 做为一个表现通常的排序算法,冒泡排序自己出场率就不高;况且还有各类提供了泛化的sort算法的库:若是仅仅记下了这个,那么你一生都不会遇到”必须重写冒泡算法“的场合。 但,若是你把冒泡算法记成: 就好象水中的气泡同样,每次只执行“相邻的元素比较密度(或其它特征),密度小的上浮,密度大的下沉”这个局部物理过程;屡次进行后,局部有序就会变成(相关特征上的)总体有序。 甚至: 模仿各类会致使总体有序现象的局部过程去处理数据,可使得数据总体上知足相似的排布。 甚至: 考察任何天然规律,看它会产生什么有趣的后果;那么当须要达到相似的效果时,不妨尝试用程序模拟出这个规律,极可能就已经获得了想要的效果。 那,你这一辈子,可就受用不尽了。 好比说,”高大上“的”神经网络“”遗传算法“”蚁群算法“等等等等,其实骨子里不都是这个”冒泡思路“吗? 相似的,各类树都是链表的”钩挂“思想+数组的”索引“思想的结合体;”模拟退火算法“又是冒泡思路结出来的另外一颗果子;音频滤波算法就是简谐振动计算公式;面向对象的”继承“不过是常见的”归一化“手法的另外一个表述方式…… 能够说,若是能像对冒泡算法的真正理解同样,完全弄明白各类算法的设计思路并加以借鉴,那么你对这个世界的各类规律了解的有多透彻,你的程序就能够写的有多灵动。 一旦掌握这个,今后,你再没必要像那些菜鸟同样,绞尽脑汁敲出无数代码去”凑“需求;而是只需用代码编织出须要的规律,而后丢给CPU执行,你真正想要的东西就会天然”涌现“:如今,你只要找出”结果已经出现“的识别方法,用它来结束你的逻辑就好了。 (固然,达成一个目的每每能够有多个不一样的途径,不一样途径利用不一样的规律;那么哪一个途径最优呢?算法课教过你:这就是所谓的“算法复杂度”) ——冒泡算法可不就是用代码编织了一个”数值大者靠前(或靠后)“的规律,而后丢给CPU一跑,一大片数据就有序了? ——遗传算法呢,不正是”抄袭“了天然界的天然选择规律吗?把这个规律丢给CPU一跑,竟然连AI都弄出来了! 这些只是一些特别经典、特别著名的案例而已。 实际工做中,也是时刻均可能遇到一些新鲜的需求/场景;要完成工做,除了出苦力一行行码代码外,同样能够经过观察找到其中的规律,而后用代码编织规律,再让这些规律去替你完成需求:后者每每会比前者简洁的多得多,执行速度通常也会快得多得多。 这类随时随地“发明”的算法实在不值一提,不能让你像那些著名案例同样一鸣惊人;但它们却实实在在能够提升你的工做效率,让其余人可望不可即。 ——常常有高手骄傲的宣称,别人几万、几十万行代码都解决不了的问题,他数百行代码就清楚漂亮的解决了,执行效率还高出许多倍:他们就是这样作到的。