Является ли предпочтение решениям грубой силы плохим знаком? [закрытый]

Я начинающий программист на C++, и, чтобы растянуть свой ум, я пробовал некоторые из проблем на projecteuler.net. Несмотря на интерес к математике в школе, я обнаружил, что автоматически иду на грубые решения проблем, а не ищу что-то обтекаемое или элегантное.

Это звучит как плохое мышление, чтобы иметь? Я чувствую себя немного виноватым, делая это так, но, может быть, быстро и грязно в порядке некоторое время...

14 ответов


Я думаю, вы должны посмотреть, какова ваша конечная цель и каковы ваши ограничения.

иногда метод bruteforce может решить проблему за 50 мс, пробуя каждую комбинацию решений, а "умное" решение может решить ее за 10 мс. В этот момент менее умное, но более легкое для понимания решение превосходит умное решение.

однако есть некоторые проблемы, когда грубое принуждение не только будет неэлегантным, но и просто не будет работать. Есть много проблем, где если вы попытаетесь наивно грубой силой заставить их это займет значительное количество времени, чтобы решить их. Поэтому очевидно, что эти типы проблем требуют более элегантного подхода.

так спросите себя, почему вы пытаетесь эти проблемы проект Эйлера? Ты делаешь это, чтобы учиться? Тогда, возможно, попытка умного решения будет в ваших интересах, но только после того, как вы сначала попытаетесь решить проблему грубой силой, чтобы помочь понять проблему.

при выполнении Python Я стараюсь делать это как можно короче, раздвигая границы своих возможностей. После того, как я решу его, я буду просматривать ответы других людей и делать мысленные заметки о людях, которые были умнее меня, и о том, что они делали. Некоторые люди будут специально использовать структуру данных, о которой я не думал, которая больше подходит для задачи, или у них будут небольшие математические трюки, которые они используют, чтобы сделать свой алгоритм более эффективным. В конце концов я пытаюсь впитать в себя столько же их ума, сколько и я. может и заставить его показать в следующий раз, когда мне будет представлена проблема аналогичного характера.


нет, это не плохо. У меня были решения, которые были настолько элегантными, что они были неправильными.


как начинающий программист, вы будете тратить больше своей умственной энергии, выясняя, как на самом деле реализовать вещи в C++, а не тратить энергию на поиск умного решения каждой проблемы. Это хорошо, потому что это дает вам возможность исследовать различные области C++ при работе над рядом различных проблем.

когда вы станете опытным в C++ , и вам не нужно думать о том, как делать каждую мелочь,затем вы иметь возможность тратить больше времени на изобретение решений, не связанных с грубой силой.


элегантные решения не были созданы спонтанно; они были получены из решений грубой силы, когда от текущего решения требовалось больше скорости или меньше потребления памяти.

Так что нет, это не так. Так появились элегантные решения.


Я вроде как прошел через эту эволюцию:

  1. получить его для компиляции
  2. сделать так, как ожидалось
  3. выяснить одно решение, которое работает
  4. выяснить одно хорошее решение
  5. выяснить несколько решений, и найти лучший
  6. выяснить несколько решений, и найти лучшее для этой ситуации
  7. ?? еще не добрался туда

Я бы сказал, что нет, это не плохой знак. На самом деле вы делаете себе одолжение, отклоняясь от преждевременной оптимизации, что, безусловно, хорошо.


Кен Томпсон:"когда сомневаешься, используй грубую силу"


обучение-это процесс перебора. Я бы не сказал, что это плохо. Пытаясь сделать что-то таким образом, вы можете заметить закономерность. Я думаю, пока вы думаете о чем-то и пытаетесь найти решения, вы будете учиться. Есть мало людей, которые просто прыгают к самым элегантным или эффективным решениям.

было бы трудно убедить меня, что людей, которые пытаются учиться, можно назвать плохими. Кроме, может быть, злого ученого: P

удачи.


вы вписываетесь в правило выполнения 1 минуты для проблем? Если да, то ваше решение "грубой силы" отвечает всем требованиям, и это на самом деле очень хороший знак, что вы можете быстро придумать что-то, что работает!

такие проблемы поощряют микро-оптимизацию и очень умные алгоритмы, но в целом очень читаемая простая реализация будет намного легче поддерживать и будет благоприятствовать в деловом мире.


Если это происходит в ситуации, когда "грубая сила" = > "простой" и "элегантный" = > "сложный", то побеждает грубая сила. И это очень часто верно.


совсем нет. Получите проблему, решенную правильно и полностью, а затем сделайте ее более эффективной или элегантной по мере необходимости.

Это не значит, что вы должны игнорировать очевидные улучшения производительности... Просто не фокусируйся на них, пока не поймешь проблему лучше.


Это определенно не плохой признак тенденции к грубой силе, особенно как Новичок, потому что вы можете не знать лучше. Особенно с Project Euler, это плохой знак для реализации метода грубой силы и не просматривать комментарии, чтобы узнать более эффективный метод.

Я часто оказываюсь в той же лодке, что и вы, и именно поэтому я начал заниматься проблемами P. E. - я реализовывал много подходов грубой силы и хотел подвергнуть себя более элегантному решения...


чтобы поместить это в другой контекст:

когда вы используете библиотеку, которую вы не знаете очень хорошо (например, для создания пользовательского интерфейса), вы можете решить простую проблему совершенно эффективным способом, хотя вы знаете, что есть "правильный способ" сделать это. Если вам интересно и вы обеспокоены тем, что ваш код грубой силы делает вас похожим на идиота, вы скоро найдете "правильный способ" сделать это (например, по выходным или во время сна). тем временем, через грубую силу, вы будете иметь то, что работает.

Я действительно забываю иногда использовать грубую силу и начинаю сканировать API для "правильного" решения. Это определенно ошибка во многих случаях. Если решение грубой силы легко реализовать, масштабируется так, как вам нужно (действительно, если оно работает), то забудьте о правильном решении. вы найдете его достаточно скоро (и много раз вы уже знали это!), но тем временем вы решили проблему и смогли перейти к следующему один.

блокпосты ужасны при кодировании, и их определенно следует избегать больше, чем решений грубой силы.


вы должны взвесить свой выбор. Если решение грубой силы выполнит работу и будет работать нормально, это хорошее решение.