数据压倒一切。如果选择了正确的数据结构并把一切组织的井井有条,正确的算法就不言自明。编程的核心是数据结构,而不是算法。
——Rob Pike
本文基于这样的认识:数据是易变的,逻辑是稳定的。
本文例举的编程实现多为代码片段,但不影响描述的完整性。
本文例举的编程虽然基于C语言,但其编程思想也适用于其他语言。
此外,本文不涉及语言相关的运行效率讨论。
1 概念提出
所谓表驱动法(Table-Driven Approach)简而言之就是用查表的方法获取数据。此处的“表”通常为数组,但可视为数据库的一种体现。
根据字典中的部首检字表查找读音未知的汉字就是典型的表驱动法,即以每个字的字形为依据,计算出一个索引值,并映射到对应的页数。相比一页一页地顺序翻字典查字,部首检字法效率极高。
具体到编程方面,在数据不多时可用逻辑判断语句(if…else或switch…case)来获取值;但随着数据的增多,逻辑语句会越来越长,此时表驱动法的优势就开始显现。
例如,用36进制(A表示10,B表示11,…)表示更大的数字,逻辑判断语句如下:
1 if(ucNum < 10) 2 { 3 ucNumChar = ConvertToChar(ucNum); 4 } 5 else if(ucNum == 10) 6 { 7 ucNumChar = 'A'; 8 } 9 else if(ucNum == 11) 10 { 11 ucNumChar = 'B'; 12 } 13 else if(ucNum == 12) 14 { 15 ucNumChar = 'C'; 16 } 17 //... ... 18 else if(ucNum == 35) 19 { 20 ucNumChar = 'Z'; 21 }