《算法图解》读后感
这学期接触的算法课,对于自己来说还是存在有一定的难度。接触算法之后才明白,原来生活中很多常见的问题背后竟然都蕴含着这么深奥的算法原理,存在着许多共性。一次偶然的机会得知室友有算法书籍《算法图解》,便向她借阅。由于时间的关系,没有全部阅读。本书的作者自称是一个视觉型学习者,所以这本书也正如它的书名一样,最大的特点就是“图解”,每一部分的内容都配有生动的图示,是一本非常适合算法初学者阅读的书籍。在阅读的过程中,令我印象最深刻的一部分是讲解贪心算法的章节。
贪心算法是指在对某一问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,同时也就省去了为了寻找整体最优而可能要穷举所有的情况而耗费的时间,所以这种算法设计得到的结果是在某种意义上的局部最优解。简单来说就是每次都根据贪心策略做一次贪心选择,每一次的贪心选择都选择局部的最优解,一步一步往下进行,直到算法停止,最终得到的就是整体的最优解。
在学习的过程中,一直紧盯着贪心算法的概念是很难理解的,所以在阅读时,我也是借助学习具体的题目才开始慢慢体会到贪心算法的原理。《算法图解》里有关贪心算法的最典型的一个问题就是教室调度问题。只有一间教室,你需要根据课程表在同一天里将尽可能多的课程安排在这间教室里,使得尽量多的课程的上课时间不冲突。这个问题好像很难,实则不然。首先我们肯定要选出结束时间最早的课,作为要在这间教室上的第一堂课。接下来,必须选择第一堂课结束后才开始的课。同样,选择了结束时间最早的课,就将成为在这间教室里上的第二堂课。重复上述操作。总结一下,这里使用贪心算法,目的就是上更多的课,优先找那些结束时间早的课程,为后面的课程留出更多的时间,即以下课时间为贪心。
在阅读完《算法图解》的贪心算法这一部分之后,我联想到了其实我们在生活中最常见的找零钱问题也是与上述问题类似。为了使找回的钱币的数量最少,利用贪心算法,优先选择面值大的钱币。即以钱币面值为贪心,按照面值递减的顺序,先尽量找回面值大的钱币,直到当前该找回的零钱不足大面值时才去选择下一个面值的钱币,一直到最后找完所有的零钱。
此次的期末大作业选题1也是一个经典的可以利用贪心算法解决的问题。n个任务由两台机器加工,选择一种调度方案,使n个任务在尽可能短的时间内由这两台机器加工完毕。我们就可以以任务的加工时间为贪心,将n个任务按照加工时间从大到小排序,然后依此顺序将任务分配给空闲的机器。也就是说从当前剩下的任务中,选择需要加工时间最长的,把它分配给当前总累计需要总加工时间最短的机器,直到所有的任务都被加工完毕。
类似于上述的例题还有很多,这里就不一一阐述了。学习算法最重要的就是理解它的思想,体会算法的整个的过程。刚开始知晓贪心算法时,也是一直绕不清楚,阅读本书之后确实是得到了很大的启发,尤其是书中的通俗易懂的图示,
更好的帮助了我去理解算法。这学期的课程了解到了很多的有关算法的知识,也算是开拓了一个新的领域,每一种算法都是一个解决问题的办法。在学习的过程中,虽然遇到了很多的困难,但还是希望通过课堂的学习和课外相关书籍的阅读,能够将算法真正的运用到我们的生活中,去解决实际的问题,提升自己的能力。