11
votes

Comment puis-je calculer un produit cartésien itératif?

Cette question demande comment calculer le produit cartésien d'un nombre donné de vecteurs . Étant donné que le nombre de vecteurs est connu à l'avance et plutôt petit, la solution est facilement obtenue avec des boucles imbriquées.

Supposons maintenant que vous recevez, dans votre langue de choix, un vecteur de vecteurs (ou liste des listes, ou Ensemble d'ensembles, etc.): xxx

Si on m'a demandé de calculer son produit cartésien, c'est xxx

Je procéderais à la récursion. Par exemple, dans le python rapide et sale, xxx

est un moyen facile de le calculer itératif ?

(Remarque: la réponse n'a pas besoin d'être en Python et de toute façon je suis conscient que, dans Python Itertools, le travail est meilleur, comme dans Cette question .)


0 commentaires

4 Réponses :


19
votes

1) Créez une liste d'index dans les listes correspondantes, initialisées à 0, c'est-à-dire: xxx pré>

2) donnez l'élément approprié de chaque liste (dans ce cas le premier).

3) augmente le dernier index d'une. p>

4) Si le dernier index est égal à la longueur de la dernière liste, réinitialisez-la à zéro et en portant une. Répétez cette opération jusqu'à ce qu'il n'y ait pas de transport. P>

5) Retournez à l'étape 2 jusqu'à ce que les index enveloppent sur [0,0,0,0,0,0] p>

C'est similaire à la manière dont les travaux de comptage, à l'exception de la base de chaque chiffre peuvent être différents. p>


Voici une implémentation de l'algorithme ci-dessus en Python: P>

def cartesian_product(aListOfList):
    i = 0
    while True:
        result = []
        j = i
        for l in aListOfList:
             result.append(l[j % len(l)])
             j /= len(l)
        if j > 0: return
        yield result
        i += 1


6 commentaires

Ouais. Plutôt facile en effet. Merci.


Je pense que votre code est en fait légèrement plus inefficace que votre algorithme ..; p


Oui ... J'ai une autre version qui correspond étroitement à l'algorithme, mais dans la pensée, c'était assez déroutant! Peut-être que je peux le poster quand même ...


@Larry: J'ai posté ma première version maintenant! Peut-être que cela pourrait être écrit plus soigneusement, mais ça marche ...


=) Juste en disant, parce que lorsque je soumets ma réponse et que je vous ai vu, et le vôtre est clairement plus efficace!


La solution à l'aide de l'incrémente le premier élément du premier élément cependant.



2
votes

Itéréter de 0 à \ pi a_i_length pour tous i . xxx

Il y a aussi des moyens triviaux d'écrire cela afin de l'écrire ne pas avoir à faire le même travail deux fois.


0 commentaires

1
votes

Vous devez simplement gérer votre pile manuellement. Fondamentalement, faites quelle récursion fait par vous-même. Puisque la récursivité met des données sur chaque appel récursif sur une pile, vous faites simplement la même chose: xxx p> non testé, mais l'idée fonctionnera. J'espère que je n'ai rien manqué.

EDIT : Eh bien, trop tard, je suppose. Ceci est fondamentalement la même chose que le comptage, juste une autre façon de le regarder.


0 commentaires

3
votes

Depuis que vous avez demandé une solution de langue-agnostique, voici un à bash, mais pouvons-nous l'appeler itératif, récursif, qu'est-ce que c'est? C'est juste la notation: xxx

peut-être assez intéressant. xxx


0 commentaires