La bifurcación multidireccional es el cambio en el flujo de control de un programa en función de un valor que coincida con un criterio seleccionado. Es una forma de declaración condicional . Una bifurcación multidireccional suele ser el método más eficiente para pasar el control a una de las etiquetas de un conjunto de programas , especialmente si se ha creado un índice de antemano a partir de los datos sin procesar .
Ejemplos
- Mesa de sucursales
- Sentencia Switch : consulte también las alternativas a continuación
- Despacho múltiple : donde se invoca una subrutina y se realiza un retorno
Alternativas
Una rama multidireccional puede, frecuentemente, ser reemplazada con una búsqueda eficiente en una tabla indexada (usando el valor de los datos en sí o una derivada calculada del valor de los datos, como el índice de una matriz ) [1].
" ...la implementación de una sentencia switch se ha equiparado a la de una ramificación multidireccional. Sin embargo, para muchos usos de la sentencia switch en código real, es posible evitar la ramificación por completo y reemplazar la sentencia switch con una o más consultas de tabla. Por ejemplo, el
Has30Daysejemplo [presentado anteriormente] se puede implementar de la siguiente manera: [Ejemplo en C]"
"Un análisis de superoptimización de la generación de códigos de ramificación multidireccional" por Roger Anthony Sayle
switch ( x ) { /* x es el número de mes */ caso 4 : /* abril */ caso 6 : /* junio */ caso 9 : /* septiembre */ caso 11 : /* noviembre */ return true ; }
se puede reemplazar, utilizando una técnica de "hashing seguro", con -
entero sin signo t = x | 2 ; switch ( t ) { caso 6 : caso 11 : devuelve verdadero ; }
o puede reemplazarse, mediante una búsqueda en la tabla de mapeo de índice , con -
x %= 12 ; /* para garantizar que x esté en el rango 0-11*/ static const int T [ 12 ] = { 0 , 0 , 0 , 0 , 1 , 0 , 1 , 0 , 0 , 1 , 0 , 1 }; /* tabla basada en 0 'si 30 días = 1, de lo contrario 0' */ return T [ x ]; /* retorno con booleano 1 = verdadero, 0 = falso */
(en vista de la simplicidad del último caso, sería preferible implementarlo en línea, ya que la sobrecarga de usar una llamada de función puede ser mayor que la búsqueda indexada en sí).
Citas
La ramificación multidireccional es una técnica de programación importante que, con demasiada frecuencia, se sustituye por una secuencia ineficiente de pruebas if. Peter Naur me escribió recientemente que considera el uso de tablas para controlar el flujo del programa como una idea básica de la informática que casi se ha olvidado, pero que espera que esté lista para ser redescubierta en cualquier momento. Es la clave de la eficiencia en todos los mejores compiladores que he estudiado.
— Donald Knuth , Programación estructurada con instrucciones go to
Véase también
Referencias
- ^ "Copia archivada" (PDF) . Archivado desde el original (PDF) el 27 de febrero de 2012. Consultado el 18 de noviembre de 2009 .
{{cite web}}: CS1 maint: copia archivada como título ( enlace )
Enlaces externos
- Codificación de ramas multidireccionales mediante funciones hash personalizadas por HG Dietz
- Aprendiendo Python por Mark Lutz
- Programación en C++ Por Nell B. Dale, Chip Weems
- Análisis de superoptimizador de la generación de códigos de ramificación multidireccional por Roger Anthony Sayle