表驱动的认识以及用法——原创---非抄书

表驱动是什么:通过查找数据表来代替复杂的逻辑结构(如 if ... else ......, switch等);

表驱动的优点是: 1、 将编程的重心调整到解决问题上,而不是复杂的逻辑判断;
2、 增加了程序的灵活性,易添加,易修改;
3、数据驱动,如果将数据写入文件,每次启动时,从文件中读取,那么,如果要修改一些变量,可能直接修改数据文件,而不是去修改程序结构;

表驱动的三种方法:
1、直接驱动法: 你需要找什么,指定索引,就可以给你立即返回索引在表中对应的元素 或者动作;

                                               案例1:(一维查找:即可以代替一层的if结构或者switch结构):
                                               比如你要查找1--12月份每个月的天数,如下:
                                               month_day[12] = {31,30,29,30,30,31,31,31,30,30,31,30};
                                               return month_day[5];
                                               这样直接对应的就是5月的天数;
                                               直接驱动 是 指 索引 和 需要的得到的数据 或者动作是直接对应关系;

                                               案例2:(三维查找:即有三个条件同时限制,如果使用if  或者 switch 可能需要三层嵌套结构)

                                                比如一个路由景点,收费标准因 性别,是否学生,以及是否残疾 三项  共同决定门票的价格,那么,我们可以
                                                使用三维数据驱动表来代替 复杂的上层if 语句;

                                                 int entrance_ticket_fee[][][] =
                                                 {      { {0,10} , {0,15} }, { {0,15},{15,30} }      }
                                                 这是一个三维向量,三个维度分别代表了不同的限制,
                                                 第一维代表性别,索引 0代表女,1 代表男;
                                                 第二维代表是否是学生,索引 0代表是,索引 1 代表不是;
                                                 第三维代表是否是残疾, 索引 0代表残疾, 索引 1代表健康;
                                                 以上这个三维数组代表的是:
                                                 女孩,学生,残疾  0元
                                                 女孩 ,学生,健康 10元;
                                                 女孩, 非学生,残疾 0 元;
                                                 女孩, 非学生,非常急15元;

                                                 男孩,学生,残疾 0元;
                                                 男孩,学生,健康,15元;
                                                 男孩,非学生,残疾 15元;
                                                 男孩,非学生,健康,30元;

                                                 通过给定性别,是否是学生,是否残疾,来确定其返回值;
                                                 return entrance_ticket_fee[0][1][1]                   //15元;

                            2、索引驱动法:
                                              由于很多情况,有分段时,各段情况不一样,比如 按年龄来分,18岁以下和60岁以上的人 景区门票按照标准减一半,而 19 -- 59 之
                                               间的人,门票和年龄相对应,那么,如果还用直接索引法的话,对于0--18岁以下 和 60 岁以上,都对应一个数值,那么其实可以用
                                               一个索引来 代替,这样就节省了空间,这种转化通过函数来实现;
                                              索引驱动是对直接驱动法在节约空间方面的改进;

                           3、阶梯访问表:
                                             很多问题,并不需要一对一,而是要将其进行归类,简单的例子,比如说按成绩分类:
                                                    100 - 90 : A
                                                    89  - 80  : B
                                                    79 -- 60  : C
                                                    59 -- 0    : D
                                             给定一个数,判断其所在的范围,即可以云阶梯访问。

                                              阶梯访问是通过将要对比的数 (原数据) 和 各个区域的上限(或者下限)进行比较,可以选择顺序比较,也可以选择二分法之类的。

                                               阶梯访问是对 索引驱动法的在节约内存空间方面的再次改进                                                   

原文地址:http://blog.51cto.com/10901086/2060459

时间: 2024-12-20 17:46:06

表驱动的认识以及用法——原创---非抄书的相关文章

数据库中创建表(包括创建主键,外键,非空列,唯一)

创建表(包括创建主键,外键,非空列,唯一) - PROS - 博客园 http://www.cnblogs.com/CodingArt/articles/1621921.html **************** 创建主键(三种方法) **************** 创建学生表: 第一种: create table student (sno char(5) primary key,/*学号*/ /*可以直接指定主键*/ sname char(20) not null,/*姓名*/ ssex c

[lua]原来这才是表驱动的正确表达方式

曾经写了个很煞笔的脚本模拟switch..case语法形式.[lua]尝试一种Case语法糖 而今实际项目应用中突发,原来这才是正确的表驱动方式表达.如下所贴: function event_do( event ) -- event:string local handler ={} function handler.touchBegin() print("handler.touchBegin") end function handler.touchEnd() print("h

表驱动与工厂模式

关于表驱动 首次接触表驱动,还是在毕业不久之后.当时某部门经理给我们讲解重构,即<重构:改善既有代码的设计>一书中简化条件表达式部分,关于if语句的处理,将其替换为多态形式,例如说工厂模式.但是即使替换为工厂,switch或者if的判断依旧不能去除,那么有什么办法解决这个问题呢? 当时我还在研究STL源码,想到了traits编程技术,可以在编译期解决if的判断问题(虽然有这个想法,但是一直没有实现成功).各路大牛提出了不同的见解,大家基本上都同意一条:使用"表"来解决.当时

vertica从其他表迁移数据到新表(insert into 语句用法实例)

前面一篇开始学习solr的时候,做了个入门的示例http://blog.csdn.net/zjc/article/details/24414271 .虽然可以检索出内容,但总和想象的结果有差异--比如,检索"天龙"两个字,按常规理解,就应该只出来<天龙八部>才对,可是竟然也会把<倚天屠龙记>检出来.后来研究了一下,发现系统是这样处理的:无论是抽索引时还是分析检索词时,都把所有文字按单字拆开.这样,刚好<倚天屠龙记>里包含"天"和&

Tomcat内核之ASCII解码的表驱动模式

我们知道Tomcat通信是建立在Socket的基础上,而套接字在服务器端和客户端传递的报文都是未经过编码的字节流,每8位组成1个字节,计算机以二进制为基础,这是由于使用晶体管的开合状态表示1和0,这样8个电晶体管就可以组成一个字节,这正是应用层使用的最小单位--字节. 在通过Socket进行网络通信的程序中,假如我们在接收到报文时不知道通过什么编码才能正确解码,最好的办法就是用Socket最底层的输入装置读取字节流,在确认编码后再对这些字节流进行转码,否则产生解码错误.我们常见的编码有ASCII

USB的固件和驱动的最简单用法

1.利用Cypress提供的USB通用驱动程序CyUSB.sys and CyUSB.inf,是稳妥的做法,因为驱动程序的编程比较繁琐,可尽力规避.可简单修改sys文件名.inf文件中的ID码.inf文件中出现的sys文件的文件名: 2.在一个EZUSB固件工程中,一般只需要修改两个文件:Periph.c(用户调度函数,不同工程取名不同,如官方例程中的BulkLoop.c), DSCR.A51(USB描述符列表,通常是汇编语言编写的,读起来简单直接): 3.实际固件编程中一般只需要修改fw.c中

黑盒测试用例设计-判定表驱动方法

5.判定表驱动方法 前面因果图方法中已经用到了判定表.判定表是分析和表达多逻辑条件下执行不同操作的情况的工具.在程序设计中可作为编写程序的辅助工具.把复杂的逻辑关系和多种条件组合的情况表达得较明确. (1)   判定表结构 判定表通常由4部分组成,如下图所示: ·条件桩(condition stub):列出了问题的所有条件.通常认为列出的条件的次序无关. ·动作桩(action stub):列出了问题规定可能采取的操作.这些操作的排列顺序没有约束. ·条件项(condition):列出针对它所列

Table-Driven Design 表驱动设计

注:本文所有代码来自 http://www.codeproject.com/Articles/42732/Table-driven-Approach 在许多程序中,经常需要处理那些拥有种种色色不同特性的实体,最直接的思路是用case语句或者if-else语句处理这些不同的实体.然而,如果这类实体的数量若足够庞大,将会产生大量代码,臃肿并难以整理和维护. 先通过一对实例感受一下: // A text adventure game if(strcmpi(command, "north")

查询优化--小表驱动大表(In,Exists区别)

Mysql 系列文章主页 =============== 本文将以真实例子来讲解小表驱动大表(In,Exists区别) 1 准备数据 1.1 创建表.函数.存储过程 参照  这篇(调用函数和存储过程批量插入数据)  文章中的第 1-7 步,注意,不要执行第8步 1.2 插入数据 现在来执行第8步. 1.2.1 向 Department 表中插入 100 条记录 CALL insert_dept(1000, 100) 1.2.2 向 Employee 表中插入 100000 条记录 CALL in