热门问题
时间线
聊天
视角
多路分支
来自维基百科,自由的百科全书
Remove ads
多路分支(Multiway branch)是依照一些事先规划的准则来变更控制流程,变更后的选择不止两个。多路分支是条件指令的一种。若要从多个标记选择一个,转移流程控制,多路分支多半是算法效率最高的方法,尤其是已事先从原始资料中决定索引值,以此决定流程控制的情形。
分支表
多路分支可以用有效率,配合索引进行的查找表进行(用资料本身当数组索引,或是用某个从资料计算出来的值当索引),这也是常见实现多路分支的作法[1]
...switch指令的实现袲通常会等于多路分支。不过,在许多现实程式中使用的switch指令,可以避免分支指令,将switch指令改为一个或多个的查找表。例如
Has30Days
范例[在前面曾展示过]可以用以下的方式实现:[C语言范例]
switch (x) { /* x is month no */
case 4: /* April */
case 6: /* June */
case 9: /* September */
case 11: /* November */
return true;
}
可以用“安全杂凑”(safe-hashing)的技巧,取代为以下的程式
unsigned int t = x | 2;
switch (t) {
case 6:
case 11:
return true;
}
也可以用索引映射的查找表,改为以下程式
x %= 12; /* to ensure x is in range 0-11*/
static const int T[12] = {0,0,0,0,1,0,1,0,0,1,0,1}; /* 0-based table 'if 30 days =1,else 0' */
return T[x]; /* return with boolean 1 = true, 0=false */
(考虑后者程式的简洁,可以将程式用内联函数方式实现,因为呼叫函式的开销,比有索引的查找表本身还大。)
Remove ads
引文
多路分支是重要的程式设计技巧,也是太常被没有效率的if指令代替的技巧,彼得·诺尔最近写信给我,他提到用表格方式来控制程式流程,是计算机科学的基本概念,几乎已被人遗忘了,但他预期,此概念某天就会被人再度发现。这是我所研究最好的编译器中,其效率的关键
——高德纳,Structured Programming with go to Statements
相关条目
参考资料
外部链接
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads