有一天,一个学生给我留言:“我看到一些资料介绍机器人具有情感,真是不可思议,我对这个特别感兴趣,但我该怎么做呢?”我告诉他:“先看算法。”过了一段时间,这个学生苦恼地说:“算法书上那些公式和大段的程序不能执行,太令人抓狂!我好像懂了一点儿,却又什么都不懂!”我向他推荐了一本简单一点儿的书,他仍然表示不太懂。
问题出在哪里?数据结构?C语言?还是算法表达枯燥、晦涩难懂?
这些问题一点也不意外,你不会想到,有同学拿着C语言书问我:“这么多英文怎么办?for、if这样的单词是不是要记住?”我的天!我从来没考虑过for、if这些是英文,而且是要记的单词!就像拿起筷子吃饭,端起杯子喝水,我从来没考虑我喝的是H 2 O。经过这件事情,彻底颠覆了我以前的教学理念,终于理解为什么看似简单的问题,那么多人就是看不懂。我们真正需要的是一本算法入门书,一本要简单、简单、再简单的算法入门书。
有学生告诉我:“大多数算法书上的代码都不能运行,或者运行时有各种错误,每每如此都迷茫至崩溃……”我说:“你要理解算法而不是运行代码。”可这个学生告诉我:“你知道吗,我运行代码成功后是多么喜悦和自信!已经远远超越了运行代码的本身。”好吧,相信这本书将会给你满满的喜悦和自信。
本书从算法之美娓娓道来,没有高深的原理,也没有枯燥的公式,通过趣味故事引出算法问题,结合大量的实例及绘图展示,分析算法本质,并给出代码实现的详细过程和运行结果。如果你读这本书,像躺在躺椅上悠闲地读《普罗旺斯的一年》,这就对了!这就是我的初衷。
本书适合那些对算法有强烈兴趣的初学者,以及觉得算法晦涩难懂、无所适从的人,也适合作为计算机相关专业教材。它能帮助你理解经典的算法设计与分析问题,并获得足够多的经验和实践技巧,以便更好地分析和解决问题,为学习更高深的算法奠定基础。
更重要的是——体会算法之美!
知识在于积累,学习需要耐力。学习就像挖金矿,或许一开始毫无头绪,但转个角度、换换工具,时间久了总会找到一个缝隙。成功就是你比别人多走了一段路,或许恰恰是那么一小步。
第一个建议:多角度,对比学习。
学习算法,可以先阅读一本简单的入门书,然后综合几本书横向多角度看,例如学习动态规划,拿几本算法书,把动态规划这章都找出来,比较学习,多角度对比分析更清晰,或许你会恍然大悟。或许有同学说我哪有那么多钱买那么多书,只要想学习,没有什么可以阻挡你!你可以联系你的老师,每学期上课前,我都会告诉学生,如果你想学习却没钱买书,我可以提供帮助。想一想,你真的没有办法吗?
第二个建议:大视野,不求甚解。
经常有学生为了一个公式推导或几行代码抛锚,甚至停滞数日,然后沉浸在无尽的挫败感中,把自己弄得垂头丧气。公式可以不懂,代码可以不会。你不必投入大量精力试图推导书上的每一个公式,也不必探究语法或技术细节。学算法就是学算法本身,首先是算法思想、解题思路,然后是算法实现。算法思想的背后可能有高深的数学模型、复杂的公式推导,你理解了当然更好,不懂也没关系。算法实现可以用任何语言,所以不必纠结是C、C++、Java、Python……更不必考虑严格的语法规则,除非你要上机调试。建议还是先领会算法,写伪代码,在大脑中调试吧!如果你没有良好的编程经验,一开始就上机或许会更加崩溃。遇到不懂的部分,浏览一下或干脆跳过去,读完了还不明白再翻翻别的书,总有一天,你会发现“蓦然回首,那人却在灯火阑珊处”。
第三个建议:多交流,见贤思齐。
与同学、朋友、老师或其他编程爱好者一起学习和讨论问题,是取得进步最有效的办法之一,也是分享知识和快乐的途径。加入论坛、交流群,会了解其他人在做什么、怎么做。遇到问题请教高手,会感受到醍醐灌顶的喜悦。论坛和群也会分享大量的学习资料和视频,还有不定期的培训讲座和读书交流会。记住,你不是一个人在战斗!
第四个建议:勤实战,越挫越勇。
实践是检验真理的唯一标准。古人云:“学以致用”“师夷长技以制夷”。请不要急切期盼实际应用的例子,更不要看不起小实例。“不积跬步,无以至千里”,大规模的成功商业案例不是我们目前要解决的问题。看清楚并走好脚下的路,比仰望天空更实际。多做一些实战练习,更好地体会算法的本质,在错误中不断成长,越挫越勇,相信你终究会有建树。
第五个建议:看电影,洞察未来。
不管是讲人工智能,还是算法分析,我都会建议同学们去看一看科幻电影,如《人工智能》《记忆裂痕》《绝密飞行》《未来战士》《她》等。奇妙的是,这些科幻的东西正在一步步地被实现,靠的是什么?人工智能。计算机的终极是人工智能,人工智能的核心是算法。未来的战争是科技的战争,先进的科技需要人工智能。我们的国家还有很多技术处于落后状态,未来需要你。
“一心两本”学习法:一颗好奇心,两个记录本。
怀着一颗好奇心去学习,才能不断地解决问题,获得满足感,体会算法的美。很多科学大家的秘诀就是永远保持一颗好奇心;一个记录本用来记录学习中的重点难点和随时突发的奇想;一个记录本做日记或周记,记录一天或一周来学了什么,有什么经验教训,需要注意什么,计划下一天或下一周做什么。不停地总结反思过去,计划未来,这样每天都有事做,心中会有满满的正能量。
记住没有人能一蹴而就,付出总有回报。
(1)实例丰富,通俗易懂。从有趣的故事引入算法,从简单到复杂,使读者从实例中体会算法设计思想。实例讲解通俗易懂,让读者获得最大程度的启发,锻炼分析问题和解决问题的能力。
(2)完美图解,简单有趣。结合大量完美绘图,对算法进行分解剖析,使复杂难懂的问题变得简单有趣,给读者带来巨大的阅读乐趣,使读者在阅读中不知不觉地学到算法知识,体会算法的本质。
(3)深入浅出,透析本质。采用伪代码描述算法,既简洁易懂,又能抓住本质,算法思想描述及注释使代码更加通俗易懂。对算法设计初衷和算法复杂性的分析全面细致,既有逐步得出结论的推导过程,又有直观的绘图展示。
(4)实战演练,循序渐进。每一个算法讲解清楚后,进行实战演练,使读者在实战中体会算法,增强自信,从而提高读者独立思考和动手实践的能力。丰富的练习题和思考题用于及时检验读者对所学知识掌的握情况,为读者从小问题出发到逐步解决大型复杂性问题奠定了基础。
(5)算法解析,优化拓展。每一个实例都进行了详细的算法解析,分析算法的时间复杂度和空间复杂度,并对其优化拓展进一步讨论,提出了改进算法,并进行伪码讲解和实战演练,最后分析优化算法的复杂度进行对比。使读者在学习算法的基础上更上一个阶梯,对算法优化有更清晰的认识。
(6)网络资源,技术支持。网络提供本书所有范例程序的源代码、练习题以及答案解析,这些源代码可以自由修改编译,以符合读者的需要。本书提供源代码执行、调试说明书,对读者存在的问题提供技术支持。
写一本书是一项极其琐碎、繁重的工作,尽管我已经竭力使本书和网络支持接近完美,但仍然可能存在很多漏洞和瑕疵。欢迎读者提供关于本书的反馈意见,有利于我们改进和提高,以帮助更多的读者。如果你对本书有任何评论和建议,或者遇到问题需要帮助,可以加入趣学算法交流QQ群(514626235)进行交流,也可以致信作者邮箱rainchxy@126.com或本书编辑邮箱zhangshuang@ptpress.com.cn,我将不胜感激。
感谢我的家人和朋友在本书编写过程中提供的大力支持!感谢提供宝贵意见的同事们,感谢提供技术支持的同学们!感恩我遇到的众多良师益友!