Código de Programação Java de Trabalho de Opções de Inserção com Exemplo A classificação é colocar elementos em ordem crescente ou decrescente. O tipo de inserção é um algoritmo de classificação simples. Neste algoritmo de classificação. A matriz ordenada final pode ser compilada uma por vez. Para maiores dados. Quando comparado a outras técnicas de classificação, como triagem rápida. Tipo de pilha ou classificação de mesclagem, é curto. Leia também: Bubble Sort Java Code with Example O tipo de inserção é bom para usar para um pequeno número de elementos de entrada (menos de 1000). Você pode ver executando o algoritmo abaixo para (Entrada) (Espaço) (Tempo gasto) 10 elementos. O tipo de inserção levou 0 milissegundos de 100 elementos. O tipo de inserção levou 0 milissegundos em 1000 elementos. O tipo de inserção levou 0 milissegundos de 10000 elementos. O tipo de inserção levou 1 milissegundos de 100000 elementos. O tipo de inserção demorou 3 milissegundos. Você pode ver que não é uma decisão sábia usar o tipo de Inserção para um grande número de elementos, pois outros algoritmos demoram muito menos tempo. Notação Big O Em palavras simples. Big O permite-nos dizer algo sobre como o tamanho das entradas afeta o tempo de execução de um programa. Esta técnica também pode ser aplicada a outros recursos que um algoritmo ocupa (como a memória) e podemos analisar outros limites do que o limite superior como Como limite inferior no tempo ou espaço ou tempo ou espaço esperado que um algoritmo ocupa. É um algoritmo estável, ou seja, não altera a ordem relativa de elementos com teclas iguais. Muito baixo sobrecarga em linha, pode classificar uma lista à medida que a recebe. Média, caso mais mau, melhor caso. O (n) caso médio. O (n2) Pior caso. O (n2) 4.2 Ordenar e pesquisar O problema de classificação é reorganizar uma matriz de itens em ordem crescente. Nesta seção, vamos considerar detalhadamente dois algoritmos clássicos para ordenar e pesquisar a pesquisa binária e mergesortmdashalong com várias aplicações onde sua eficiência desempenha um papel crítico. Pesquisa binária. No jogo de vinte perguntas, sua tarefa é adivinhar o valor de um número secreto que é um dos n inteiros entre 0 e n menos1. Por simplicidade, assumiremos que n é uma potência de 2 e que as perguntas são da forma é o número maior ou igual a x Uma estratégia efetiva é manter um intervalo que contenha o número secreto, adivinhe o número no meio Do intervalo, e depois use a resposta para reduzir a metade o tamanho do intervalo. Questions. java implementa essa estratégia. É um exemplo do método geral de resolução de problemas conhecido como pesquisa binária. Análise do tempo de execução. Uma vez que o tamanho do intervalo diminui por um fator de 2 em cada iteração (e o caso base é atingido quando n 1), o tempo de execução da pesquisa binária é lg n. Abismo Linearndashlogarithm. A alternativa ao uso da busca binária é adivinhar 0, depois 1, depois 2, depois 3, e assim por diante, até bater o número secreto. Nós nos referimos a esse algoritmo como um algoritmo de força bruta: parece fazer o trabalho, mas sem muito respeito ao custo (o que pode impedir que ele realmente faça o trabalho para grandes problemas). No pior caso, o tempo de execução pode ser tanto quanto n. Representação binária. Se você olhar para o Binary. java. Você reconhecerá que a pesquisa binária é quase a mesma computação que a conversão de um número em binário. Cada compasso determina um bit da resposta. Por exemplo, se o número for 77, a sequência de respostas não sim sim não não sim não imediatamente produz 1001101, a representação binária de 77. Inverter uma função crescente f (x). Dado um valor y. Nossa tarefa é encontrar um valor x tal que f (x) y. Começamos com um intervalo (lo. Oi) conhecido por conter x e use a seguinte estratégia recursiva: Calcule o meio do lo (hi menos lo) 2 Caso base: Se (hi menos lo) é menor do que o delta, então mire como uma estimativa De x passo recursivo: caso contrário, teste se f (meio) y. Se for assim, procure por x em (lo. Mid) se não procurar x em (meio. Oi). O método inverso CDF () em Gaussian. java implementa essa estratégia para a função de densidade cumulativa gaussiana Phi. Nesse contexto, a busca em binário é muitas vezes chamada de busca por bisecão. Pesquisa binária em uma matriz ordenada. Um dos usos mais importantes da pesquisa binária é encontrar um item em uma matriz ordenada. Para fazer isso, veja o elemento da matriz no meio. Se contiver o item que você está procurando, você fez o contrário, você elimina o subarray antes ou depois do elemento intermediário da consideração e repita. BinarySearch. java é uma implementação deste algoritmo. Tipo de inserção. O tipo de inserção é um algoritmo de classificação de força bruta que se baseia em um método simples que as pessoas costumam usar para organizar as mãos de cartas. Considere os cartões um de cada vez e insira cada um no seu lugar adequado entre aqueles já considerados (mantendo-os ordenados) . O código a seguir imita esse processo em um método Java que classifica strings em uma matriz: no início de cada iteração do loop externo for, os primeiros elementos i na matriz estão em ordem ordenada, o loop interno move-se na sua posição correta Na matriz trocando-o com cada grande valor à esquerda, movendo-se da direita para a esquerda, até atingir a posição correta. Aqui é um exemplo quando eu tenho 6 anos. Este processo é executado primeiro com i igual a 1. Então 2. Então 3. E assim por diante, como ilustrado no seguinte rastreamento. Análise do tempo de execução. O loop interno do código de classificação de inserção está dentro de um loop duplo aninhado, o que sugere que o tempo de execução é quadrático, mas não podemos tirar imediatamente essa conclusão por causa da interrupção. Melhor caso. Quando a matriz de entrada já está em ordem ordenada, o número total de comparações em n e o tempo de execução é linear. Pior caso. Quando a entrada é reversa, o número de comparações é 12 n 2 e o tempo de execução é quadrático. Caso médio. Quando a entrada é ordenada aleatoriamente, o número esperado de compara é 14 n 2 e o tempo de execução é quadrático. Classificando outros tipos de dados. Queremos poder classificar todos os tipos de dados, não apenas cordas. Para ordenar objetos em uma matriz, precisamos apenas assumir que podemos comparar dois elementos para ver se o primeiro é maior do que, menor ou igual ao segundo. O Java fornece a interface Comparável para este propósito. Insertion. java implementa a classificação de inserção para que ele classifique matrizes de objetos comparáveis. Análise empirica. InsertionTest. java testa nossa hipótese de que o tipo de inserção é quadrático para arrays ordenados aleatoriamente. Mergesort. Para desenvolver um método de classificação mais rápido, usamos uma abordagem de divisão e conquista para o projeto de algoritmo que todo programador precisa entender. Para mergesort uma matriz, dividimos em duas metades, classificamos as duas metades de forma independente e, em seguida, mesclamos os resultados para classificar a matriz completa. Para ordenar alo, oi). Usamos a seguinte estratégia recursiva: caso base. Se o comprimento do subarray for 0 ou 1, ele já está classificado. Passo de redução. Caso contrário, calcula mid lo (hi-lo) 2. Ordenar recursivamente os dois subarrays alo, meio) e em meio, oi). E junte-os para produzir um resultado ordenado. Merge. java é uma implementação desta estratégia. Aqui está um rasto dos conteúdos da matriz durante uma mesclagem. Análise do tempo de execução. No pior caso, mergesort faz entre n lg n compara e o tempo de execução é linearitmático. Veja o livro para obter detalhes. Quadraticndashlinearithmm logro. A diferença entre n 2 e n lg n faz uma enorme diferença em aplicações práticas. Algoritmos de divisão e conquista. A mesma abordagem básica é eficaz para muitos problemas importantes, como você aprenderá se você fizer um curso sobre o design do algoritmo. Redução à classificação. Um problema A reduz-se a um problema B se pudermos usar uma solução para B para resolver A. Por exemplo, considere o problema de determinar se os elementos de uma matriz são diferentes. Esse problema reduz a classificação porque podemos classificar a matriz, fazer uma passagem linear através da matriz ordenada para verificar se qualquer entrada é igual à próxima (se não, os elementos são todos diferentes). Contagens de freqüência. FrequencyCount. java lê uma seqüência de cordas da entrada padrão e, em seguida, imprime uma tabela dos valores distintos encontrados e o número de vezes que cada uma foi encontrada, na ordem decrescente das freqüências. Realizamos isso por dois tipos. Informando as frequências. Nosso primeiro passo é classificar as strings na entrada padrão. Nesse caso, não estamos tão interessados no fato de que as cordas são colocadas em ordem ordenada, mas no fato de que a classificação traz cordas iguais. Se a entrada é, então, o resultado do tipo é com strings iguais, como as três ocorrências de juntas na matriz. Agora, com strings iguais todos juntos na matriz, podemos fazer uma única passagem através da matriz para calcular todas as freqüências. O tipo de dados Counter. java que consideramos na Seção 3.3 é a ferramenta perfeita para o trabalho. Classificando as freqüências. Em seguida, classificamos os objetos do contador. Podemos fazê-lo no código do cliente sem quaisquer arranjos especiais porque o Counter implementa a interface Comparável. Lei Zipfs. O aplicativo destacado em FrequencyCount. java é uma análise linguística elementar: quais palavras aparecem mais freqüentemente em um texto. Um fenômeno conhecido como lei de Zipfs diz que a freqüência da i palavra mais freqüente em um texto de palavras distintas é proporcional a 1 i. Escreva um filtro Dedup. java que lê cadeias de caracteres da entrada padrão e as imprime na saída padrão com todas as duplicatas removidas (em ordem ordenada). Exercícios criativos Esta lista de exercícios destina-se a dar-lhe experiência no desenvolvimento de soluções rápidas para problemas típicos. Pense em usar a pesquisa binária, mergesort ou planejar seu próprio algoritmo de divisão e conquista. Implementar e testar seu algoritmo. Tipo de número inteiro. Escreva um filtro de tempo linear IntegerSort. java que lê da entrada padrão uma seqüência de números inteiros que estão entre 0 e 99 e imprime para a saída padrão os mesmos inteiros em ordem ordenada. Por exemplo, apresentado com a seqüência de entrada seu programa deve imprimir a sequência de saída Três soma. Dada uma matriz de n inteiros, crie um algoritmo para determinar se três deles somam 0. A ordem de crescimento do tempo de execução do seu programa deve ser n 2 log n. Crédito extra . Desenvolva um programa que resolva o problema em tempo quadrático. Solução. ThreeSumDeluxe. java. Quicksort. Escreva um programa recursivo Quick. java que classifica uma série de objetos Comparáveis usando, como uma sub-rotina, o algoritmo de particionamento descrito no exercício anterior: Primeiro, escolha um elemento aleatório v como elemento de particionamento. Em seguida, particione a matriz em um subarray esquerdo contendo todos os elementos menores que v, seguido por um subarray do meio contendo todos os elementos iguais a v, seguido por um subarray direito contendo todos os elementos maiores que v. Finalmente, classifique recursivamente os submarinos esquerdo e direito. Reverse domain. Escreva um programa para ler uma lista de nomes de domínio a partir da entrada padrão e imprima os nomes de domínio reverso em ordem ordenada. Por exemplo, o domínio reverso de cs. princeton. edu é edu. princeton. cs. Esta computação é útil para a análise do log da web. Para fazer isso, crie um tipo de dados Domain. java que implementa a interface Comparável, usando ordem de nome de domínio reverso. Mínimo local em uma matriz. Dado um array a de n números reais, projete um algoritmo de tempo logarítmico para encontrar um mínimo local (um índice i tal que tanto ai-1 T, C G. Por exemplo, ATTTCGG e CCGAAAT são complementos reversos uns dos outros. Sufixo. A linearização de cordas circulares dos DNAs contém DNA em uma molécula circular em vez de uma linear. Para facilitar a pesquisa em um banco de dados de cordas de DNA, precisamos de um lugar para dividi-lo para formar um fio linear. Uma escolha natural é o lugar que Deixa a corda lexicograficamente mais pequena. Elabore um algoritmo para calcular esta representação canônica da string circular. Sugestão. Seleção de sufixo. Encontre todas as correspondências. Dê uma string de texto, encontre todas as correspondências da seqüência de consulta. Dica. Combine a seleção de sufixos e busca binária. Substring repetida com menos memória. Em vez de usar uma matriz de substrings onde sufixi se refere ao ith sufixo ordenado, mantenha uma matriz de números inteiros de modo que indexi se refira ao deslocamento do ith sufixo classificado. Para comparar as substrings rep Ressentido por um índice index e b, compare o caractere s. charAt (a) contra s. charAt (b). S. charAt (a1) contra s. charAt (b1). e assim por diante. Quanto memória você economiza Seu programa é mais rápido Tempo de inatividade. Suponha que uma máquina paralela processe n trabalhos. Job j é processado de s j para t j. Dada a lista de tempos de início e término, encontre o maior intervalo em que a máquina está ociosa. Encontre o intervalo maior onde a máquina não está ociosa. Mínimo local de uma matriz. Dada uma matriz N-by-N a de N 2 inteiros distintos, projete um algoritmo O (N) para encontrar um mínimo local. Um par de índices i e j tais que aij xj e yi yj. Um máximo é um ponto que não é dominado por nenhum outro ponto do conjunto. Elaborar um algoritmo O (n log n) para encontrar todos os máximos. Aplicação: no eixo x é a eficiência espacial, o eixo y é a eficiência do tempo. Maxima são algorítimos úteis. Dica: classificar em ordem crescente de acordo com a varredura de coordenadas x da direita para a esquerda, registrando o maior valor y visto até agora, e marque estes como máximos. Palavras compostas. Leia em uma lista de palavras da entrada padrão e imprima todas as palavras compostas de duas palavras. Se depois. pensamento . E depois da opinião estão na lista, então o pensamento depois é uma palavra composta. Nota: os componentes na palavra composta não precisam ter o mesmo comprimento. Smiths governa. O problema seguinte surge no gerenciamento da cadeia de suprimentos. Você tem um monte de trabalhos para agendar em uma única máquina. (Dê o exemplo.) Job j requer unidades pj do tempo de processamento. Job j tem um peso positivo wj que representa sua importância relativa - pense nisso como o custo de estoque de armazenar as matérias-primas para o trabalho j por 1 unidade de tempo. Se o trabalho j terminar a ser processado no tempo t, então custa t wj dólares. O objetivo é seqüenciar os trabalhos de modo a minimizar a soma dos tempos de conclusão ponderados de cada trabalho. Escreva um programa SmithsRule. java que lê em um parâmetro de linha de comando N e uma lista de N trabalhos especificados pelo tempo de processamento pj e seu peso wj, e produz uma seqüência ideal para processar seus trabalhos. Dica: use a regra de Smiths. Agendar os trabalhos em ordem de sua proporção de tempo de processamento para peso. Esta regra gananciosa é otimizada. Soma de quatro primos. A conjectura de Goldbach diz que todos os inteiros inteiros positivos maiores que 2 podem ser expressos como a soma de dois primos. Dado um parâmetro de entrada N (ímpar ou par), expresse N como a soma de quatro primos (não necessariamente distinto) ou informe que é impossível fazê-lo. Para tornar o seu algoritmo rápido para N grande, faça os seguintes passos: Calcule todos os primos inferiores a N usando o Peneiro de Eratóstenos. Tabule uma lista de somas de dois primos. Classifique a lista. Verifique se há dois números na lista que somam para N. Se assim for, imprima os quatro primos correspondentes. Digitando macacos e leis de poder. (Michael Mitzenmacher) Suponha que um macaco de digitação crie palavras aleatórias adicionando cada uma das 26 letras possíveis com probabilidade p para a palavra atual e finaliza a palavra com probabilidade 1 - 26p. Escreva um programa para estimar o espectro de freqüência das palavras produzidas. Digitando macacos e leis de poder. Repita o exercício anterior, mas suponha que as letras a-z ocorrem proporcionalmente às seguintes probabilidades, que são típicas do texto em inglês. Respondemos. O invariante do loop while diz o topo do bot 2. Isso implica bot Two sum to x. Dada uma lista ordenada de N inteiros e um inteiro alvo x, determine no tempo O (N) se existem dois que somam exatamente x. Dica. Mantenha um índice para 0 e oi N-1 e computee alo ahi. Se a soma for igual a x, você é feito se a soma for menor que x, decremente oi, se a soma for maior do que x, incremente. Tenha cuidado se um (ou mais) dos inteiros forem 0. Zero de uma função monotônica. Seja f uma função de aumento monotônico com f (0) 0. Encontre o inteiro mais pequeno i, de modo que f (i) 0. Elaborar um algoritmo que faça O (log N) chamar para f (). Dica. Supondo que conheçamos N, marinando um intervalo, oi, como flo 0 e aplique pesquisa binária. Se não conhecemos N, compute repetidamente f (1), f (2), f (4), f (8), f (16), e assim por diante até encontrar um valor de N tal que f (N) 0 . Bitonic max. Deixe uma ser uma matriz que começa a aumentar, atinge um máximo e, em seguida, diminui. Crie um algoritmo O (log N) para encontrar o índice do valor máximo. Pesquisa Bitônica. Uma matriz é bitônica se for composta por uma seqüência crescente de inteiros seguido imediatamente por uma seqüência decrescente de números inteiros. Dada uma matriz bitônica a de N inteiros distintos, descreva como determinar se um determinado número inteiro está na matriz em etapas O (log N). Dica: encontre o máximo, então pesquisa binária em cada peça. Mediana em duas matrizes ordenadas. Dado dois arrays ordenados de tamanho N 1 e N 2. Encontre a mediana de todos os elementos no tempo O (log N) em que N N 1 N 2. Dica. Projete um algoritmo mais geral que encontre o kth maior elemento para qualquer k. Calcule o elemento médio na grande das duas listas e jogue fora pelo menos 14 dos elementos e recorra. Nitidez do elemento. Dê uma matriz de N inteiros longos, crie um algoritmo O (N log N) para determinar se dois são iguais. Dica. A classificação traz valores iguais em conjunto. Contagem duplicada. Dê uma matriz ordenada de elementos N, possivelmente com duplicatas, encontre o índice da primeira e última ocorrência de k no tempo O (log N). Dê uma matriz ordenada de elementos N, possivelmente com duplicatas, encontre o número de ocorrências do elemento k no tempo O (log N). Dica. Modificar a pesquisa binária. Elemento comum. Escreva um método estático que toma como argumento três matrizes de strings, determina se existe uma string comum a todas as três matrizes e, em caso afirmativo, retorna uma dessas seqüências de caracteres. O tempo de execução do seu método deve ser linearitométrico no número total de cordas. Dica. Classifique cada uma das três listas e descreva como fazer uma mesclagem de 3 vias. Subcessão repetida mais longa. Escreva um programa LRS. java para encontrar a subsequência repetida mais longa em uma string. Encontre a substring repetida mais longa em seu livro favorito. Adicione um código ao LRS. java para torná-lo imprimir índices na cadeia original onde ocorre a subsequente repetição mais longa. Subcategoria comum mais longa. Escreva um método estático que encontre a substring comum mais longa de duas cadeias e s t. Dica. Suffix classifique cada string. Em seguida, junte os dois sufixos classificados. Corda repetida mais longa, não sobreposta. Modifique LRS. java para encontrar a subsequência repetida mais longa que não se sobrepõe. Palavras que rimam. Escreva um programa Rhymer. java que tabula uma lista que você pode usar para encontrar palavras que rimam. Use a seguinte abordagem: Leia em um dicionário de palavras em uma série de strings. Inverta as letras em cada palavra (a confusão torna-se dnuofnoc, por exemplo). Classifique a matriz resultante. Inverta as letras em cada palavra de volta à sua ordem original. Por exemplo, confundir é adjacente a palavras como astound e surround na lista resultante. Exemplo científico de classificação. Os resultados de pesquisa de exibição do Google em ordem decrescente de importância, uma planilha exibe colunas ordenadas por um campo específico, Matlab classifica os autovalores reais de uma matriz simétrica em ordem decrescente. A classificação também surge como uma sub-rotina crítica em muitas aplicações que parecem não ter nada a ver com a classificação, incluindo: compressão de dados (veja a atribuição de programação de Burrows-Wheeler), computação gráfica (casco convexo, par mais próximo), biologia computacional (maior comum Substring discutido abaixo), gerenciamento da cadeia de suprimentos (agendamento de tarefas para minimizar a soma ponderada dos tempos de conclusão), otimização combinatória (algoritmo Kruskals), escolha social e votação (distância Kendalls tau), historicamente, a classificação foi mais importante para aplicações comerciais, mas também classificando Desempenha um papel importante na infra-estrutura de computação científica. A NASA e a comunidade de mecânica de fluidos usam a classificação para estudar problemas no fluxo enrutado. Esses problemas de detecção de colisões são especialmente desafiantes, pois envolvem dez de bilhões de partículas e só podem ser resolvidos em supercomputadores em paralelo. Técnicas de classificação semelhantes são usadas em alguns códigos rápidos de simulação de N-corpo. Outra importante aplicação científica de classificação é para balanceamento de carga dos processadores de um supercomputador paralelo. Os cientistas confiam no algoritmo de classificação inteligente para realizar o balanceamento de carga em tais sistemas. Última modificação em 11 de novembro de 2016. Copy copy 2000ndash2016 Robert Sedgewick e Kevin Wayne. Todos os direitos reservados.
No comments:
Post a Comment