Deux piles peuvent être mises en œuvre efficacement en utilisant un tableau de taille fixe: la pile # 1 commence à partir de l'extrémité gauche et croît vers la droite, et la pile # 2 commence à partir de l'extrémité droite et croît vers la gauche. Est-ce la même chose possible pour trois piles?
Plus précisément, est-il possible d'implémenter trois piles dans les conditions suivantes:
- Vous disposez d'un tableau de taille fixe pouvant contenir N objets.
- Tant que la somme des trois tailles de pile est <N, push () ne devrait pas échouer.
- Les opérations push () et pop () devraient prendre O (1).
- En plus du tableau, vous ne pouvez utiliser que O (1) d'espace supplémentaire.
Voici des exemples de solutions qui ne répondent pas à ces exigences:
- Diviser le tableau en 3 parties fixes et utiliser chaque partie pour une pile (viole 2).
- Similaire à ce qui précède mais avec des limites mobiles entre les piles (viole 3).
- Implémentations simples basées sur des listes chaînées (viole 4).
J'accepte des algorithmes non triviaux ou des preuves d'impossibilité même s'ils ne remplissent pas toutes les conditions (1) - (4) exactement, par exemple, un algorithme où push / pop prend O (1) en temps amorti, ou où le la mémoire supplémentaire est inférieure à O (N), par exemple O (log N). Ou une preuve d'impossibilité qui montre que par exemple, l'accès à moins de 5 éléments du tableau par push / pop est impossible.
la source
Réponses:
la source
Soit N la longueur du tableau sous-jacent. Je peux imaginer les piles comme des listes liées de gros morceaux, de sorte que le nombre total de morceaux ne dépasse pas O (log2 (N)). Placez la troisième pile entre les deux premières, à l'indice de N / 2. Nous avons donc 3 zones occupées et 2 libres. Lorsqu'une pile ne peut pas accepter l'élément suivant, cela signifie qu'une zone libre est épuisée. Si l'autre aussi est épuisé, alors toute la mémoire est épuisée. Sinon, il existe une autre zone libre dont la taille ne dépasse pas N / 2. Continuez la pile débordée dans cette zone libre. de sorte que toute la configuration ressemble à la disposition initiale des piles. Puisque la mémoire libre ne représente plus que la moitié de la valeur initiale, il n'y aura plus que log2 (N) de telles opérations de liaison. Chaque opération de liaison nécessite une quantité de mémoire fixe pour enregistrer l'état précédent de la pile. Donc,
la source