Seleção eficiente da mediana e dos elementos à sua esquerda e direita

14

Suponha que tenhamos um conjunto de N codificadores.S={a1,a2,a3,,aN}N

Cada Codificador tem a classificação e o número de medalhas de ouro E i , que haviam ganho até agora.RiEi

Uma empresa de software deseja contratar exatamente três codificadores para desenvolver um aplicativo.

Para a contratação de três codificadores, eles desenvolveram a seguinte estratégia:

  1. Eles primeiro organizam os codificadores em ordem crescente de classificação e ordem decrescente de medalhas de ouro.
  2. Nessa lista organizada, eles selecionam os três dos codificadores do meio. Por exemplo, se a lista organizada for eles selecionam ( a 2 , a 3 , a 1 ) codificadores.(a5,a2,a3,a1,a4)(a2,a3,a1)

Agora temos que ajudar a empresa escrevendo um programa para esta tarefa.

Entrada:

A primeira linha contém , ou seja, o número de codificadores.N

Em seguida, a segunda linha contém as classificações do i th codificador.Rii

A terceira linha contém o número de medalhas ensacados pelo th codificador.i

Resultado:

Exiba apenas uma linha que contenha a soma das medalhas de ouro conquistadas pelos três codificadores que a empresa selecionará.

Jack
fonte
3
Então codificadores de classificação mais alta sempre ganham menos medalhas? Caso contrário, que ordem você está realmente usando para classificar?
Jeffe

Respostas:

16

Esse é um problema de selecionar o menor elemento da lista resolvida por uma classe de algoritmos denominada Algoritmos de Seleção . Existem algoritmos de seleção de tempo linear determinístico para que seu problema possa ser resolvido em tempo linear, selecionando os menores elementos n / 2 , n / 2 - 1 , n / 2 + 1 º da lista original não classificada.kn/2,n/21,n/2+1

Optar
fonte
6
Se desejar, você pode executar o algoritmo de seleção uma vez para encontrar a mediana e, em seguida, encontrar o mínimo e o máximo nas partições direita e esquerda, respectivamente, de uma só vez.
Zach Langley
@Sid @ Zach Langley Oi, por favor, forneça o Pseudo-Código .i Passei pela paedia da wiki, mas me sinto um pouco difícil de entender.
Jack
@ Jack, você está familiarizado com o funcionamento do quicksort? O algoritmo de seleção aleatória é essencialmente o mesmo, exceto que apenas se repete em um lado de cada pivô.
Zach Langley
6
@Jack: O artigo da Wikipedia sobre algoritmos de seleção (vinculado na resposta de Sid) contém pseudocódigo. Google também funciona.
Jeffe
@Sid :: Eu li o algoritmo wiki (algoritmo de seleção geral baseado em partição) .Temos que chamar a função select três vezes com k = n / 2, k = n / 2-1, k / 2.Também, o que será o valor da esquerda, direita ao chamar a função select. Também na função de partição, qual será o valor do índice da partição.
Jack