Une préférence pour les solutions de force brute est-elle un mauvais signe? [fermé]

StackOverflow https://stackoverflow.com/questions/418465

  •  03-07-2019
  •  | 
  •  

Question

Je suis un programmeur débutant en C ++ et, pour me détendre, j'ai essayé quelques-uns des problèmes rencontrés sur projecteulerler.net . Malgré mon intérêt pour les mathématiques à l'école, je me suis automatiquement mis à chercher des solutions brutes aux problèmes, plutôt que de chercher quelque chose de simple ou d'élégant.

Est-ce que cela semble être un mauvais état d'esprit? Je me sens un peu coupable de le faire comme ça, mais peut-être que rapide et sale est correct de temps en temps ...

Était-ce utile?

La solution

Je pense que vous devriez regarder quel est votre objectif final et quelles sont vos contraintes.

Parfois, une méthode bruteforce peut résoudre un problème en 50ms en essayant toutes les combinaisons de solutions et une méthode "intelligente". solution peut le résoudre en 10ms. À ce stade, la solution moins intelligente mais plus facile à comprendre prime sur la solution intelligente.

Cependant, il existe certains problèmes pour lesquels le forçage brutal sera non seulement inélégant, mais ne fonctionnera tout simplement pas. Il existe de nombreux problèmes et si vous essayez de les forcer naïvement par la force, il faudra beaucoup de temps pour les résoudre. Il est donc évident que ces types de problèmes nécessitent une approche plus élégante.

Alors demandez-vous pourquoi vous tentez ces problèmes avec Project Euler? Est-ce que tu le fais pour apprendre? Alors peut-être qu’essayer une solution intelligente serait dans votre intérêt, mais seulement après avoir initialement essayé une solution de force brute pour vous aider à comprendre le problème.

Lorsque je fais face aux problèmes du défi Python, j'essaie de le faire de la manière la plus succincte possible, en repoussant les limites de mes capacités. Après avoir résolu le problème, je passe en revue les réponses des autres personnes et prends note mentalement des personnes plus intelligentes que moi et de ce qu’elles ont fait. Certaines personnes feront un usage particulier d'une structure de données à laquelle je n'avais pas pensé qui convient mieux à la tâche ou auront peu de ruses mathématiques à utiliser pour rendre leur algorithme plus efficace. En fin de compte, j'essaie d'absorber au maximum leur intelligence et de le montrer à la prochaine fois où je suis confronté à un problème de même nature.

Autres conseils

Non, ce n’est pas une mauvaise chose. J'ai eu des solutions si élégantes qu'elles se sont trompées.

En tant que programmeur débutant, vous dépenserez davantage de votre énergie mentale pour savoir comment réellement mettre en œuvre des éléments en C ++, plutôt que de dépenser de l'énergie pour trouver une solution intelligente à chaque problème. C’est bien, car cela vous donne l’occasion d’explorer différents domaines du C ++ tout en travaillant sur divers types de problèmes.

Lorsque vous maîtriserez le C ++ et que vous n'aurez plus à vous soucier de la moindre chose à faire, alors , vous pourrez passer plus de temps à inventer des solutions non-brutales.

Les solutions élégantes n’ont pas été créées spontanément; ils sont dérivés des solutions à force brute qui nécessitaient plus de vitesse ou moins de consommation de mémoire avec la solution actuelle.

Donc non, ce n'est pas. C'est ainsi que les solutions élégantes ont vu le jour.

J'ai en quelque sorte traversé cette évolution:

  1. Faites-le compiler
  2. Faites-le fonctionner comme prévu
  3. Trouvez une solution qui fonctionne
  4. Trouvez une bonne solution
  5. Trouvez plusieurs solutions et trouvez la meilleure
  6. Trouvez plusieurs solutions et trouvez la meilleure solution pour cette situation
  7. ?? n'y sont pas encore arrivés

Je dirais que non, ce n'est pas un mauvais signe. En fait, vous vous faites une faveur en évitant les optimisations prématurées, ce qui est certainement une bonne chose.

Ken Thompson: "En cas de doute, utilisez la force brute"

apprendre est un processus de force brute. Je ne dirais pas que c'est mauvais. En essayant de faire quelque chose de cette façon, vous remarquerez peut-être une tendance. Je pense que tant que vous réfléchissez à quelque chose et essayez de trouver des solutions, vous apprendrez. Peu de gens se contentent des solutions les plus élégantes et les plus efficaces.

Il serait difficile de me convaincre que les personnes qui essaient d’apprendre pourraient être qualifiées de mauvaises Sauf peut-être un scientifique diabolique: P

bonne chance.

Êtes-vous conforme à la règle d'exécution d'une minute pour les problèmes? Si oui, alors votre "force brute" Cette solution répond à toutes les exigences et c'est en fait un très bon signe que vous pouvez rapidement trouver quelque chose qui fonctionne!

Ces types de problèmes encouragent la micro-optimisation et des algorithmes très intelligents, mais en général, une implémentation simple et très lisible sera beaucoup plus facile à maintenir et sera privilégiée dans le monde des affaires.

S'il s'agit d'une situation où "force brute" = > " simple " et "élégant" = > "complexe", la force brute l'emporte. Et cela est souvent vrai.

Pas du tout. Résolvez le problème correctement et complètement, puis rendez-le plus performant ou plus élégant si nécessaire.

Cela ne veut pas dire que vous devriez ignorer les améliorations évidentes des performances ... Ne vous concentrez pas sur elles avant d'avoir mieux compris le problème.

Pour placer ceci dans un contexte différent:

Lorsque vous utilisez une bibliothèque que vous ne connaissez pas très bien (pour créer une interface utilisateur, par exemple), vous pouvez résoudre un problème simple de manière parfaitement performante, bien que vous sachiez qu'il existe une "méthode correcte". pour le faire. Si vous êtes curieux et préoccupé par le fait que votre code de force brute vous fait ressembler à un crétin, vous allez bientôt trouver la "manière correcte". pour le faire (par exemple, le week-end ou pendant que vous dormez). Entre-temps, grâce à la force brutale, vous obtiendrez quelque chose qui fonctionnera.

En fait, j'oublie parfois d'utiliser la force brute et je commence à analyser l'API à la recherche du "droit". Solution. C'est certainement une erreur dans de nombreux cas. Si la solution de force brute est facile à mettre en œuvre, évolue à votre convenance (vraiment, si cela fonctionne), oubliez la solution correcte. Vous la trouverez assez tôt (et plusieurs fois le savais déjà!), mais entre-temps, vous avez résolu le problème et réussi à passer au suivant.

Les barrages routiers sont terribles lors du codage et doivent absolument être évités davantage que les solutions par force brute.

Ce n’est certainement pas un mauvais signe de la tendance à la force brute, surtout en tant que débutant parce que vous ne savez peut-être pas mieux. Surtout avec Project Euler, il est mauvais d’implémenter une méthode de force brute et de ne pas revoir les commentaires pour en apprendre une plus efficace.

Je finis souvent dans le même bateau que vous et c’est pourquoi j’ai commencé à faire P.E. problèmes - je mettais en œuvre beaucoup d’approches de force brute et je voulais m’exposer à des solutions plus élégantes ...

Vous avez pesé votre option. Si la solution de force brute doit faire le travail et fonctionner correctement, c'est une bonne solution.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top