Como Merge Sort. QuickSort é um algoritmo Divide and Conquer. Ele seleciona um elemento como pivô e divide a matriz dada ao redor do pivô escolhido. Existem muitas versões diferentes do quickSort que selecionam o pivô de maneiras diferentes. Escolha sempre o primeiro elemento como pivô. Escolha sempre o último elemento como pivô (implementado abaixo) Escolha um elemento aleatório como pivô. Escolha a mediana como pivô. O processo-chave em quickSort é partition (). O alvo das partições é, dada uma matriz e um elemento x da matriz como pivô, coloque x na sua posição correta na matriz classificada e coloque todos os elementos menores (menores que x) antes de x, e coloque todos os elementos maiores (maiores que x) após X. Tudo isso deve ser feito em tempo linear. Pseudo Código para a função QuickSort recursiva: Algoritmo de Partição Pode haver muitas maneiras de fazer a partição, seguindo o pseudo código adota o método dado no livro CLRS. A lógica é simples, começamos a partir do elemento mais à esquerda e acompanhar o índice de menor (ou igual a) elementos como i. Ao atravessar, se acharmos um elemento menor, trocamos o elemento atual com arri. Caso contrário, ignorar elemento atual. Pseudo código para partição () Ilustração da partição (): Implementação: Seguem-se as implementações em C, Java e Python do QuickSort. Análise de QuickSort O tempo tomado pelo QuickSort em geral pode ser escrito como a seguir. Os dois primeiros termos são para duas chamadas recursivas, o último termo é para o processo de partição. K é o número de elementos que são menores do que pivô. O tempo gasto pelo QuickSort depende da matriz de entrada e da estratégia de partição. Seguem-se três casos. Pior caso: O pior caso ocorre quando o processo de partição sempre escolhe o elemento maior ou menor como pivô. Se considerarmos a estratégia de partição acima onde o último elemento é sempre escolhido como pivô, o pior caso ocorrerá quando a matriz já estiver ordenada em ordem crescente ou decrescente. A seguir é recorrência para o pior caso. Melhor Caso: O melhor caso ocorre quando o processo de partição sempre escolhe o elemento médio como pivô. A seguir é recorrência para o melhor caso. Caso médio: Para fazer a análise de caso média, precisamos considerar toda a permutação possível da matriz e calcular o tempo tomado por cada permutação que não parece fácil. Podemos ter uma idéia do caso médio considerando o caso quando a partição coloca elementos O (n9) em um conjunto e O (9n10) elementos em outro conjunto. A seguir é recorrência para este caso. Solução de recorrência acima é também O (nLogn) Embora o pior caso complexidade tempo de QuickSort é O (n 2) que é mais do que muitos outros algoritmos de classificação como Merge Sort e Heap Sort. QuickSort é mais rápido na prática, porque seu loop interno pode ser implementado de forma eficiente na maioria das arquiteturas e na maioria dos dados do mundo real. QuickSort pode ser implementado de diferentes maneiras, alterando a escolha do pivô, de modo que o pior caso raramente ocorre para um determinado tipo de dados. No entanto, o tipo de intercalação é geralmente considerado melhor quando os dados são enormes e armazenados em armazenamento externo. O que é 3-Way QuickSort No algoritmo QuickSort simples, selecionamos um elemento como pivô, partimos a matriz em torno de pivô e recur para subarrays à esquerda e à direita do pivô. Considere uma matriz que tem muitos elementos redundantes. Por exemplo, . Se 4 é escolhido como pivô no Simple QuickSort, corrigimos apenas um 4 e processamos recursivamente as ocorrências restantes. Em QuickSort de 3 vias, uma matriz arrl..r é dividida em 3 partes: a) arrl..i elementos menos do que pivô. B) elementos arri1..j-1 iguais ao pivô. C) arrj..r elementos maiores do que pivô. Veja isso para implementação. Podemos implementar QuickSort Iteratively Sim, por favor consulte Iterative Quick Sort. Por que Quick Sort é preferível a MergeSort para classificar Arrays Quick Sort em sua forma geral é um classificar no local (isto é, não requer qualquer armazenamento extra) enquanto o merge sort requer O (N) armazenamento extra, N denotando o tamanho do array que pode ser Bastante caro. Alocar e desalocar o espaço extra usado para o tipo de mesclagem aumenta o tempo de execução do algoritmo. Comparando a complexidade média encontramos que ambos os tipos de tipos têm complexidade média O (NlogN), mas as constantes diferem. Para matrizes, merge sort perde devido ao uso de extra O (N) espaço de armazenamento. A maioria das implementações práticas de Quick Sort usa a versão randomizada. A versão randomizada tem esperado complexidade de tempo de O (nLogn). O pior caso é possível na versão randomizada também, mas o pior caso não ocorre para um determinado padrão (como matriz ordenada) e randomizado Quick Sort funciona bem na prática. Quick Sort também é um algoritmo de classificação amigável de cache, pois tem boa localidade de referência quando usada para matrizes. A classificação rápida também é recursiva da cauda, portanto, as otimizações de chamada de cauda são feitas. Por que MergeSort é preferido sobre QuickSort para listas vinculadas No caso de listas ligadas o caso é diferente principalmente devido à diferença na alocação de memória de arrays e listas vinculadas. Ao contrário dos arrays, os nós de lista vinculados podem não estar adjacentes na memória. Ao contrário da matriz, na lista vinculada, podemos inserir itens no meio em O (1) espaço extra e O (1) tempo. Portanto, a operação de mesclagem do tipo de mesclagem pode ser implementada sem espaço extra para listas vinculadas. Em arrays, podemos fazer acesso aleatório como elementos são contínuos na memória. Digamos que temos um inteiro (4 bytes) matriz A e deixar o endereço de A0 ser x, em seguida, para acessar Ai, podemos acessar diretamente a memória em (x i4). Ao contrário de arrays, não podemos fazer acesso aleatório na lista vinculada. O Quick Sort requer muito deste tipo de acesso. Na lista vinculada para acessar o índice ith, temos que viajar cada nó da cabeça para o ith nó como nós não temos bloco contínuo de memória. Portanto, a sobrecarga aumenta para classificação rápida. O Merge sort acessa os dados sequencialmente ea necessidade de acesso aleatório é baixa. Lista de Lista de Códigos 1 (Introdução) Podemos pesquisar em uma lista vinculada classificada em melhor que O (n) tempo O pior caso de tempo de pesquisa para uma lista vinculada classificada é O N) uma vez que só podemos percorrer linearmente a lista e não podemos ignorar nós durante a pesquisa. Para uma árvore de pesquisa binária equilibrada, ignoramos quase metade dos nós após uma comparação com a raiz. Para uma matriz ordenada, temos acesso aleatório e podemos aplicar a Pesquisa Binária em matrizes. Podemos aumentar listas ligadas ordenadas para tornar a pesquisa mais rápida A resposta é Lista de ignorados. A idéia é simples, criamos várias camadas para que possamos saltar alguns nós. Consulte a lista de exemplos a seguir com 16 nós e duas camadas. A camada superior funciona como um 8220express lane8221 que conecta apenas as principais estações externas, ea camada inferior funciona como uma 8220normal lane8221 que conecta cada estação. Suponha que queremos procurar por 50, começamos a partir do primeiro nó de 8220express lane8221 e continuamos movendo em 8220express lane8221 até encontrar um nó cujo próximo é maior que 50. Uma vez que encontramos esse nó (30 é o nó no exemplo a seguir) on 8220express lane8221, passamos para 8220normal lane8221 usando ponteiro deste nó, e pesquisar linearmente 50 em 8220normal lane8221. No exemplo a seguir, partimos de 30 em 8220lane8221 e com pesquisa linear, encontramos 50. Qual é a complexidade de tempo com duas camadas? A complexidade de tempo de pior caso é o número de nós em 8220express lane8221 mais o número de nós em um segmento É o número de nós 8220normal lane8221 entre dois 8220express lane8221 nós) de 8220normal lane8221. Portanto, se temos n nós em 8220lane8221, nós radicn (raiz quadrada de n) em 8220express lane8221 e dividimos igualmente o 8220normal lane8221, então haverá nós radicn em cada segmento de 8220normal lane8221. Radicn é realmente divisão ótima com duas camadas. Com esta disposição, o número de nós atravessados para uma pesquisa será O (radicn). Portanto, com O (radicn) espaço extra, somos capazes de reduzir a complexidade do tempo para O (radicn). Podemos fazer melhor A complexidade de tempo de listas de ignorar pode ser reduzida ainda mais adicionando mais camadas. Na verdade, a complexidade de tempo de pesquisa, inserção e exclusão pode se tornar O (Logn) no caso médio. Em breve estaremos publicando mais posts sobre Skip Lists. Escreva comentários se encontrar algo incorreto ou quiser compartilhar mais informações sobre o tópico discutido acima. Escrever código no comentário Por favor use code. geeksforgeeks. org. Gerar link e compartilhar o link aqui. Carga Comentários Compartilhe este postMedian de duas matrizes classificadas Pergunta: Existem 2 matrizes classificadas A e B de tamanho n cada. Escreva um algoritmo para encontrar a mediana da matriz obtida após a fusão dos 2 arrays acima (isto é, matriz de comprimento 2n). A complexidade deve ser O (log (n)) É altamente recomendável que você clique aqui e praticá-lo, antes de passar para a solução. Mediana: Na teoria de probabilidade e estatística, uma mediana é descrita como o número que separa a metade superior de uma amostra, uma população, ou uma distribuição de probabilidade, a partir da metade inferior. A mediana de uma lista finita de números pode ser encontrada arranjando todos os números do valor mais baixo ao valor mais alto e escolhendo o meio. Para obter a mediana da matriz de entrada, primeiro classifique a matriz. Eu começo depois de classificar. Mediana é o elemento médio da matriz ordenada que é 12. Existem diferentes convenções para tomar a mediana de uma matriz com número par de elementos, pode-se tomar a média dos dois valores médios, ou primeiro valor médio ou segundo valor médio. Vamos ver métodos diferentes para obter a mediana de duas matrizes classificadas de tamanho n cada. Uma vez que o tamanho do conjunto para o qual estamos à procura de mediana é mesmo (2n), estamos tomando média de dois números médios em todas as soluções abaixo. Método 1 (contagem simples durante a mesclagem) Use o procedimento de mesclagem do tipo de mesclagem. Acompanhe a contagem ao comparar elementos de duas matrizes. Se a contagem se torna n (Para 2n elementos), atingimos a mediana. Tome a média dos elementos nos índices n-1 e n na matriz mesclada. Veja a implementação abaixo. Complexidade de tempo: O (n) Método 2 (Comparando as medianas de dois arrays) Este método funciona obtendo primeiro medianas das duas matrizes ordenadas e, em seguida, comparando-os. Sejam ar1 e ar2 os arrays de entrada. Para acima de dois conjuntos m1 15 e m2 17 Para os ar1 e ar2 acima, m1 é menor do que m2. Assim mediana está presente em um dos dois subarrays seguintes. Vamos repetir o processo para duas sub-redes acima: m1 é maior que m2. Assim, as sub-rotinas tornam-se Complexidade de Tempo: O (logn) Paradigma Algorítmico: Divida e Conquiste Por favor escreva comentários se você encontrar os códigosgoritmos acima incorretos, ou encontre outras maneiras de resolver o mesmo problema.
No comments:
Post a Comment