Meu algoritmo inicial:
- Compare o elemento 0 com qualquer outro elemento, acompanhando quantos elementos são menores que ele.
- Repita para cada elemento até encontrar um elemento maior que exatamente (k-1).
Suponho que isso levaria no pior caso. É possível obter um tempo de execução mais rápido sem classificar a lista?
search-algorithms
lists
PORQUE
fonte
fonte
Respostas:
Use o algoritmo de seleção para tempo linear https://en.m.wikipedia.org/wiki/Selection_algorithm
fonte
Infelizmente, não posso apenas comentar, mas tenho que publicá-lo como resposta.
De qualquer forma, você pode tentar usar um min-heap em sua matriz não classificada, conseguir uma complexidade de tempo de O (n + k * logn).
fonte
O algoritmo Quickselect pode fazer isso com O (n) complexidade média, é um dos algoritmos de seleção mais usados de acordo com a Wikipedia .
É derivado do QuickSort e, como tal, sofre de uma complexidade de pior caso de O (n²) se você usar um pivô incorreto (um problema que pode ser evitado na prática).
O algoritmo em poucas palavras: após a rotação como no QuickSort, desça apenas para o lado inferior ou superior da matriz - dependendo de qual deles possui o elemento que você procura.
fonte
Crie um heap máximo de tamanhok . O invariante é que o heap sempre contém ok menores elementos observados até agora.
No final, o heap conterá ok menores elementos da lista.
Procurar o elemento máximo tem custo constante. O custo de inserção e exclusão éO ( k ) . A complexidade do tempo desse método éO ( n . Logk )
fonte