Eu não achei isso importante, exceto para comunicar idéias, e trabalho em campos críticos de desempenho (rastreamento de raios, processamento de imagem e malha, sistemas de partículas, mecanismos de física etc.) e tive que criar muitos algoritmos e estruturas de dados proprietários ao trabalhar em P&D. Nessas áreas, muitas vezes um punhado de estruturas e algoritmos de dados muito eficientes pode gerar novos produtos de ponta, enquanto os algoritmos de ontem tornam obsoletos os produtos existentes, por isso há sempre a busca de fazer as coisas com mais eficiência. Como uma ressalva, nunca publiquei nenhum artigo sobre os algoritmos que criei. Eles eram todos proprietários. Se o fizesse, precisaria da ajuda de um matemático para formular provas e assim por diante.
No entanto, na minha opinião, a quantidade de trabalho computacional por iteração costuma ser de interesse mais imediato do que a escalabilidade do algoritmo, a menos que o algoritmo seja muito pouco dimensionado. Se alguém inventa uma técnica de ponta para o traçado de raios, estou mais interessado em técnicas computacionais, como como elas representam e acessam dados, do que a complexidade algorítmica, porque a escalabilidade razoável já é um dado neste cenário competitivo e inovador. Você não pode ser competitivo criando algoritmos que não escalam.
Obviamente, se você estiver comparando complexidade quadrática com linearitmica, é uma enorme diferença. Mas a maioria das pessoas na minha área é competente o suficiente para evitar a aplicação de um algoritmo de complexidade quadrática em uma entrada épica. Portanto, a escalabilidade geralmente está profundamente implícita e as perguntas mais significativas e interessantes se tornam: "Você usou o GPGPU? SIMD? Ele roda em paralelo? Como você representa os dados? Você o reorganizou para padrões de acesso compatíveis com o cache?" muita memória é necessária? Ele pode lidar com esse caso de forma robusta? Você está adiando um determinado processamento ou fazendo tudo de uma só vez? "
Mesmo um algoritmo linearitmico pode superar um algoritmo de tempo linear se o primeiro acessar a memória em um padrão mais ideal, por exemplo, ou for mais adequado para multithreading e / ou SIMD. Às vezes, mesmo um algoritmo linear pode superar um algoritmo logarítmico por esses motivos, e naturalmente os algoritmos de tempo linear superam os algoritmos logarítmicos para entradas menores.
Então, para mim, o que importa mais é o que algumas pessoas chamam de "micro-otimizações", como representações de dados (layouts de memória, padrões de acesso com divisão de campos quentes / frios, etc.), multithreading, SIMD e, ocasionalmente, GPGPU. Em um campo em que todos já são competentes o suficiente para usar algoritmos decentes e avançados para tudo, com novos trabalhos sendo publicados o tempo todo, sua vantagem competitiva em vencer os assistentes algorítmicos não provém de melhorias na complexidade algorítmica, mas também de maneira mais direta. eficiência computacional.
Meu campo é dominado por matemáticos brilhantes, mas nem sempre aqueles que sabem o custo computacional do que estão fazendo ou muitos truques de nível inferior para acelerar o código. Essa é geralmente a minha vantagem sobre eles na criação de algoritmos e estruturas de dados mais rápidos e mais rigorosos, apesar de os meus serem muito menos sofisticados. Estou brincando com o que o hardware gosta, em direção a bits e bytes e tornando cada iteração de trabalho muito mais barata, mesmo que eu esteja fazendo mais algumas iterações de trabalho do que o algoritmo realmente sofisticado - o trabalho no meu caso é drasticamente mais barato. O código que escrevo também tende a ser muito mais simples. Se as pessoas acharem que versões micro-otimizadas de algoritmos diretos e estruturas de dados são difíceis de entender e manter,
Como exemplo básico, criei uma estrutura de grade simples que acabou superando uma árvore KD em nossa empresa para detecção de colisões e remoção de pontos redundantes. Minha grade estúpida e bruta era muito menos sofisticada algoritmicamente e sou muito mais matematicamente e algorítmica do que o cara que implementou a árvore KD com sua nova maneira de encontrar o ponto médio, mas apenas ajustei os padrões de uso e acesso à memória da minha grade e isso foi suficiente para superar algo muito mais sofisticado.
Outra vantagem que tenho que me permite sobreviver em um campo dominado por pessoas muito mais inteligentes do que eu é realmente entender como o usuário trabalha, já que eu uso o software que desenvolvo da mesma maneira. Isso me dá idéias para algoritmos que realmente se alinham muito imediatamente aos interesses do usuário. Como exemplo básico, a maioria das pessoas tenta acelerar coisas como a detecção de colisões usando indexação espacial. Fiz uma observação simples de modelagem de carreira há quase duas décadas para modelos orgânicos que, por exemplo, se um personagem coloca as mãos no rosto, uma estrutura de indexação espacial gostaria de dividir nós e fazer atualizações caras se o personagem depois tirou a mão do rosto. Se, em vez disso, você particionar com base nos dados de conectividade, e não nas posições de vértice, você pode acabar com uma estrutura hierárquica estável que é atualizada rapidamente e nunca precisa dividir ou reequilibrar a árvore (só é necessário atualizar caixas delimitadoras a cada quadro de animação) ... coisas assim: algoritmos que uma criança sem formação matemática pesada poderiam surgir se eles apenas entendessem o conceito básico, mas aqueles que iludiam os matemáticos porque não pensavam nas coisas de uma maneira tão próxima de como os usuários trabalhavam e pensavam demais apenas nas propriedades da geometria e não na geometria foi comumente usado. Eu me dou bem bastante, apoiando-me mais no conhecimento geral da computação e no conhecimento do usuário do que na magia algorítmica. De qualquer forma, eu realmente não achei tão importante focar na complexidade algorítmica.