一、数据检索与符号表
当信息本身不复杂的时候,不需要给数据添加索引,直接查找数据本身就可以。但是当信息本身比较复杂,比如数据是中文文本的时候,如果直接检索文本本身,检索的效率会非常低。这时,为数据添加索引,比如标题或数字序号,然后利用索引来检索文本,检索效率会有非常大的提升。
于是就诞生了新的数据结构:符号表,也叫字典或map。它描述一张抽象的表格,我们会将信息(值)存储在其中,然后按照指定的索引(键)来搜索并获取这些信息。键和值得具体意义取决于不同的应用。
二、符号表设计中的性能要求
符号表中一般会保存很多的键和信息,因此高性能读写必然是对符号表设计的基本要求。
比如,我们希望设计出的表,能在尽量短的事件内找到所需要的信息,同时又要求我们在往表中添加信息时尽量高效。(实际上,这两个要求是互相矛盾的:有序索引的表,可以让我们非常快的找到信息,但是由于要保持有序状态,添加数据的时候就需要大费周折;相反,无序索引的表,由于不需要维护索引的有序状态,数据添加非常方便,但同时查找数据,就不得不遍历序列)。
什么样的数据结构能够满足我们的要求呢?
三、二分法的灵感
关于符号表的设计,如果你始终“线性”地思考问题,那很难取得突破性进展。如果你的脑海突然闪出了二分,或者想到了最基础的“二分查找算法”或许在这里有用武之地,那恭喜你,你的符号表的性能有了飞跃的可能。
基于二分的理念,如果我们能用二分的方法来创建表格,同时用二分的方法来检索表格,那就能设计出读写性能都优异的符号表。而这个结构就是二叉查找树。当然,为了解决高效检索的问题,科学家已经发明了很多经典的查找算法,比如:二叉树,红黑树,散列表等。实际上,没有这些搜索算法,现代信息世界的基础计算设施都无从谈起。
明白了这些内容,在学习符号表与搜索算法的过程中,就会有更加清晰的认识了。明白了他们产生的原因,也明白了他们的用武之地。
四、算法与数据结构之间的关系
上面的分析过程,揭示了算法与数据结构之间密不可分的关系,也就解释了为什么很多算法书都是以《数据结构与算法》来命名的原因。我们在解决某个问题的时候,算法和数据结构总是息息相关的:算法实现依赖于数据结构的设计,而数据结构的设计则很可能来自算法带来的灵感;确定的算法限定了数据结构设计的方向,确定的数据结构则为算法的实现提供了便利。