Académique Documents
Professionnel Documents
Culture Documents
Em cincia da computao, um algoritmo de seleo um algoritmo para encontrar o k-sima menor nmero em uma lista (como um nmero chamado de ksima estatstica de ordem ). Isto inclui os casos de encontrar o mnimo , mximo e mediana elementos. Existem O (n), o pior caso de tempo linear, algoritmos de seleo. A seleo um subproblema de problemas mais complexos como o vizinho mais prximo problema e do caminho mais curto problemas. O termo "" seleco utilizada em outros contextos em cincia da computao, incluindo a fase de um algoritmo gentico em que os genomas so escolhidos de uma populao para posterior reproduo, consulte Seleo (algoritmo gentico) . Este artigo aborda apenas o problema de determinar estatsticas de ordem.
Exemplo1: funo select (lista [1 .. n], k) para i de 1 a k minindex = i minValue lista = [i] para j de i +1 at n se a lista [j] minValue < minindex j = minValue lista = [j] swap lista [i] e [list minindex] voltar lista de [k]
Em quicksort, ns recursivamente classificar ambos os ramos, levando a melhor caso (n log n) tempo. No entanto, ao fazer a seleo, j sabemos que a nossa partio reside no elemento desejado, uma vez que o piv esteja na sua posio final classificada, com todos aqueles que o precederam na ordem de classificao e todos aqueles que se lhe
segue na ordem de classificao. Assim, uma nica chamada recursiva localiza o elemento desejado na partio correta:
funo select (lista, esquerda, direita, k) se para a esquerda = direita, / / Se a lista contm apenas um elemento lista de retorno [esquerda] / / Retorna o elemento pivotIndex escolha entre esquerda e direita pivotNewIndex: partition = (lista, esquerda, direita, pivotIndex) pivotDist: pivotNewIndex = - 1 + esquerda / / O piv est em sua posio final c lassificada, / / Assim pivotDist reflete sua posio com base em uma lista se foram classificados if = k pivotDist retorno lista [pivotNewIndex] else if pivotDist <k retorno de seleo (lista, deixou pivotNewIndex, - 1, k) mais retorno de seleo (lista, pivotNewIndex + 1, direita, k pivotDist)
Observe a semelhana com quicksort: assim como a seleo baseada em algoritmos mnimo uma espcie de seleo parcial, este um quicksort parcial, gerando e particionamento apenas O (log n) de seu S (n) parties. Este procedimento simples tem esperado desempenho linear e, como quicksort, tem muito bom desempenho na prtica. tambm um algoritmo de lugar , necessitando apenas de sobrecarga de memria constante, uma vez que a recurso pode ser eliminada com um loop como este:
funo select (lista, esquerda, direita, k) loop pivotIndex escolha entre esquerda e direita pivotNewIndex: partition = (lista, esquerda, direita, pivotIndex) pivotDist: pivotNewIndex = - 1 + esquerda if = k pivotDist retorno lista [pivotNewIndex] else if pivotDist <k direita: pivotNewIndex = - 1 mais k: k = - pivotDist esquerda: + 1 = pivotNewIndex
Como quicksort, o desempenho do algoritmo sensvel dinmica que escolhido. Se pivs ruins so sempre escolhidos, esta degrada a seleo baseada em mnimos descritos anteriormente, e assim pode exigir tanto quanto O n 2) tempo (. David Musser descreve uma "mdia de trs-killer" seqncia que pode forar o conhecido mediana-de-trs algoritmo de seleo de piv para falhar com comportamento de pior caso (ver Introselect seo abaixo).
conhecido antecipadamente, e podem ser pequenas ou grandes. Nestes casos, podemos adaptar os algoritmos acima indicado, para selecionar um elemento, simultaneamente, enquanto parte da lista de classificao, acelerando assim selees futuras. Tanto o procedimento de seleco com base em encontrar -mnimo ea uma base de particionamento pode ser visto como uma forma de ordenao parcial. O algoritmo classifica mnimo baseado na lista at o ndice, e to claramente acelera selees futuras, especialmente dos ndices menores. O algoritmo baseado na partio no tenham o mesmo comportamento automaticamente, mas pode ser adaptado para lembrar as suas escolhas anteriores piv e reutiliz-los sempre que possvel, evitando as operaes de partio caro, principalmente o de nvel superior. A lista se torna gradualmente mais classificadas como operaes mais partio so feitas de forma incremental, sem pivs so sempre "perdido". Se desejar, essa lista dinmica mesmos poderiam ser transferidos para quicksort para a reutilizao, novamente evitando muitas operaes de partio caro.
Optimizado algoritmos de ordenao
Mais eficiente do que qualquer um desses so especializados algoritmos de ordenao parcial com base mergesort e quicksort . O mais simples a variao do quicksort: no h necessidade de ordenar recursivamente parties que contm apenas elementos que cairia depois do k lugar no final. Assim, se o piv de quedas em k posio ou mais tarde, ns recurse apenas na partio esquerda:
quicksortFirstK funo (lista, esquerda, direita, k) se o direito> esquerdo pivotIndex escolha entre esquerda e direita pivotNewIndex: partition = (lista, esquerda, direita, pivotIndex) quicksortFirstK (lista, esquerda, pivotNewIndex -1, k) se k <pivotNewInd ex quicksortFirstK (lista, pivotNewIndex 1, direita, k)
O algoritmo resultante requer um tempo de espera de apenas O (k + n log k), e bastante eficiente na prtica, especialmente se pensarmos numa espcie de seleo ao k se torna pequeno em relao ao n. No entanto, a complexidade de tempo do pior caso ainda muito ruim, no caso de uma seleo do piv ruim. Pivot seleo ao longo das linhas de pior caso de algoritmo linear do tempo de seleo pode ser usado para obter um melhor desempenho no pior caso. Ainda melhor se no exigir que os itens k ser eles mesmos classificados. Perder essa exigncia significa que podemos ignorar todas as parties que se encontram inteiramente antes ou depois do k lugar. Ns recurse apenas para a partio que realmente contm o elemento th k si.
quickfindFirstK funo (lista, esquerda, direita, k) se o direito> esquerdo pivotIndex escolha entre esquerda e direita pivotNewIndex: partition = (lista, esquerda, direita, pivotIndex) se k> pivotNewIndex / novo / condio quickfindFirstK (lista, esquerda, pivotNewIndex -1, k) se k <pivotNewIndex quickfindFirstK (lista, pivotNewIndex 1, direita, k)
Para a maior parte, este o mtodo mais eficiente de unir as tabelas. Como o nome indica, ambas as tabelas so essencialmente fundidos, tal como um zper sendo compactado. Isso geralmente ocorre quando ambas as tabelas que esto sendo unidas, so unidos em chaves que so pr-classificados e conter todos as mesmas chaves em ambas as tabelas (por exemplo participar de uma chave primria com uma chave estrangeira). Quando uma tabela contm chaves que a outra tabela no tem, a chance de juntar-se a fuso a ser utilizado menos provvel. O perfil fsico de uma juno por mesclagem o uso da CPU muito pouco, e l muito pouco comparado com outros tipos de associaes.
Loop Join
O lao de unio mais intensivo da CPU do que uma juno por mesclagem. Esta unio ocorre normalmente quando uma mesa de trabalho um pouco menor do que o outro. Como a palavra implica loop, o menor se juntou a tabela que est sendo for repetido at encontrar a chave correspondente na tabela (maior) exterior. Esta juno mais eficiente quando a sada resultante menor do que 5000 linhas. Quando maior do que isso, a CPU l e faz a associao menos eficiente.
Hash Join
Um hash o menos eficiente de todas as associaes, no entanto isso no significa que no necessrio. Quando grandes tabelas esto sendo unidas, e no todas as chaves do comum se juntam existem em ambos os lados e / ou eles no so ordenados, este tipo de associao pode ser escolhido. Como a palavra implica Hash, um hash criado em todas as linhas para a chave comuns em cada mesa, essencialmente quebrar a tabela em torno de 7 baldes. Depois que a tabela foi dividida em estes baldes separados, os baldes em si so unidos, resultando em uma pequena comparao entre um conjunto de resultados. Dentro do Hash Join, existem 3 tipos distintos de hash (em memria, Grace, e recursiva). Estas junes de hash so segragated de acordo com a quantidade de memria necessria para cri-las. Essencialmente, o hash seguem a mesma metodologia de escalonamento de bloqueio. Quando uma juno de hash est tomando muita
memria, digite o prximo mais alto de hash escalado para os baldes e empurra para o disco.
Usando referncias de consulta para os tipos de juno
Cada vez mais, eu no recomendo usar as dicas de consulta para o SQL Server. Com o SQL Server 2000 eu estava mais apto a usar as dicas de consulta. No entanto, como o otimizador fica mais esperto, e mais a atualizao, voc nunca sabe o que o otimizador de consulta vai escolher para a consulta ou porque escolh-lo. Dito isto, sim, voc pode especificar dicas de consulta para os tipos de juno. Para fazer isso, consulte as seguintes consultas: <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-srctext" style="direction: ltr; text-align: left">SELECT *</span> SELECT *</span> <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-srctext" style="direction: ltr; text-align: left">FROM Sales.SalesOrderDetail sod</span> DA Sales.SalesOrderDetail sod</span> <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-srctext" style="direction: ltr; text-align: left">INNER MERGE JOIN Sales.SalesOrderHeader soh</span> INNER JOIN MERGE soh Sales.SalesOrderHeader</span> <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-srctext" style="direction: ltr; text-align: left">ON sod.SalesOrderID = soh.SalesOrderID</span> SOBRE sod.SalesOrderID = soh.SalesOrderID</span> <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-srctext" style="direction: ltr; text-align: left">SELECT *</span> SELECT *</span> <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-srctext" style="direction: ltr; text-align: left">FROM Sales.SalesOrderDetail sod</span> DA Sales.SalesOrderDetail sod</span> <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-srctext" style="direction: ltr; text-align: left">INNER LOOP JOIN Sales.SalesOrderHeader soh</span> LOOP INNER JOIN soh Sales.SalesOrderHeader</span> <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-srctext" style="direction: ltr; text-align: left">ON sod.SalesOrderID = soh.SalesOrderID</span> SOBRE sod.SalesOrderID = soh.SalesOrderID</span> <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-
text" style="direction: ltr; text-align: left">SELECT *</span> SELECT *</span> <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-srctext" style="direction: ltr; text-align: left">FROM Sales.SalesOrderDetail sod</span> DA Sales.SalesOrderDetail sod</span> <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-srctext" style="direction: ltr; text-align: left">INNER HASH JOIN Sales.SalesOrderHeader soh</span> HASH INNER JOIN soh Sales.SalesOrderHeader</span> <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-srctext" style="direction: ltr; text-align: left">ON sod.SalesOrderID = soh.SalesOrderID</span> SOBRE sod.SalesOrderID = soh.SalesOrderID</span>
Referencias Bibliograficas
y
http://translate.google.com.br/translate?hl=ptBR&langpair=en|pt&u=http://sqlserverplanet.com/query-optimizer/sqlserver-join-algorithms/ http://translate.google.com.br/translate?hl=ptBR&langpair=en|pt&u=http://en.wikipedia.org/wiki/Selection_algorithm