表驱动法

编译原理(第二章3--DFA最小化&双层case和表驱动法) 通过第二章2小节的介绍,我们已经实现了由正则表达式到NFA,NFA到DFA的转化。现在我们手里拿着DFA,下一步应该是构建程序了。确实如此,但是这里为什么要引入DFA最小化呢?这是因为前面我们通过子集法构建的DFA存在冗余的状态。举个例子,对于a* 来说,我们可以构建如下两个DFA:显然,我们更倾向于第二个状态更少的DFA,因为这样我们可以简化我们的程序(状态越多,程序就越会复杂)。因此我们给出最小化的定义如下:寻找一个状态数比M少的DFA M’,使得L(M)=L(M’) 阅读详情

表驱动的关键是,判断数据不放在if 里面 放在表中
需要解决两个问题:

怎样从表中查询数据

直接访问 --- 索引访问  --- 阶梯访问 

应该在表里面存储什么

直接访问

以下是每月天数的判断表,用一个二维数组就可解决。判断只需要一行daysPerMonths[isLeapYears][month-1]; 就可以回传天数,而无需写多个switch语句。

static int daysPerMonths[2][12] = {31,28,31,30,31,30,31,31,30,31,30,31,
                                   31,29,31,30,31,30,31,31,30,31,30,31,};
@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 12; j++)
            NSLog(@"daysPerMonths[%d][%d]=%d ",i ,j,daysPerMonths[i][j]);
    }
    int month = 2;
    bool isLeapYears = YES;
    int days = daysPerMonths[isLeapYears][month-1];
    NSLog(@"%d",days);
}

@end

保险费率问题
如果要考虑 三个因素 是否抽烟 男性女性 单身还是非单身

typedef enum : NSUInteger {
    SmokingStatusFirst = 0,
    SmokingStatusNonSSmoking = 0,
    SmokingStatusmoking = 1,
    SmokingStatusLast = 1,
} SmokingStatus;

typedef enum : NSUInteger {
    GenderFirst = 0,
    GenderMale = 0,
    GenderFemale = 1,
    GenderLast = 1,
} Gender;

typedef enum : NSUInteger {
    MaritalStatusFirst = 0,
    MaritalStatusSingle = 0,
    MaritalStatusMarried = 1,
    MaritalStatusLast = 1,
} MaritalStatus;

const NSInteger KMAXAGE  = 125;

a,b,c 分别代表三种情况的税率。可以算出税费
double rate = a(i+1)*b(j+1)*c(k+1);
遍历出全部的税费
int rates[2][2][2];
void func(int I,int J,int K) {
    for (int i = 0; i < I; i++) {
        for (int j = 0; j < J; j++){
            for (int k = 0; k < K; k++){
                rates[i][j][k] = (i+1)*(j+1)*(k+1);
                NSLog(@"%d",rates[i][j][k]);
            }
        }

    }
}

这里并没有用到表结构,可能文章认为多个枚举就是表结构吧。

让我疑惑的是,表驱动法的表的建立是要遍历的,什么时候遍历,遍历多少次,枚举变更了怎么办,因为很有可能后期增加新的枚举数值。这样还是需要计算很多回的,只是读取的时候方便了。但书籍中并没有给出详细的代码。所以目前就先考虑到这里。

C语言表驱动法 最近了解到一种C语言的写法,故记录下来,内容来自deepseek。 阅读详情

相关推荐

CRC8/CRC16/CRC32常见几个标准的算法及C语言实现

用表驱动法来实现CRC8、CRC16、CRC32的数据校验,程序简洁,通俗易懂

表驱动优化if-else[c++]

一、表驱动是什么? 表驱动是一种编程模式,是一种将输入变量作为索引在表里查找直接的结果或者处理函数,而不是用很多的逻辑语句来进行判断(比如if-sle||switch_case).索引表可以是个数组、map或者其他高效率查找的数据结构。 二、表驱动实现方式 下面通过加减乘除来实现一个简易计算器,先用未优化的switch-case来实现: #include <iostream> #include <time.h> int add(int a, int b) { retur

吾志所往,所向披靡 1846

基于表驱动法的三种实现方法

表驱动法分为直接访问,索引访问,阶梯访问三种方式,分别对应相应代码,代码里有详细注释

遇到大量if记住下面的口诀

互斥条件表驱动 嵌套条件校验链 短路条件早return 零散条件可组合

whk_15502266662的博客 1077

别再死记硬背公式了!用ADS手把手教你仿真一个4GHz镜像抑制混频器(附完整工程文件)

本文详细介绍了使用Keysight ADS软件设计和仿真4GHz镜像抑制混频器的完整流程。从理论分析到实际工程实现,涵盖分支线耦合器设计、二极管建模、噪声系数仿真及性能优化等关键步骤,帮助工程师摆脱公式死记硬背,掌握实用的射频电路设计技能。附完整工程文件,可直接应用于实际项目开发。

weixin_28683391的博客 498

FPGA高速接口Aurora8B/10B协议实战:从IP核配置到数据流优化

本文详细介绍了FPGA高速接口Aurora8B/10B协议的实战应用,从IP核配置到数据流优化的全流程。通过Aurora8B/10B协议,开发者可以在FPGA间实现高效的数据传输,适用于高速接口设计。文章涵盖了协议基础、IP核配置、AXI4-Stream接口实战技巧以及性能优化策略,帮助读者快速掌握这一关键技术。

weixin_29280657的博客 269

【转】优化代码中大量的if/else,你有什么方案?

转载自知乎作者XNan的回答,原问题:优化代码中大量的if/else,你有什么方案?,如有侵权,请联系我删掉 遇到大量if记住下面的口诀: 互斥条件表驱动 嵌套条件校验链 短路条件早return 零散条件可组合 互斥条件,表示几个条件之间是冲突的,不可能同时达成的。比如说一个数字,它不可能同时是4和2。在这种情况下用表驱动就非常合适,表驱动的核心是key-handler,拿某个key去对...

makesomethings的博客 661

关于动态存储器dram中rank,bank,device之间的关系

DEVICE_WIDTH表示设备的带宽(单位bit),每个列(column)包含DEVICE_WIDTH 位(bit),每一行(row)包含NUM_COLS个column。   而每一个bank包含NUM_ROWS个行(row)。所以一个设备(device)的存储容量为PER_DEVICE_STORAGE =NUM_ROWS*NUM_COLS*DEVICE_WIDTH*NUM_BANKS (i

wyj7260的专栏 4733

如何写出更优雅的条件判断

在我们平时的开发中,if else是最常用的条件判断语句。在一些简单的场景下,if else用起来很爽,但是在稍微复杂一点儿的逻辑中,大量的if else就会让别人看的一脸蒙逼。如果别人要修改或者新增一个条件,那就要在这个上面继续增加条件。这样恶性循环下去,原本只有几个if else最后就有可能变成十几个,甚至几十个。别说不可能,我就见过有人在React组件里面用了大量的if else,可读性和可...

weixin_33969116的博客 1433

ZYNQ:【1】深入理解PS端的TTC定时器(Part1:原理+官方案例讲解)

基于UG585详细讲解其中TTC的原理和使用案例。

Alex的技术博客 7889

使用Python爬虫抓取旅游景点评价数据并进行热度可视化

景点热度通常由景点的评分、评论数以及游客的热情度来决定。高热度的景点通常意味着更高的游客评分和更多的游客评论。热度不仅反映了景点的受欢迎程度,还可以揭示某些景点的潜力和存在的问题。评分:游客对景点的综合评分,通常是0到5分。评论数:景点的评论数量,反映了游客对景点的关注程度。热度变化:在一定时间内,景点的评价和评论数量变化,能够反映景点的热度波动。通过使用Python爬虫技术抓取旅游景点的评价和评论数据,我们能够深入分析景点的热度,并通过数据可视化工具将这些信息展示给用户。

2201_76125261的博客 1282

表驱动法在STM32中的应用

所谓表驱动法(Table-Driven Approach)简而言之就是用查表的方法获取数据。此处的“表”通常为数组,但可视为数据库的一种体现。根据字典中的部首检字表查找读音未知的汉字就是典型的表驱动法,即以每个字的字形为依据,计算出一个索引值,并映射到对应的页数。相比一页一页地顺序翻字典查字,部首检字法效率极高。具体到编程方面,在数据不多时可用逻辑判断语句(if…else或switch…case)来获取值;但随着数据的增多,逻辑语句会越来越长,此时表驱动法的优势就开始显现。

人生一路,点滴记录 3833

基于RAG(Retrieval Augmented Generation)架构的简单问答系统的Python实现示例

以下是一个基于RAG(Retrieval Augmented Generation)架构的简单问答系统的Python实现示例。这个系统使用langchain库进行文档处理、检索,以及与大语言模型交互。

max500600的博客 743

一种表驱动法解析URC消息的实现

  看完我昨天发的博客的朋友应该了解了几种接收模块响应的方法,如果没看过,可以点击分享几个单片机接收AT指令响应数据的方法先查看下。 前言   今天我要分享一种单片机中分离URC数据的方法,和上文废话连篇不同的是,这次全篇干货哦!   文章涉及到的表驱动法,可以说是本次的精髓,这里不对表驱动法做过多解释,有兴趣的朋友可以自行查阅下相关资料,我这里只是用它实现个功能罢了,这个设计方法真的很香。   在表驱动法中还带有URC之间的粘包处理和命令回复与URC之间的粘包处理。   为什么要做这个呢?主要是因为,之.

qq_33181655的博客 6629

canoe安装完成开启之后因为VectorDeviceParams30_64.dll报错崩溃打不开...如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值。

**My Coding Family** 1083

元数据治理实战:构建企业数据地图与血缘体系

元数据(Metadata)是描述数据的数据,是你能了解“数据是怎么来的”、“它是做什么的”、“能不能用”的基础信息。📌 举个例子:order_idstringods_order定义:平台内用户在订单系统中产生的唯一订单编号更新时间:每天凌晨 2 点,由 Airflow 调度任务生成所属人:张三(数据开发部)🔍 这些信息本身不直接参与计算,但它们是数据可管理、可追踪、可评估的基础。模块实战建议元数据类型技术 + 业务 + 操作元数据三类统一治理治理路径。

晴天彩虹雨的博客 291

C++的表驱动法

C++的表驱动法 目的:使用表驱动法,替换复杂的if/else和switch/case语句。  一、常用示例  以switch为例,常用示例如下: Funcition() { switch (key) { case key1: statements 1; break;

zhouyulu的工作历史 7427

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

C语言表驱动法编程实践

转自 http://www.cnblogs.com/clover-toeic/p/3730362.html 数据压倒一切。如果选择了正确的数据结构并把一切组织的井井有条,正确的算法就不言自明。编程的核心是数据结构,而不是算法。 ——Rob Pike  说明      本文基于这样的认识:数据是易变的,逻辑是稳定的。      本文例举的编程实现多为代码片段

flexman09的专栏 4454

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

表驱动法的理解

前言       为什么想写这篇关于表驱动文章呢?在看到《C标准库》第二章关于的实现后,才很大程度上体会到了什么才是表驱动,对它有了稍微深入的理解,写下文章与大家交流交流,望大家赐教。 什么是表驱动法      按照《代码大全》的说法,“表驱动法是一种编程模式——从表里

3119

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

一文讲懂表驱动法

什么是表驱动法?是一种编程模式,从表里查找信息而不使用逻辑语句(if 和case)。事实上,凡是能通过逻辑语句来选择的事物,都可以通过查表来选择。对简单的情况而言,使用逻辑语句更为容易和...

架构精进之路 3404

java代码简单描述表驱动法

什么叫表驱动法 表驱动法,又称之为表驱动、表驱动方法。 “表”是几乎所有数据结构课本都要讨论的非常有用的数据结构。表驱动方法出于特定的目的来使用表,程序员们经常谈到“表驱动”方法,但是课本中却从未提到过什么是"表驱动"方法。表驱动方法是一种使你可以在表中查找信息,而不必用很多的逻辑语句(if或Case)来把它们找出来的方法。 数据用法 假设你需要一个可以返回每个月中天数的函数(为简单起见不考虑...

weixin_41618475的博客 1895

代码大全 表驱动法

表驱动法是一种编程模式(scheme)-从表里查找信息而不使用逻辑语句(if和case)。对简单的情况而言,使用逻辑语句更为容易和直白。但随着逻辑链的越来越复杂,查表法也就愈发显得更具吸引力   一,表驱动法使用总则 使用表驱动法的两个问题: 如何在表中查询条目(1)直接访问(2)索引访问(3)阶梯访问 在表里存些什么,可以是查询出来的结果数据,可以是保存一个描述该动作的代码,可以是

bigbigtree 1362

表驱动法(Table-Driven Approach)

一个简单的小例子: 《CodeComplete》中定义:从表里面查找信息而不使用if、else等逻辑语句的编程模式。使用表驱动法,生成代码比复杂逻辑代码更简单更容易修改。比如计算每个月中的天数的js(修改自《CodeComplete》中的VB代码):switch(month){case 1,3,5,7,8,10,12:day=31;break;case 4,6,9,11:day=30;br

小猪的成长专栏 2617
上一篇: QMUI / QMUI_iOS框架学习(五)
下一篇: 阿里云服务器初次使用
csdn_Damon
博客等级 码龄11年 37粉丝 143原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值