洪流学堂,让你快人几步。
本篇内容来自洪流读书会解读书籍《代码大全2》。

很多面试官喜欢问这样的问题,如何解决大量的if语句或switch case语句?如果你仅仅在优化的层面回答,可能不能让面试官满意。

那怎么回答更好呢?

表驱动法

在这种情况下可以使用表驱动法

表驱动法是一种编程模式(scheme)一从表里面查找信息而不使用逻辑语句(if和case)。事实上,凡是能通过逻辑语句来选择的事物,都可以通过查表来选择。对简单的情况而言,使用逻辑语句更为容易和直白。但随着逻辑链的越来越复杂,查表法也就愈发显得更具吸引力。

在适当的环境下,采用表驱动法,所生成的代码会比复杂的逻辑代码更简单、更容易修改,而且效率更高。假设你希望把字符划分成字母、标点符号和数字三类,那么你也许会用到下面这种复杂的逻辑链:

另一方面,如果用一个查询表(ookup table),就可以把每一个字符的类型保存在一个用字符编码访问的数组里。那么上述的复杂代码片段就可以替换为:

这段代码假设charTypeTable数组已经提前创建好了。这时你把程序中的信息存放在数据里而不是逻辑里一也就是说,放在表中而不是if检测中。

使用表驱动法必须要解决的两个问题

1、你必须要回答怎样从表中查询条目的问题

你可以用一些数据来直接访问表。比如说,如果你希望把数据按月进行分类,那么创建一个月份表是非常直截了当的。你可以用一个下标从1到12的数组实现它。

另一些数据可能很难直接用于查表。例如,假设你希望按照社会安全号码做数据分类,那么除非你可以承受在表里面存放99-99999条记录,否则就不能用社会安全号码直接查表。你会被迫采用一种更为复杂的方法。下面是从表里面查询记录的方法列表

  • 直接访问(Direct access)。比如保险费率表,游戏中常用的数据表等等。可以直接通过一个值,比如说保险费率表中的年龄,找到对应的数据。
  • 索引访问(Indexed access)。有的时候,只用一个简单的数学运算还无法把age这样的数据转换成为表键值。这类情况中的一部分可以通过使用索引访问的方法加以解决。当你使用索引的时候,先用一个基本类型的数据从一张索引表中 查出一个键值,然后再用这一键值查出你感兴趣的主数据。比如游戏中需要根据玩家的职业、等级等来确定获得的奖励,就可以通过索引转换的方式。
  • 阶梯访问(Stair-step access)。还有另外一种访问表的方法,那就是阶梯访问。这种访问方法不像索引结构那样直接,但是它要比索引访问方法节省空间。阶梯结构的基本想法是,表中的记录对于不同的数据范围有效,而不是对不同的数据点有效。最常见的就是评分系统,可能需要根据不同的得分范围来获得最终的得分。

2、你应该在表里面存些什么

有的时候,表查询出来的结果是数据。如果你遇到的是这种情况,那么就可以把这些数据保存到表里面。在另外一些情况下,表查询出来的结果是动作(action)。在这种情况下,你可以保存一个描述该动作的代码,或者,在有些语言里,你可以保存对实现该动作的子程序的引用。无论是哪一种情况,表都会变得更为复杂。

扩展阅读

【扩展学习】在洪流学堂公众号回复读书会可以阅读本系列所有文章


我是大智(vx:zhz11235),你的技术探路者,下次见!

别走!点赞收藏哦!

好,你可以走了。

如何解决大量的if语句或switch case语句?相关推荐

  1. c语言 case语句用法,switch ... case语句的用法[组图]

    switch ... case语句的用法[组图] 08-13栏目:技术 TAG:switch case语句 switch case语句 当情况大于或等于4种的时候就用switch ...  case语 ...

  2. c语言 case语句用法,switch case语句的用法

    switch语句是多分支选择语句,用于基于不同的条件来执行不同的动作.下面讲解switch case语句的具体用法. Switch作为选择结构中必不可少的语句也被加入到了Swift中,只要有编程经验的 ...

  3. php case 多个条件判断语句,PHP switch case语句

    PHP 中的条件控制语句有两个,一个是 if else 语句,另一个是 switch case 语句.上节讲解了 if else,本节接着讲解 switch case 语句. switch 语句类似具 ...

  4. switch case语句的用法

    switch case语句的用法 我们首先来看一下switch case 语句的一般形式是怎样的 switch(表达式){case 常量1 :代码块:break:case 常量2:代码块:break: ...

  5. java switch case语句_在Java中使用switch Case语句的例子

    当我们有多个选项,并且需要为每个选项执行不同的任务时,就需要使用Switch case语句. Switch case语句的语法如下-switch (variable or an integer exp ...

  6. 在C++中对字符串std::string使用switch/case语句

    如果你使用C语音的string,也就是char *,是可以放在switch/case语句中的. 在C++中是不能对字符串string使用switch/case语句的,这里的string指的是std:: ...

  7. c语言case怎么输入字母,如何使用switch case语句将字母转换为数字

    我正在制作黑色插口游戏,并且需要使用switch case语句将A转换为11,将T,Q,J和K转换为10,但是我不确定如何执行代码.有人会帮助我解决这个问题吗?如何使用switch case语句将字母 ...

  8. C语言switch case语句详解

    当分支比较少的时候我们使用if else语句解决,当分支比较多的时候,我们要使用switch case语句解决,针对分支的复杂性选择合适的程序解决. 当分支过多时,用 if else 处理会不太方便, ...

  9. C语言case次数有限制吗,用switch...case语句统计数字、空格和其他字符出现的次数...

    //用switch...case语句统计数字.空格和其他字符出现的次数 //转自K&R #include int main(void) { int c, i, nwhite, nother, ...

最新文章

  1. Python matplotlib 绘制量场图
  2. 刚刚,我国智能科学技术最高奖揭晓!
  3. Activity应用场景解析
  4. Magic Leap大举进军AR医疗:新品率先与医疗机构合作,挖走HoloLens老客户
  5. wsl(windows上运行linux)安装到非C盘解决方案
  6. 2020 阿里云原生实战峰会即将开幕 云原生落地的正确姿势
  7. tomcat 设置java内存_Tomcat 设置JVM内存大小
  8. 数列分块入门 7(LibreOj-6283)
  9. MyCat分布式数据库集群架构工作笔记0010---高可用_Mycat主--从复制配置下
  10. 常用的php.ini 配置选项
  11. 智能优化算法(源码)-飞蛾扑火优化算法(MFO)
  12. word-break: break-all与word-wrap:break-word的区别
  13. 计算机毕业论文工作进展情况,论文中期检查进展怎么写_论文中期检查表怎么写_论文进展情况怎么写...
  14. app消息推送的详细实现教程
  15. test failed: The forked VM terminated without saying properly goodbye. VM crash or System.exit
  16. 图像处理: 可见光波长(wavelength)与RGB之间的转换
  17. AOP切面之实现计算器加减乘除--基于注解的方式
  18. win10.10 激活
  19. html写文章发布,写文章.html
  20. python学习--mysql

热门文章

  1. java 11_Java 11 正式发布!8年免费使用!
  2. vector 结构体排序_指下码上横戈行——排序
  3. android json.out,Android 之 json数据的解析(jsonReader)
  4. MATLAB点击运行并计时没反应,MATLAB计时器对象陷阱和不良用法
  5. python urlretrieve_使用urllib库的urlretrieve()方法下载网络文件到本地的方法
  6. 如何销毁一个实例化对象_基于脚本的游戏对象系统(1) 实例化、组件及生命周期...
  7. 形式多样!APP引导页设计灵感
  8. 设计灵感|简约复古风格海报设计这样玩
  9. 2020年的UI设计师需要会什么软件
  10. elasticsearch最大节点数_ElasticSearch读写底层原理及性能调优