跳转到内容

多路分支

本页使用了标题或全文手工转换
维基百科,自由的百科全书

多路分支(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 */

(考慮後者程式的簡潔,可以將程式用内联函数方式實現,因為呼叫函式的開銷,比有索引的查找表本身還大。)

引文

[编辑]

多路分支是重要的程式設計技巧,也是太常被沒有效率的if指令代替的技巧,彼得·諾爾最近寫信給我,他提到用表格方式來控制程式流程,是計算機科學的基本概念,幾乎已被人遺忘了,但他預期,此概念某天就會被人再度發現。這是我所研究最好的編譯器中,其效率的關鍵

——高德纳,Structured Programming with go to Statements

相關條目

[编辑]

參考資料

[编辑]
  1. ^ Archived copy (PDF). [2009-11-18]. (原始内容 (PDF)存档于2012-02-27). 
  2. ^ "A Superoptimizer Analysis of Multiway Branch Code Generation" by Roger Anthony Sayle

外部連結

[编辑]