Atualização de algoritmo. Por que o heapsort é um algoritmo de classificação?


15

Não vejo por que o heapsort é considerado um algoritmo de classificação local .

Quero dizer, uma estrutura de dados extra preenchida com os elementos da matriz a ser classificada, ou seja, um monte, é usada para auxiliar na extração do valor mínimo e no processo de classificação.

Então, posso estar entendendo mal a definição de lugar aqui?

Mas tipo de inserção, por exemplo, é óbvio que é um algoritmo local, ou seja, nenhuma memória extra é necessária para os elementos.

Então, por que é considerado local?

Respostas:


12

Quero dizer, uma estrutura de dados extra preenchida com os elementos da matriz a ser classificada, ou seja, um monte, é usada para auxiliar na extração do valor mínimo e no processo de classificação.

Não. A matriz é transformada para se adequar à restrição de heap sem usar mais de O (1) memória extra. (Na verdade, tudo o que você precisa é de memória extra suficiente para armazenar um elemento da matriz, para fins de troca, mais um booleano ou dois e uma variável de loop ou dois).

Ok, em um aspecto técnico, pode ser que o heapsort seja geralmente explicado como usando um heap separado, mas é perfeitamente possível implementá-lo no local.


3
O único lugar que eu esperaria ver "heapsort" com um heap separado (em código) é em uma linguagem funcional como Haskell, pela mesma razão que o "Quicksort" funcional usual também não está no local - programadores funcionais como suas listas muito e uma classificação no local é com estado - altera o estado da matriz / o que quer que contenha os dados. Citações de susto, porque eu realmente não aceito que um quicksort fora do lugar seja um quicksort, ou que um heapsort fora do lugar seja um heapsort - pelo menos não sem dizer claramente que não é Lugar, colocar.
Steve314

1
@ Steve314, acho que vi algum material didático que diz algo com o efeito de "colocá-lo em uma pilha e depois puxar os elementos um de cada vez e colocá-los em uma matriz". Mas, depois de verificar o CLR , posso relatar que eles mostram uma versão no local.
Peter Taylor

2
@ PeterTaylor: Sim, o livro que eu estava revisando (Skiena) apresentou um monte de coisas construindo uma pilha extra.
usar o seguinte comando

4

Você pode estar perdendo o entendimento fundamental de que uma matriz pode ser usada para especificar o layout de uma árvore.

Suponha que você tenha uma árvore binária e um nó interior esteja no índice i da matriz. Em seguida, o índice de matriz do pai e filhos desse nó pode ser encontrado por:

Parent(i) = floor(i/2)
Left child(i) = 2i
Right child(i) = 2i + 1

Vejo:

http://www.personal.kent.edu/~rmuhamma/Algorithms/MyAlgorithms/Sorting/heapSort.htm

Como o heap pode ser mantido e organizado inteiramente em uma matriz, o heapsort pode ser executado no local movendo elementos ao redor da matriz de entrada. De fato, o heap é construído e manipulado usando a matriz de entrada original.


: Eu sei disso.Os problemas parecem ser que o livro que estou lendo apresentou um monte de coisas usando um heap separado. Não entendi ou achei que essa apresentação fosse para facilitar o entendimento do algoritmo (talvez? apresentado como aquele)
user10326

Eu recomendo que você compre o livro "Introdução aos algoritmos", de Cormen, et al. Responde claramente a todas as perguntas relacionadas ao algoritmo. Se você leva a sério uma carreira como cientista da computação ou engenheiro de software, precisa deste livro.
stackoverflowuser2010

1

Se, como você diz, realmente é necessário uma estrutura extra para construir o heap, o heapsort NÃO será realmente um algoritmo de classificação local.

No entanto, este não é o caso. Você pode construir o heap na mesma matriz que deseja classificar e, depois disso, aplicar o algoritmo heapsort, para que ele seja classificado no local.


Basicamente, existe um algoritmo "heapify", que é usado para reordenar dados em uma matriz, de modo a cumprir com as regras de uma pilha no tempo IIRC O (n). Consulte o pseudocódigo em programmers.stackexchange.com/questions/116904/… . Depois disso, é principalmente uma questão de extrair repetições de raiz de heap e acompanhar quanto da matriz ainda está "heap" e quanto é o resultado final classificado.
Steve314

0

Na ciência da computação, um algoritmo no local (ou em latim in situ) é um algoritmo que transforma a entrada usando uma estrutura de dados com uma quantidade pequena e constante de espaço de armazenamento extra. A entrada geralmente é substituída pela saída à medida que o algoritmo é executado. Um algoritmo que não está no local é chamado às vezes não no local ou fora do local.

Wikipedia - Algoritmo no local


Então, por que o mergesort é considerado um algoritmo não no local?
user10326

3
Esta não é uma resposta útil. Não tem nada a ver com heapsort e não responde à pergunta.
stackoverflowuser2010

Claro que tem algo a ver com heapsort. Heapsort é um algoritmo de classificação no local, como deve ficar claro na definição. Na verdade, ele estava vinculado a partir da página do heapsort.
Rein Henrichs

0

É considerado no local porque seus requisitos de espaço são insignificantes (constantes ou nenhum, se você estiver usando operações bit a bit para trocar itens). MergeSort, por exemplo, não está no lugar porque o conjunto de entrada não é modificado em cada iteração do exemplo de pesquisa.

A melhor maneira de ilustrar as diferenças entre algoritmos no local e fora do local é provavelmente observar o seguinte código de reversão de string C / C ++ que o faz no local (da K&R):

void reverse(char s[])
{
      int c, i, j;

      for (i = 0, j = strlen(s)-1; i < j; i++, j--) {
         c = s[i];
         s[i] = s[j];
         s[j] = c;
      }
}

Se você estivesse, por exemplo, lendo a string de entrada do final e colocando os caracteres em outro buffer, seria um algoritmo de reversão de string fora do lugar.


1
O Mergesort é irritante - é fácil convencer-se erroneamente de que você tem uma estratégia no local. Normalmente, ele funciona apenas para matrizes pequenas. No entanto, acho que baixei um artigo uma vez em que alguém elaborou uma variante no local do algoritmo de classificação por mesclagem. Vou ver se consigo encontrá-lo novamente.
Steve314
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.