Pergunta

Eu sou um novato C ++ programador, e para esticar minha mente Eu tenho tentado alguns dos problemas em projecteuler.net . Apesar de um interesse em matemática na escola, eu me encontrei automaticamente indo para soluções de força bruta para os problemas, em vez de olhar para algo racionalizado ou elegante.

Isso soa como uma má mentalidade de ter? Eu me sinto um pouco culpado fazê-lo assim, mas talvez rápido e sujo é OK algum tempo ...

Foi útil?

Solução

Eu acho que você deve olhar para o que seu objetivo final é eo que suas limitações são.

Às vezes um método bruteforce pode resolver um problema em 50ms tentando a cada combinação de soluções e uma solução "inteligente" pode resolvê-lo em 10ms. Nesse ponto, menos inteligente, mas mais fácil de entender solução supera a solução inteligente.

No entanto, existem alguns problemas que força bruta não só será deselegante, mas simplesmente não vai funcionar. Há muitos problemas que se você tentar força bruta ingenuamente deles levará uma quantidade significativa de tempo para resolvê-los. Então, obviamente, esses tipos de problemas precisam de uma abordagem mais elegante.

Então, pergunte a si mesmo, porque você está tentando estes problemas Projeto de Euler? Você está fazendo isso para aprender? Então, talvez, tentando uma solução inteligente seria no seu melhor interesse, mas só depois de ter inicialmente tentou uma solução de força bruta para ajudar a obter uma compreensão do problema.

Ao fazer os problemas Python desafio eu tento fazê-lo da forma mais sucinta que posso, empurrando os limites de minhas capacidades. Depois que eu resolver isso eu então rever outras respostas povos e tomar notas mentais de pessoas que eram mais inteligentes do que eu eo que eles fizeram. Algumas pessoas vão fazer uso especial de uma estrutura de dados que eu não tinha pensado que é mais adequado para a tarefa ou terão pequenos truques matemáticos que eles usam para fazer seu algoritmo mais eficiente. No final, eu tento absorver o máximo de sua inteligência que eu puder e torná-lo mostrar a próxima vez que eu sou apresentado com um problema de natureza similar.

Outras dicas

Não, isso não é uma coisa ruim. Eu tive soluções que foram tão elegante que eles estavam errados.

Como um programador novato, você estará gastando mais de sua energia mental para descobrir como implementar realmente as coisas em C ++, em vez de gastar energia em encontrar uma solução inteligente para cada problema. Isso é bom, porque lhe dá a oportunidade de explorar diferentes áreas de C ++, enquanto trabalhava em uma gama de vários tipos de problemas.

Quando você se tornar proficientes em C ++ e você não tem que pensar em como fazer cada pequena coisa, então , você será capaz de passar mais tempo inventando soluções de força não-bruta.

As soluções elegantes não foram criados espontaneamente; eles foram derivados das soluções de força bruta quando mais velocidade ou menos consumo de memória foram requeridos a partir da solução atual.

Então, não, não é. É como as soluções elegantes surgiu.

Eu meio que passaram por essa evolução:

  1. obtê-lo para compilar
  2. Fazê-lo funcionar como esperado
  3. Descobrir uma solução que funciona
  4. Descobrir uma boa solução
  5. Descobrir múltiplas soluções, e encontrar o melhor
  6. Descobrir múltiplas soluções, e encontrar o melhor para esta situação
  7. ?? ainda não chegou lá

Eu diria que não, não é um mau sinal. Na verdade, você está fazendo um favor a si tendendo longe de otimizações prematuras, que é definitivamente uma coisa boa.

Ken Thompson: "Em caso de dúvida, o uso de força bruta"

aprendizagem é um processo força bruta. Eu não diria que é ruim. Na tentativa de fazer algo de que maneira você pode notar um padrão. Eu acho que enquanto você está pensando em algo e tentar encontrar soluções que você vai aprender. Há poucas pessoas que simplesmente pular para a maioria das soluções elegantes ou eficientes.

Seria difícil convencer-me que as pessoas que estão tentando aprender jamais poderia ser chamado de ruim. Exceto, talvez, um cientista do mal: P

boa sorte.

Do você se encaixa dentro da regra de execução 1 minuto para os problemas? Se sim, então a sua solução de "força bruta" preenche todos os requisitos, e que na verdade é um sinal muito bom de que você pode rapidamente chegar a algo que funciona!

Esses tipos de problemas incentivar micro-otimização e algoritmos muito inteligente, mas de um modo geral implementação direta muito legível será muito mais fácil de manter, e serão favorecidos no mundo dos negócios.

Se ele passa a ser uma situação onde "força bruta" => "simples" e "elegante" => "complexo", em seguida, ganha força bruta. E isso é muito frequentemente verdadeiro.

Nem um pouco. Obter o problema resolvido corretamente e completamente, em seguida, torná-lo mais alto desempenho ou elegante, se necessário.

Isso não quer dizer que você deve ignorar melhorias de desempenho óbvias ... Só não focar-los até que você entender melhor o problema.

Para colocar isto em um contexto diferente:

Quando você usa uma biblioteca que você não sabe muito bem (para a criação de UI, por exemplo) você pode resolver um problema simples de uma forma perfeitamente performance, embora você sabe que há uma "maneira correta" de fazê-lo. Se você está curioso e preocupado que seu código de força bruta, faz você parecer um idiota, você logo vai encontrar a "maneira correta" de fazê-lo (por exemplo, nos fins de semana, ou enquanto você dorme). Entretanto, por meio de força bruta, você terá algo que funciona.

Na verdade, eu esqueça de usar a força bruta, por vezes, e começar a digitalizar o API para a solução "certa". Este é definitivamente um erro em muitos casos. Se a solução de força bruta é fácil de implementar, escalas que for necessário para (realmente, se ele funciona), em seguida, esquecer-se sobre a solução correta. Você vai encontrá-lo em breve (e muitas vezes você já sabia!), mas, entretanto, você resolveu o problema e foram capazes de ir para a próxima.

Roadblocks são terríveis quando a codificação, e deve definitivamente ser evitados mais de soluções de força bruta.

Não é definitivamente um mau sinal a tendência à força bruta, especialmente como um novato, porque você não pode saber melhor. Especialmente com o Projeto Euler, é um mau sinal para implementar um método de força bruta e não rever os comentários de aprender um método mais eficiente.

Eu muitas vezes acabam no mesmo barco que você está dentro e que é realmente por isso que eu comecei a fazer P.E. problemas - Eu estava implementando um monte de força bruta abordagens e queria me expor a mais elegante soluções ...

Você tem pesar sua opção. Se a solução de força bruta vai começar o trabalho feito e realizar ok, é uma boa solução.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top