Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Algoritmos no Fronte de Batalha

Algoritmos no Fronte de Batalha

Algoritmos no Fronte de Batalha

Juan Lopes

March 27, 2015
Tweet

More Decks by Juan Lopes

Other Decks in Technology

Transcript

  1. co-NP NP Juan Lopes Ciência da Computação& Maratona de Programação&

    Real-Time Analytics& Yada yada yada. P /juanplopes juanlopes.net/qconsp2015
  2. Dinosaur! Co. <api-maluca> <texto> <![CDATA[Algum texto muito importante]]> </texto> </api-maluca>

    { “api-maluca-v2”: “Algum texto muito importante” } ��������������Algum texto muito importante�����������������
  3. Dinosaur! Co. Muitos formatos. Arquivos <2KB. Garantida a presença de

    uma string comum em todos os arquivos. Ideal processar em <1s.
  4. Dinosaur! Co. Muitos formatos. Arquivos <2KB. Garantida a presença de

    uma string comum em todos os arquivos. Ideal processar em <1s.
  5. [0] a b a a c c b b a

    a S 1 S 2 i j i+k j+k porquinho[0]: o preguiçoso ➔ Algoritmo trivial ➔ Fácil de implementar ➔ Fácil de testar ➔ Fácil de explicar O(n3)
  6. porquinho[1]: o pragmático ➔ Programação dinâmica ➔ Fácil de implementar

    ➔ Fácil de testar ➔ “Difícil” de explicar O(n2) [1] a b a a c c b b a a S 1 S 2 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 1 0 2 1 0 1 0 1 3 0
  7. porquinho[2]: o perfeccionista ➔ Array de sufixos (+LCP) ➔ Difícil

    de implementar ➔ Difícil de testar ➔ Difícil de explicar O(n) [2] a 11 0 2 b 5 1 1 a 10 0 2 a 9 1 2 c 2 2 1 # 0 1 1 c 3 1 1 b 8 0 2 b 1 3 1 a 7 1 2 a 4 0 1 # 6 2 2 S 1 S 2 SA LCP O
  8. porquinho[2]: o perfeccionista ➔ Implementação do Kärkkäinen-Sanders1 (ou mesmo Ukkonen2)

    é difícil de acertar na prática ➔ Muitos border cases ➔ Alfabeto Unicode é grande demais. 1http://www.cs.cmu.edu/~guyb/realworld/papersS04/KaSa03.pdf 2https://www.cs.helsinki.fi/u/ukkonen/SuffixT1withFigs.pdf [2] a 11 0 2 b 5 1 1 a 10 0 2 a 9 1 2 c 2 2 1 # 0 1 1 c 3 1 1 b 8 0 2 b 1 3 1 a 7 1 2 a 4 0 1 # 6 2 2 S 1 S 2 SA LCP O
  9. Regra do dedão No pior caso, é possível fazer um

    milhão de coisas por segundo. No melhor caso, cem milhões. Acima disso, só C. PS: nunca escreva isso num artigo se você tem amor a sua reputação acadêmica. Rule of thumb. Sacou? Sacou?
  10. Problema XY “You are trying to solve problem X, and

    you think solution Y would work, but instead of asking about X when you run into trouble, you ask about Y.” http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem X Y
  11. E por aí vai... A análise de complexidade mostra que,

    com uma escolha ótima de pivôs, o número de operações é:
  12. 3 4 5 6 1 2 0 0 1 2

    3 4 5 6 Heaps são importantes No StackOverflow: “Most efficient algorithm for merging sorted IEnumerable<T>” A resposta aceita é O(nk). Usando uma heap seria O(nlogk). http://stackoverflow.com/questions/2767007/most-efficient-algorithm-for- merging-sorted-ienumerablet
  13. Em Python... A função heapq.merge é a solução. Essas adições

    à biblioteca padrão são importantes à medida que conceitos funcionais são difundidos na indústria. https://docs.python.org/2/library/heapq.html
  14. Agendador de tarefas A próxima execução de cada tarefa é

    colocada numa heap e a thread agendadora pode dormir enquanto a tarefa mais próxima (verificada em O(1)) não chegar. Exemplo: https://gist.github.com/juanplopes/8cf51044bb873bbaf737
  15. Plotando gráficos Alguns gráficos podem ter mais pontos do que

    a interface consegue plotar sem sofrer slowdown. Por isso, é preciso escolher os pontos mais importantes. Um algoritmo possível considera pontos que contribuem para a entropia do gráfico1,2. 1http://thescipub.com/PDF/jcssp.2010.1389.1395.pdf 2http://www.academia.edu/1578716/Aplica%C3%A7%C3% A3o_do_algoritmo_Perceptually_Important_Points_em_s%C3% A9ries_temporais_de_datacenters
  16. O(n2): Lento demais Para melhorar, a ideia é manter uma

    heap com a referência do ponto de menor entropia. Assim, sua remoção passa a ser O(log n), tornando o algoritmo O(n log n).
  17. Reinvente a roda A maior parte das implementações de binary

    heap não permite a operação change-key, tornando o seu uso em alguns algoritmos mais difícil. Se precisar, implemente você mesmo uma heap que suporte essa operação. Vale para qualquer algoritmo. YES, YOU CAN
  18. Não confie em strfind Em muitos casos, é implementado com

    algoritmo trivial O(nm). Existem algoritmos O(n+m). Ruby e Python implementam algoritmos eficientes, entretanto.
  19. Não confie em regex A implementação de quase todas as

    linguagens é ruim1, tornando exponenciais mesmo expressões que poderiam ser tratadas com algoritmos polinomiais. 1http://swtch.com/~rsc/regexp/regexp1.html /regexp?/
  20. Quase certo às vezes é OK Quando o volume de

    dados é grande demais para um algoritmo exato, lembre-se sempre dos algoritmos randomizados. http://www.infoq.com/br/presentations/analisando-fluxo-dados-tempo-real
  21. Aprenda a criar DSLs O quanto antes. Não somente quando

    surgir oportunidade. 1 + ( 2 - 3 ) * 4 EXPR FACTOR TERM FACTOR
  22. { startTs: 1427252400000, endTs: 1427338800000 } { date: ‘2015-03-25’ }

    { span: ‘today’ } { span: ‘last 4 hours of the thursday in the previous week’ } Pipes Span DSL Experimente em: http://pipes-tutorial.intelie.com/span
  23. last 4 hours of the thursday in the previous week

    é compilado como ((4 hours before (now)) shifted to (4th day of (current week))) shifted to (1 week before (current week))
  24. Saiba o básico de ML (digo, Machine Learning, embora aprender

    a programar em ML também seja uma boa ideia) Revisite estatística, métodos de regressão. Aprenda R para facilitar o trabalho.
  25. Conclusão O programador precisa conhecer suas ferramentas. Não basta conhecer

    plataformas, linguagens e bibliotecas. É preciso entender os fundamentos da computação para saber identificar o melhor momento onde utilizá-los.
  26. 3 2 1 8 7 6 12 11 10 9

    16 15 14 13 4 5 Obrigado! /juanplopes juanlopes.net/qconsp2015