热门问题
时间线
聊天
视角

多路分支

来自维基百科,自由的百科全书

Remove ads

多路分支(Multiway branch)是依照一些事先规划的准则来变更控制流程,变更后的选择不止两个。多路分支是条件指令的一种。若要从多个标记选择一个,转移流程控制,多路分支多半是算法效率最高的方法,尤其是已事先从原始资料英语raw data中决定索引值,以此决定流程控制的情形。

分支表switch指令英语Switch statement多分派都是多路分支的例子。

分支表

多路分支可以用有效率,配合索引进行的查找表进行(用资料本身当数组索引,或是用某个从资料计算出来的值当索引),这也是常见实现多路分支的作法[1]

...switch指令的实现袲通常会等于多路分支。不过,在许多现实程式中使用的switch指令,可以避免分支指令,将switch指令改为一个或多个的查找表。例如 Has30Days范例[在前面曾展示过]可以用以下的方式实现:[C语言范例]

[2]

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;
}

也可以用索引映射英语index mapping的查找表,改为以下程式

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

相关条目

参考资料

外部链接

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.

Remove ads