Algoritme shunting yard
El algoritme shunting yard és un método per a analisar (parsing) les equacions matemàtiques especificades en la notació de infijo. En una forma senzilla d'entendre, si tens una equació matemàtica escrita de la forma tradicional, com "3 + 4 * (2 - 1)", l'algoritme "shunting yard" és com un organisador que pren eixa equació i la reordena per a que una computadora puga entendre-la i resoldre-la fàcilment (al final de l'algoritme tindria una eixida com esta: 3 4 2 * 1 5 - 2 ^ / +). Ho fa utilisant una espècie de "pila" per a guardar temporalment les operacions (com +, -, *, /) i després les organisa en un orde diferent, ya siga en un format cridat "notació polaca inversa" (RPN) o en una estructura d'arbre (arbre de sintaxis abstracta) que representa l'equació. l'algoritme va ser inventat per Edsger Dijkstra i va nomenar com a algoritme "shunting yard" (pati de classificació) perque la seua operació s'assembla al d'un pati de classificació del ferrocarril.[1][2][3]
De la mateixa manera que la forma en que les calculadores evaluen les expressions en notació polaca inversa (RPN), l'algoritme 'shunting yard' utilisa una 'pila', que és com una torre a on pots apilar coses i solament pots traure la que està dalt. Les expressions en infijo, com '3 + 4' o '3 + 4 * (2 - 1)', són la forma en que la majoria de nosatres escrivim les equacions. Per a transformar estes equacions, l'algoritme utilisa dos 'caixes' de text: una per a l'equació original (l'entrada) i una atra per a l'equació reordenada (l'eixida). També té una 'pila' a on guarda temporalment els símbols d'operació (com +, -, *, /) abans de colocar-los en la 'caixa' d'eixida. L'algoritme llig cada símbol de l'equació un per un i decidix qué fer en ell.
Una conversió senzilla
[editar | editar còdic]Entrada: 3+4
- Agregue 3 a la coa d'eixida (sempre que un número és llegit és agregat a l'eixida)
- Espente (push) l'operador + (o el seu ID) sobre el stack d'operadors
- Agregue 4 a la coa d'eixida
- Despuix de terminar de llegir l'expressió, retire (pop) tots els operadors que es troben en el stack i agregue'ls a l'eixida (en este cas solament hi ha un, "+")
Eixida: 3 4 +
Açò mostra ya un parell de regles:
- Tots els números són agregats a l'eixida al moment en que són llegits.
- Al final de la llectura de l'expressió, es retira del stack (pop) a tots els operadors que hagueren i es posen en la coa d'eixida.
Per a analisar la complexitat de temps d'eixecució d'este algoritme, un solament té que notar que cada token serà llegit solament una volta, cada número, funció, o operador serà imprés solament una volta, i cada funció, operador o paréntesis serà posat (push) en la pila i retirat (pop) de la pila solament una sola volta - per lo tant, hi ha com a molt un número constant d'operacions eixecutades per token, i el temps d'eixecució és aixina O(n) - llineal al tamany de l'entrada.
Eixemple detallat
[editar | editar còdic]| Operador | Precedència | Asociatividad |
|---|---|---|
| ^ | 4 | de dreta a esquerra |
| * | 3 | d'esquerra a dreta |
| / | 3 | d'esquerra a dreta |
| + | 2 | d'esquerra a dreta |
| - | 2 | d'esquerra a dreta |
| Token | Acció | Eixida (en RPN) | Stack d'operadors | Notes |
|---|---|---|---|---|
| 3 | agrega token a l'eixida | 3 | ||
| + | Push token al stack | 3 | + | |
| 4 | agrega token a l'eixida | 3 4 | + | |
| * | Push token al stack | 3 4 | * + | * té major precedència que + |
| 2 | agrega token a l'eixida | 3 4 2 | * + | |
| / | Pop stack a l'eixida | 3 4 2 * | + | / i * tenen la mateixa precedència |
| Push token al stack | 3 4 2 * | / + | / té major precedència que + | |
| ( | Push token al stack | 3 4 2 * | ( / + | |
| 1 | agrega token a l'eixida | 3 4 2 * 1 | ( / + | |
| - | Push token al stack | 3 4 2 * 1 | - ( / + | |
| 5 | agrega token a l'eixida | 3 4 2 * 1 5 | - ( / + | |
| ) | Pop stack a l'eixida | 3 4 2 * 1 5 - | ( / + | Repetix fins que siga trobat "(" |
| Pop stack | 3 4 2 * 1 5 - | / + | Descarta paréntesis emparellats | |
| ^ | Push token al stack | 3 4 2 * 1 5 - | ^ / + | ^ té major precedència que / |
| 2 | agrega token a l'eixida | 3 4 2 * 1 5 - 2 | ^ / + | |
| ^ | Push token al stack | 3 4 2 * 1 5 - 2 | ^ ^ / + | ^ és evaluat de dreta a esquerra |
| 3 | agrega token a l'eixida | 3 4 2 * 1 5 - 2 3 | ^ ^ / + | |
| end | Pop tot el stack a l'eixida | 3 4 2 * 1 5 - 2 3 ^ ^ / + |
Si s'estiguera desenrollant un intérpret d'un llenguage de programació, l'eixida de l'algoritme "shunting yard" (ya siga en notació RPN o en un arbre de sintaxis abstracta) se sometria a un procés de tokenización i s'escriuria en un archiu compilado, llest per a la seua posterior eixecució. Adicionalment, la conversió d'expressions de infijo a RPN facilita la simplificació de dites expressions. Este procés de simplificació pot implementar-se simulant la resolució de l'expressió en RPN. No obstant, quan es troba una variable el valor de la qual és desconegut (nul), o quan un operador té un operant en valor nul, tant l'operador com els seus operants s'escriuen en l'eixida. És important destacar que este método representa una simplificació i pot presentar llimitacions quan els operants són, a la seua volta, operadors. En essència, esta tècnica constituïx una optimisació similar al plegament de constant, encara que no comprén totes les simplificació possibles
Vore també
[editar | editar còdic]Referències
[editar | editar còdic]- ↑ «L'algoritme de la plaja d'agulles». El manantial de bits. Consultat el 2025-02-22.
- ↑ «Shunting Yard Algorithm | Brilliant Math & Science Wiki» (en en-us). brilliant.org. Consultat el 2025-02-22.
- ↑ «Lab 3 (RDP)».
Referències
[editar | editar còdic]
- Este artícul conté una traducció derivada de «Algoritmo shunting yard» de Wikipedia en castellà publicada baix la Llicència de documentació lliure de GNU i la Llicència Creative Commons Reconeiximent-CompartirIgual 4.0 Internacional.