Na ciência da computação, um algoritmo de seleção é um algoritmo para encontrar o k-ésimo menor valor em um conjunto. É particularmente útil ao trabalhar com valores ordinais, como números. Nesta postagem, vamos nos aprofundar nos conceitos básicos dos algoritmos de seleção, na mecânica de vários algoritmos e como eles desempenham um papel na descoberta rápida do k-ésimo menor valor.
A seleção inclui casos especiais, como encontrar o valor mínimo, mediano e máximo. Algoritmos de seleção comuns, como quickselect e mediana de medianas, têm uma complexidade de tempo de O(n) quando aplicados a um conjunto de n valores.
Em aplicações práticas, o problema do algoritmo de seleção pode ser descrito como: dado um conjunto de valores e um número k, produza o k-ésimo menor valor ou o k-ésimo menor conjunto de valores neste conjunto. Isso depende da capacidade de classificar esses valores, que normalmente são inteiros, números de ponto flutuante ou outros objetos com chaves numéricas. Como os valores não são classificados, qualquer algoritmo de seleção deve realizar comparações dentro das restrições fornecidas.
Como um algoritmo de base, o k-ésimo menor valor pode ser selecionado pelas duas etapas a seguir:
O consumo de tempo desse método está principalmente na etapa de classificação, que geralmente leva tempo O(n log n). Entretanto, quando lidamos com entradas de tamanho modesto, a classificação pode ser mais rápida do que algoritmos de seleção não aleatórios porque os fatores constantes no tempo de execução são menores.
Após aplicar a otimização da classificação de heap, o algoritmo de seleção de heap pode selecionar o k-ésimo menor valor em tempo O(n + k log n). Isso funciona bem para valores pequenos de k em relação a n, mas degenera para O(n log n) para valores maiores de k.
Muitos métodos de seleção são baseados na seleção de um elemento "pivô" específico da entrada, com o qual os valores restantes são comparados para particionar em dois subconjuntos. Se o k-ésimo menor valor estiver em um conjunto menor que o hub, podemos selecioná-lo recursivamente. Se k for exatamente igual ao número de valores menores que o pivô mais um, então o próprio pivô é o valor que estamos procurando.
O método de seleção de hub pode ser usado para selecionar aleatoriamente hubs com uma complexidade de tempo esperada de O(n), mas se a escolha não for apropriada, o tempo de execução pode chegar a O(n²).
Por exemplo, o método quickselect faz uma seleção aleatória ao procurar um pivô e filtra os valores com base no pivô. Isso o torna muito eficiente na maioria dos casos, enquanto o algoritmo Floyd–Rivest melhora a eficiência ao selecionar hubs mais facilmente por meio de amostras aleatórias.
O algoritmo da mediana das medianas particiona a entrada em conjuntos de cinco elementos e encontra sua mediana em cada conjunto em tempo constante. Em seguida, ele determina os principais centros regredindo recursivamente essas medianas.
Este algoritmo é o primeiro algoritmo de seleção determinística de tempo linear conhecido, porém, na prática, ele é frequentemente menos eficiente que o quickselect devido ao seu alto fator constante.
Pesquisas mostram que algoritmos paralelos têm sido realizados desde 1975, e o modelo algorítmico prova que, mesmo no caso de seleção mínima ou máxima, a seleção requer um número linear de comparações, Ω(log log n) passos. Em um modelo de computação de RAM paralela mais realista, pode-se mostrar que a complexidade de tempo é O(log n), e tal processo é muito mais eficiente.
Em resumo, os algoritmos de seleção desempenham um papel fundamental na tecnologia da informação, ajudando-nos a encontrar eficientemente os valores necessários por meio de diferentes estratégias e métodos. Da classificação simples aos algoritmos avançados de seleção de hubs, a evolução dessas tecnologias nos tornou mais flexíveis e eficientes no processamento de dados. No futuro, você consideraria usar esses algoritmos para consultas de dados mais complexas?