在设计数据结构时,该数据所表达的实体或概念就是其外部表现,存储的组织和访问规则限定是其内部结构。
1.内部结构
如果忽视了内部结构的复杂性和坚固性需求,就很容易产生“按照现实的特征组织数据结构”的错误设计思路。
如果认识到内部结构还要考虑坚固性和美感,那么设计数据结构时,就应该考虑其读写特点并据此建立更高效的存储结构。
按照读取和存储性能而不是现实特征设计数据结构的典型例子是关系数据库的数据规范化。这里就不专门展开数据规范化的介绍,它将现实的复杂事物分解为多个二维函数依赖的数据实体,对性能(读取和存储)、可靠性(完整性约束)都有提升。
在为一副扑克牌设计数据结构时,很多人会直接使用链表结构List,因为看上去一副扑克牌由54张连续卡片组成。如果考虑扑克牌的可靠性(每张牌都不一样,否则就报错)和性能(快速地发牌和检查),构造一个集合类型PowerSet可能更好,PowerSet的数据是54位,每位代表一张卡牌,为一位设置0或1表示相应卡牌是否存在。同样的道理,在设计班级学生管理时,很多人常常使用List作为一个班级所有学生的数据结构,可是修改为Set可能效果更好。
2.外部表现
如果忽视了外部表现的抽象和简洁性需要,就会直接把存储结构昭示天下,留下让外界控制数据结构的隐患。
如果认识到外部表现需要简洁和抽象,就会把存储结构隐藏起来,公开操纵存储结构的方法。
一个使用堆栈实现括号匹配的代码如下,它暴露了堆栈的内部结构:context数组、top、size。
更好的代码如下所示,它只使用了堆栈的外部表现,隐藏了内部结构。
在使用链表、堆栈、二叉树、图等复杂数据结构解决应用问题时,经常会出现上述现象。