Suponha que lemos uma sequência de números, um por um. Como encontrar o menor elemento do apenas com o uso da memória da célula e no tempo linear ( ). Acho que devemos salvar os primeiros termos de sequência e, quando obter o termo ', exclua um termo que tenha certeza de que não pode ser o ' é o menor elemento e, em seguida, salve o termo '. Portanto, devemos ter um indicador que mostre esse termo inutilizável em cada etapa e esse indicador deve ser atualizado rapidamente em cada etapa. Eu comecei com "max" ; mas não pode atualizar rapidamente; Significa que se considerarmos maxO ( k ) ( n - k ) × O ( k ) kentão, na primeira exclusão, perdemos o máximo e devemos procurar o máximo em e sua causa que não é linear. Talvez devêssemos salvar os primeiros termos de sequência de maneira mais inteligente.
Como eu resolvo este problema?
fonte
Respostas:
Crie um buffer de tamanho . Leia os elementos da matriz. Use um algoritmo de seleção de tempo linear para particionar o buffer para que os menores elementos sejam os primeiros; isso leva tempo . Agora leia outros itens de sua matriz no buffer, substituindo os maiores itens no buffer, particione o buffer como antes e repita.2 k k O ( k ) k k2k 2k k O(k) k k
Isso ocupa tempo e espaço.O ( k )O(k∗n/k)=O(n) O(k)
fonte
min
fonte