web-dev-qa-db-fra.com

Quelqu'un peut-il aider à résoudre ce problème algorithmique complexe?

J'ai eu cette question dans une interview et je n'ai pas pu la résoudre.

  • Vous avez une route circulaire, avec n nombre de stations-service.
  • Vous connaissez la quantité de gaz que chaque station a.
  • Vous connaissez la quantité de gaz dont vous avez besoin d'une station à la suivante.
  • Votre voiture commence avec 0.
  • Vous ne pouvez conduire que dans le sens des aiguilles d'une montre.

La question est la suivante: créer un algorithme, savoir à partir de quelle station-service vous devez commencer à conduire afin de compléter un cercle complet.

En tant qu'exercice pour moi, je traduirais l'algorithme en C #.

6
Luis Valencia

Cela ressemble à une dérivation de l'algorithme de chemin le plus court, de sorte que vous considérez donc que chaque station est un sommet d'un graphique, et les bords sont pondérés à leur distance (en termes de carburant).

Ensuite, vous pouvez utiliser une adaptation de Dijkstra pour résoudre -> http://fr.wikipedia.org/wiki/dijkstra%27s_algorithm

9
Daniel Scocco

Ma première réponse serait "Les exigences semblent être incomplètes, es-tu sûr de vouloir que je rédige le code sur la base de ces exigences seulement, pourrons-nous les faire au fur et à mesure, ou voudriez-vous que j'aimerais terminer les exigences avant de concevoir les logiciels?".

Les besoins incomplets sont, comme indiqué dans d'autres questions, la capacité de carburant de la voiture. Fin Point - Est-ce le point de départ ou la station avant le point de départ. (Je pense que vous répondez à cela dans votre commentaire "Terminer un cercle complet implique End = Début, dans ce cas. Je clarifierais cela comme il n'est pas explicite) La question implique y a une seule solution et une seule solution, est-ce correct.

Les autres problèmes sont la performance de l'algorithme une préoccupation ou une autre manière, quel est le budget de ce projet.

C'est une bonne question - vous ne pouvez pas y répondre sous la forme actuelle et être certain que vous avez fourni au client la solution au problème à laquelle il s'attend.

5
mattnz

J'ai l'impression que le quiz donné manque de parties vitales. Cependant, dans mon raisonnement, j'utiliserais après des hypothèses suivantes:

  • Réservoir de voiture a une capacité de carburant illimitée
  • Il est possible de voyager dans le sens des aiguilles d'une montre seulement
  • Voiture commence avec 0 gaz
  • La voiture devrait finir dans la même station d'essence

Compte tenu de ces hypothèses, la tâche peut être facilement brute forcée avec une complexité O (n ** 2), en essayant toutes les stations-service.

Si cela nécessite une solution plus robuste, il est possible de transformer ce quiz à problème de sous-séquence continue maximale avec des contraintes supplémentaires, qu'elle ne devriez pas aller sous zéro. La complexité de cet algorithme est O(n) - linéaire.

Pour la première étape, permet de transformer notre problème initial au problème résolu par une sous-séquence maximale en résumant la quantité de gaz à la station-service et au coût de cette station.

La deuxième étape consiste à appliquer un algorithme de sous-séquence maximale. L'algorithme est basé sur 2 hypothèses:

  • si le compteur de gaz est allé en dessous de 0, c'est toujours préférable de redémarrer de la station d'essence actuelle
  • sinon, il est préférable de remplir le réservoir, car il est plus de 0 gaz ici

Appliquer cet algorithme à la liste cerclée des stations 2 fois (2 séquences qui se chevauchent), nous recevrons la station qui commence la séquence qui accumule la majeure partie du carburant.

La troisième étape consiste à vérifier que l'objectif est accessible avec une quantité donnée de carburant et une station de départ donnée, la complexité O (n)

5
Valera Kolupaev