0.0. 个人观点
我认为初学某样东西,我们应该学习最基本最简单明了的内容,一开始不能追求“高深”,而应该追求“无错”。就好比某些武侠小说中的人物刚开始学武时,一开始练得并不是“天下第一”的武功秘籍,而是等级不高、名字通俗的“烂大街”的基础武功。这些基础武功并不高深,也不能以一当百,但却做到了“无错”二字。当把这些“无错”的功夫练得烂熟于胸后,他们又会有各种机遇习得真正的“武林秘籍”。这时,由于之前那些“无错”的简单功夫提前打下的基础、立好的“架子”、积累的经验,他们才能最终学到武功奥秘。
回到数据结构和算法上来,我也阅读过一些相关书籍,这些书籍都是真正的好书,配图详实、措辞严谨、考虑问题周到,但却也总是让初学的我望文止步。因为作为一个初学者,我更需要了解的是最基本的原理,否则就算示例的代码写得再规范、程序的健壮性再高、算法的时间复杂度再小,这些内容我也看不懂,上不了手,进不到脑子里。
就好比作为一个初学武功的人,更急切要做的是如何稳稳地出拳、踢腿,而非如何和别人切磋武艺,甚至生死相搏,如果连出拳、出稳拳都做不到,那么就算是“天下第一”的武林秘籍,也只能束之高阁。所以我在想,能不能做一个只讲如何“出拳”“踢腿”“扎马步”的“无错”的“通俗烂大街”的简单功夫?没有华丽的招式、没有高超技巧、没有必杀技,只有简单拳脚功夫。
0.1. 关于本文档
抱着这样的想法,我开始边学习边写作的过程,不知不觉中积累了这么多的文章,遂将其整理成一个完整的文档。
本文档的目的在于用图和代码再加上形象的语言阐述最基本的数据结构和算法原理。
本文档的基调是“无错”和“简单”,所以我将尽量避免一些我个人认为在本文档中不重要的名词和概念,那些只有在考场的试卷中才细究的东西更不会出现在本文档中(当然并不是说这些不重要)。
本文档尽力做到只专注于最直接的数据结构和算法,诸如程序健壮性、编程语言等等问题不在考虑范围内。
在本文档中,某些程序可能会不完美、健壮性不高,考虑问题的情况也不那么周到,因为我不想因为让程序更完美、健壮性更高、情况更周到等而使内容变得更难以理解。这就好比为了使“原理”这件礼物看起来更“漂亮”而在其周围多包装了十几层华丽的包装。当然,并不是说这些“包装”不重要,只是这对于急于要看到其真面目的我们有点多余。请在阅读的时候牢记这一点。
本文档的重心在原理本身,程序只是示例,所以并不完美,也不规范,仅仅提供一个参考、一个实现,好让配图和文字不显得那么苍白无力。我相信很多人写的程序都会比我的更完美、健壮性更高。
请注意:本文档并不是一本书,只是一名无名小卒写的一些个人文章的合集罢了,所以请不要抱太高的期望。但是我将尽自己最大努力确保文档中出现的内容的正确性,尽量做到“无错”和“简单”四个字。不过个人水平实在有限,所以还是可能会有错误出现。所谓“只缘身在此山中”“当局者迷”,某些错误我可能当时并发现不了(说到底还是水平不高)。
所以如果你愿意继续阅读下去,烦请身为“身在山外的旁观者”的你用最严格的批判的眼光来阅读。
这一点对你很重要,对我也很重要。
当然,如果本文档能给你的学习带来一点帮助,那将是我莫大的荣幸。
本文档最后的效果是步骤④(我甚至不确定本文档配不配得上④中的那匹漂亮的马),“其他细节”不在本文档范围内。
如目录所示,本文档一开始并不先介绍数据结构和算法是什么,衡量算法优劣的时间复杂度和空间复杂度等知识也先不介绍(这些都将放到最后),而是直接开门见山,用图“亲眼看”、用代码“亲手看”数据结构和算法长什么样。
所以我们直接从最简单的线性表开始、一路上会遇到各种数据结构以及算法等基本内容,至于终点——学无止境。
0.2. 获取及错误指正
完整示例代码请移步GitHub | Gitee(目前有 C语言,后续会补充 Java 和 Go 语言两种版本,文档内的示例为 C语言)。
如果你肯阅读它,并发现了错误或者不合理的地方,请阁下不吝赐教,在下尽快改正。
指正方式:
- 评论区指正
- 邮件到 i@woyishixing.ren
- GitHub | Gitee 项目上提 issue
- 公众号后台留言(微信搜一搜『二十二画程序员』或者微信扫描下方二维码↓↓↓)