代码大全 表驱动法
表驱动法是一种编程模式(scheme)-从表里查找信息而不使用逻辑语句(if和case)。对简单的情况而言,使用逻辑语句更为容易和直白。但随着逻辑链的越来越复杂,查表法也就愈发显得更具吸引力
一,表驱动法使用总则
使用表驱动法的两个问题:
- 如何在表中查询条目(1)直接访问(2)索引访问(3)阶梯访问
- 在表里存些什么,可以是查询出来的结果数据,可以是保存一个描述该动作的代码,可以是保存对实现该动作的子程序的引用
二,直接访问表,四个例子:
- 计算每月的天数是一个很适合用直接访问表描述的例子,因为你可以用month变量去表里面查询记录。一般来说,你可以用原本控制着很多if语句的数据去直接访问表
- 字符分类
- 保险费率:对于很多因素影响的保险费率,可以把这些费率存入所有因素索引的数组里,而不仅仅是按年龄索引
构造查询键值的方法:
- 复制信息从而能够直接使用键值,如果用直接访问法但某些键值是相同的,(18岁以下的保险费率相同),最简单的办法就是为0-17的每个年龄都复制一份相同的键值,缺点也很明显,数据冗余
- 转换键值以使其能够直接使用,紧接前一个例子,也就是说,用一个函数,把0-17之间的年龄转换成一个键值,缺点是可能每一部分区间都不同,导致的函数也不尽相同
- 把键值转换提取成独立的子程序,现阶段已经有不少成熟的语言支持键值转换功能,例如Java中的HashMap,C#中的Dictionary
三,索引访问表,先从一个基本类型的数据从一张索引表中查处一个键值,然后再用这一键值查出你感兴趣的主数据
索引表访问技术有两个主要优点:首先,如果主查询表中的每一条记录都很大,那么创建一个浪费了很多空间的索引数组所用的空间,就要比创建一个浪费了很多空间的主查询表搜用的空间小的躲;二,操作位于索引中的记录有时也要比位于主表中的记录更方便更廉价- 表查询技术在可维护性上所具有的普遍优点,具体表现为,可以把借助索引访问数据的代码提取成单独的子程序,然后再希望通过物品编号获得表键值的时候调用该子程序,当需要修改表的时候,你可以考虑更换这种索引访问技术,或者换用另一种表查询的技术,非常方便
四,阶梯访问表,阶梯结构的基本想法是,表中的记录对于不同的数据范围(连续点)有效,而不是对不同的数据点(离散点)有效,这种访问法不像索引结构那样直接,但要节省空间
- 使用方法是,要把每一区间的上限写入一张表里,然后写一个循环,按照个区间的上限来检查分数。当分数第一次超过某个区间的上限时,你就知道相应的等级了
- 与其他表驱动法相比,这种方法的优点在于它很适合处理那些无规则的数据。并且可以享受到表驱动法所具有的一般优点,非常灵活且容易修改
使用的时候请注意一些细节:
- 留心端点,确认你已经考虑到每个阶梯区间的上界,所有意料之外的的项目放入单独一级,更要注意<和<=
- 考虑用二分查找取代顺序查找
- 考虑用索引访问来取代阶梯技术,阶梯查找比较耗时,如果速度非常重要,可以用索引访问来取代阶梯,用空间换时间,但也要分情况,因为离散空间是不能够完全替代连续空间的
- 把阶梯表查询操作提取成单独的子程序(同索引查询表)
Key Point:
- 表提供了一种复杂的逻辑和继承结构的替换方案。如果你发现自己对某个应用程序的逻辑或者继承树关系感到困惑,那么问问自己它能否可以通过一个查询表加以简化
- 使用表的一项关键技术是决定如何去访问表。你可以采取直接访问、索引访问或者阶梯访问
- 使用表的另一项关键决策是决定应该把什么内容放入表中
- 转自 http://blog.sina.com.cn/s/blog_5e3c2ad00101iozx.html