Monday 10 July 2017

Moving Average Geeksforgeeks


Merge Sort Like QuickSort. Merge Sort é um algoritmo Divide and Conquer. Ele divide matriz de entrada em duas metades, chama-se para as duas metades e depois mescla as duas metades classificadas. A função de mesclagem () é usada para mesclar duas metades. A fusão (arr, l, m, r) é um processo chave que pressupõe que arrl..m e arrm1..r sejam ordenados e mesclados os dois sub-arrays classificados em um. Veja a seguinte implementação do C para obter detalhes. O seguinte diagrama da wikipedia mostra o processo completo de classificação de mesclagem para uma matriz de exemplo. Se olharmos mais de perto o diagrama, podemos ver que a matriz é recursivamente dividida em duas metades até o tamanho se tornar 1. Uma vez que o tamanho se torna 1, os processos de mesclagem entram em ação e começam a mesclar arrays até a matriz completa Mesclado. Complexidade do tempo: classificando matrizes em diferentes máquinas. Merge Sort é um algoritmo recursivo e a complexidade do tempo pode ser expressa como a seguinte relação de recorrência. T (n) 2T (n 2) A recorrência acima pode ser resolvida usando o método da Árvore de Recorrência ou o Método Mestre. Caia no caso de II do Método Mestre e solução da recorrência. A complexidade de tempo de Merge Sort é em todos os 3 casos (pior, médio e melhor), pois o tipo de mesclagem sempre divide a matriz em duas metades e leva tempo linear para combinar duas metades. Paradigma algorítmico: dividir e conquistar Classificar no local: Não em uma implementação típica Aplicações de Merge Sort Merge Sort é útil para ordenar listas vinculadas no tempo O (nLogn). No caso de listas vinculadas, 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 da lista vinculada podem não ser 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). Portanto, a operação de mesclagem de mesclagem pode ser implementada sem espaço extra para listas vinculadas. Nos arrays, podemos fazer acesso aleatório, pois os elementos são contínuos na memória. Digamos que temos uma matriz A inteira (4 bytes) e deixe o endereço de A0 ser x para acessar Ai, podemos acessar diretamente a memória em (x i4). Ao contrário dos arrays, não podemos fazer acesso aleatório na lista vinculada. A classificação rápida exige muito deste tipo de acesso. Na lista vinculada para acessar ith índice, temos que viajar todos e cada nó da cabeça para o i-ésimo nó porque não temos um bloco contínuo de memória. Portanto, a sobrecarga aumenta para ordenamento rápido. A classificação de mesclagem acessa os dados sequencialmente e a necessidade de acesso aleatório é baixa. Problema de contagem de inversão usado na classificação externa Tabela 1: Máximos de todas as janelas deslizantes com tamanho 3 em uma matriz. Um par de suportes indica uma janela deslizante. Análise: não é difícil obter uma solução com força bruta: digitalize números em cada janela deslizante para obter seu valor máximo. A complexidade do tempo total é O (nk) se o comprimento da matriz é n e o tamanho das janelas deslizantes é k. A solução da nave não é a melhor solução. Vamos explorar melhores soluções. Solução 1: valor máximo em uma fila Uma janela pode ser vista como uma fila. Quando desliza, um número é empurrado para trás, e a frente está desligada. Portanto, o problema é resolvido se pudermos obter o valor máximo de uma fila. Não há abordagens diretas para obter o valor máximo de uma fila. No entanto, existem soluções para obter o valor máximo de uma pilha, que é semelhante à solução introduzida no blog 8220Stack com função min () 8221. Além disso, uma fila também pode ser implementada com duas pilhas (os detalhes são discutidos em outro blog 8220Queue implementado com Two Stacks 8221). Se um novo tipo de fila for implementado com duas pilhas, em que uma função max () é definida para obter o valor máximo, o valor máximo em uma fila é o maior número de dois números máximos em duas pilhas. Esta solução é viável. No entanto, talvez não possamos tempo suficiente para escrever todo o código para implementar nossas próprias estruturas de dados de filas e filas durante as entrevistas. Continuemos explorando uma solução mais concisa. Solução 2: Salvando o valor máximo na frente de uma fila Em vez de empurrar todos os números dentro de uma janela deslizante em uma fila, tentamos empurrar os candidatos do máximo somente para uma fila. Deixe-nos levar a matriz como um exemplo para analisar a solução passo a passo. O primeiro número na matriz é 2, nós o colocamos em uma fila. O segundo número é 3, que é maior do que o número anterior 2. O número 2 deve ser deslocado, porque é menor que 3 e não tem chance de ser o valor máximo. Há apenas um número na fila quando colocamos 2 na parte de trás e empurre 3 na parte de trás. As operações são semelhantes quando empurra o próximo número 4. Existe apenas um número 4 na fila. Agora, a janela deslizante já possui três elementos, podemos obter o valor máximo na frente da fila. Continuamos a empurrar o quarto número. É empurrado na parte traseira da fila, porque é menor que o número anterior 4 e pode ser um número máximo no futuro quando os números anteriores são desligados. Existem dois números, 4 e 2, na fila, e 4 é o máximo. O próximo número a ser empurrado é 6. Uma vez que é maior do que os números existentes, 4 e 2, esses dois números podem ser exibidos porque não têm chance de ser o máximo. Agora, há apenas um número na fila, que é 6, depois que o número atual é pressionado. Claro, o máximo é 6. O próximo número é 2, que é empurrado para a parte de trás da fila porque é inferior ao número anterior 6. Existem dois números na fila, 6 e 2 e o número 6 no A frente da fila é o valor máximo. É hora de empurrar o número 5. Como é maior do que o número 2 na parte de trás da fila, 2 é desligado e depois 5 são pressionados. Existem dois números na fila, 6 e 5, e o número 6 na frente da fila é o valor máximo. Agora, deixe-nos pressionar o último número 1. Pode ser empurrado para a fila. Percebe-se que o número na frente está além do escopo da janela deslizante atual, e deve ser deslocado. Como saber se o número na frente da fila está fora da janela deslizante Ao invés de armazenar números na fila diretamente, podemos armazenar índices em vez disso. Se a distância entre o índice na frente da fila e o índice do número atual a ser empurrado for maior ou igual ao tamanho da janela, o número correspondente ao índice na fonte da fila está fora da janela deslizante. O processo de análise acima está resumido na Tabela 2. Tabela 2: O processo para obter o número máximo em todas as janelas deslizantes com tamanho de janela 3 na matriz. Na coluna 8220Indices na fila 8221, o número dentro de um par de parênteses é o número indexado pelo número antes dele na matriz. Podemos implementar uma solução baseada na análise acima. Algum código de exemplo em C é mostrado abaixo, que utiliza o tipo deque de STL. Vectorlt int gt maxInWindows (const vectorial int gtamp numbers, int windowSize) vectorlt int gt maxInSlidingWindows se (numbers. size () gt windowSize ampamp windowSize gt 1) a solução 2 realmente controla todo o máximo possível na janela deslizante. Então, quando a janela se move, precisa decidir se deseja ou não excluir o primeiro número na fila e, em seguida, coloque o novo número na fila e compare o novo número com o segundo número mais recente nessa fila, se o segundo número mais recente É menor do que excluir esse número e, em seguida, compare com o terceiro número mais recente. Então, no pior dos casos, acho que é a complexidade do tempo O (nk). O que é muito ruim.

No comments:

Post a Comment