简而言之就是用查表的方 ,但可视为数据库的一种体1概念提出
简而言之就是用查表的方 ,但可视为数据库的一种体
未知的汉字就是典型的表驱动 一个索引值,并映射到对应的 ,部首检字法效率极高。所谓表驱 动法(Table-Driven Approach) 法获取数据。此处的“表”通常为数组 现。
未知的汉字就是典型的表驱动 一个索引值,并映射到对应的 ,部首检字法效率极高。
具体到编程方面,在数据不多时可用逻辑判断语句(if
具体到编程方面,在数据不多时可用逻辑判断语句(if…else或 )来获 取值;但随着数据的增多,逻辑语句会越来越长, 的优势就开始显现。
36进制(A表示10, B表示11,…)表示更大的数字,逻 下:
switch …case
此时表驱动法 例如,用 辑判断语句如
if(ucNum < 10) {
ucNumChar = Con vertToChar(ucNum); }
else if(ucNum == 10)
{ ucNumChar = 'A';
}
else if(ucNum == 11)
{ ucNumChar = 'B';
}
else if(ucNum == 12)
{ ucNumChar = C;
}
else if(ucNum == 35)
{
ucNumChar = 'Z';
当然也可 以用switch -case 结构,但实现都 很冗 长。而用 表驱动 法(将numChar存入数组)则非常直观和简洁。如:
CHAR aNumCharsQ = {'0', '1', '2', /*3~9*/'A', B, C, /*D~Y*/'Z'};
CHAR ucNumChar = aNumChars[ucNum % sizeof(aNumChars)];
像这样直接将变量当作下数组下标来读取数值的方法就是直接查 表法。
注意,如果熟悉字符串操作,则上述写法可以更简洁:
CHAR ucNumChar =
"0123456789ABCDEFGHIJKLM NOP QRSTUVWXYZ"[ucNum];
使用表驱动法时需要关注两个冋题:一■是如何查表,从表中读取 正确的数据;二是表里存放什么,如数值或函数指针。
1.1查表方式 常用的查表方式有直接查找、索引查找和分段查找等。
1.1.1直接查找
即直接通过数组下标获取到数据。如果熟悉哈希表的话,可以很 容易看出这种查表方式就是哈希表的直接访问法。
如获取星期名称,逻辑判断语句如下:
if(0 == ucDay)
{
p szDayName = "Sun day";
}
else if(1 == ucDay)
{
p szDayName = "Mon day";
}
else if(6 == ucDay)
{
p szDayName = "Saturday";
而实现同样的功能,可将这些数据存储到一个表里:
CHAR *p aNumCharsQ = {"S un day", "Mo nday", "Tuesday", "Wed nesday", "Thursday", "Friday", "Saturday"};
CHAR *p szDayName = paNumChars[ucDay];
类似哈希表特性,表驱动法适用于无需有序遍历数据,且数据量 大小可提前预测的情况。
对于过于复杂和庞大的判断,可将数据存为文件,需要时加载文 件初始化数组,从而在不修改程序的情况下调整里面的数值。
有时,访问之前需要先进行一次键值转换。如表驱动法表示端口 忙闲时,需将槽位端口号映射为全局编号。所生成的端口数目大小的 数组,其下标对应全局端口编号,元素值表示相应端口的忙闲状态。
索引查找
有时通过一次键值转换,依然无法把数据(如英文单词等)转为键 值。此时可将转换的对应关系写到一个索引表里,即索引访问。
如现有100件商品,4位编号,范围从0000到9999。此时只需要 申请一个长度为100的数组,且对应2位键值。但将4位的编号转换 为2位的键值,可能过于复杂或没有规律,最合适的方法是建立一个 保存该转换关系的索引表。采用索引访问既节省内存,又方便维护。 比如索引A表示通过名称访问,索引B表示通过编号访问。
分段查找
通过确定数据所处的范围确定分类(下标)。有的数据可分成若干 区间,即具有阶梯性,如分数等级。此时可将每个区间的上限(或下 限)存到一个表中,将对应的值存到另一表中,通过第一个表确定所处 的区段,再由区段下标在第二个表里读取相应数值。注意要留意端 点,可用二分法查找,另外可考虑通过索引方法来代替。
如根据分数查绩效等级:
#defi ne MAX_GRADE_LEVEL (INT8U)5
DOUBLE aRa ngeLimit[MAX_GRADE_LEVEL] =