数据结构决定遍历次序;
- 无序
- find()
- 目标对象与向量存放对象逐个比对;
- 有序
- search()
- 利用二分查找策略;
线性序列结构。
各数据项的物理存放位置与逻辑次序完全对应,可通过秩直接访问对应的元素,即循秩访问 (call-by-rank)。
向量中的秩同时对应于逻辑、物理次序。
线性序列结构。
为保证元素访问的可行性,逻辑上互为前驱和后继的元素之间,应维护某种索引关系,可抽象地理解为被索引元素的位置 (position),故列表元素是循位置访问 (call-by-position)。
也可形象地理解为通往被索引元素的链接 (link),亦称循链接访问 (call-by-link)。
位置对应于逻辑次序。
线性序列结构。
基于向量或列表实现,一般不提供对任意成员的查找接口。
以上数据结构,由实现方式,可以分为如下。
- 基于数组的实现
- 允许通过下标或秩,在常数时间内找到对象;
- 对结构进行修改,插入、删除均需要耗费线性时间;
- 基于链表的实现
- 线性时间内对整个结构进行便利查找获得特定次序的元素;
- 在常数时间内插入或删除元素;
树结构将 2 类结构的优点结合起来,回避其不足。
树中的元素之间不存在天然的直接后继或直接前驱关系,附加某种约束(比如遍历),也可以在树中的元素之间确定某种线性次序,树属于半线性结构 (semi-linear structure)。
树是一种分层结构。
二叉树是树的一种特例,不失其一般性。
无论就逻辑结构还是算法功能而言,任何有根有序的多叉树,都可等价的转化为二叉树。
非线性关系。
通过遍历将一般性的二元关系转化为半线性结构,进而借助树结构已有的处理方法和技巧,最终解决问题。
半线性结构。