En échangeant l'espace contre le temps, vous pourriez construire deux tableaux "booléens" indexés par temp->left->oper
y temp->left->oper
respectivement. Le tableau correspondant contient vrai lorsque la condition est remplie, faux autrement. Donc :
while (array1[temp->left->oper] || array1[temp->right->oper]) {
// do something
}
Comme les ensembles pour la gauche et la droite semblent identiques, un fera réellement.
L'initialisation se ferait comme suit :
static char array1[256]; // initialized to "all false"
...
array1['+'] = array1['-'] = array1['*'] = array1['/'] = '\001';
Similaire pour array2
. Comme les sauts sont mauvais pour les CPU modernes à pipelining, vous pourriez même utiliser une table plus grande comme celle-ci :
while (array1[temp->left->oper << 8 | temp->right->oper]) {
// do something
}
Mais l'initialisation est plus délicate :
static char array1[256 * 256]; // initialized to "all false"
...
void init(char c) {
for (unsigned char i = 0; i <= 255; ++i) {
array1[(c << 8) | i] = array1[(i << 8) | c] = '\001';
}
}
init('+');
init('-');
init('*');
init('/');
1 votes
Sans connaître les dépendances entre
temp->left
ytemp->right
vous ne pouvez pas optimiser dans tous les opérateurs égaux. Optiquement, vous pourriez utiliser des expressions régulières, mais en interne, c'est probablement à peu près la même chose, voire moins efficace.3 votes
Je serais intéressé de savoir pourquoi vous pensez avoir ce problème. Cela ressemble à l'interprétation d'un arbre d'expression au moment de l'exécution, et si c'est le cas, il existe de bien meilleures façons de le faire.