Eu queria saber quais algoritmos eles usam internamente e como decidir de forma inteligente um algoritmo específico para uma tarefa específica? Por exemplo, se a classificação obtiver um grande arquivo de entrada, ela utilizará algoritmos diferentes para tamanhos de dados diferentes?
Essa é uma pergunta interessante (+1 para isso). Não tenho idéia de qual é a resposta, mas se eu fosse você, examinaria o código fonte dos utilitários típicos do GNU para ter uma idéia de seus algoritmos.
O grep alterna inteligentemente os algoritmos ao pesquisar diferentes conjuntos de dados?
Acho que não. Não me cite, já que não posso lhe contar com 100% de certeza, mas acho que não. A filosofia das coisas do UNIX é que uma coisa faz uma coisa e apenas uma coisa. É por isso que temos várias versões do grep ( grep
, egrep
, fgrep
).
Além disso, a idéia é fazer uma coisa e apenas uma coisa em tempo de execução. Comportamentos e algoritmos diferentes podem ser configurados como argumentos de linha de comando, para que o mesmo programa possa agir de maneira um pouco diferente (e possivelmente um pouco mais otimizada) entre as execuções. Bons exemplos são o comando wc
e diff
.
No entanto, a adaptação comportamental é baseada na configuração (via argumentos da linha cmd); eles não alteram / adaptam o comportamento em tempo de execução. Geralmente, é uma complexidade desnecessária para o tipo de artefato que as ferramentas do UNIX pretendem ser.
Essa complexidade é mais apropriada para ferramentas IMO mais complexas e menos genéricas.
grep
,egrep
, oufgrep
.