Vous êtes sur la page 1sur 6

Algoritmo de Seleo

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]

Base geral de seleo de algoritmo de partio


Um algoritmo de seleo geral de que eficaz na prtica, mas tem um desempenho pior caso dos pobres, foi concebido pelo inventor do quicksort , CAR Hoare , e conhecido como algoritmo de seleo de Hoare ou QuickSelect. Em quicksort, h uma chamada partio subprocedimento que pode, em tempo linear, o grupo de uma lista (que vo desde os ndices de left para right ) em duas partes, aqueles com menos de um certo elemento, e os maiores ou iguais ao elemento. Aqu i est pseudocdigo que executa uma partio sobre o elemento de list[pivotIndex] :
funo de partio (lista, esquerda, direita, pivotIndex) pivotValue: = lista [pivotIndex] swap lista [pivotIndex] ea lista [direita] / / Move piv ao fim storeIndex: = left para i, da esquerda para a direita Se lista [i] <pivotValue swap lista [storeIndex] ea lista [i] storeIndex incremento lista de trocas [direita] e [list storeIndex] / / Move piv pa ra o seu lugar final storeIndex retorno

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).

Seleo como classificao incremental


Uma das vantagens do e-abordagem ndice de classificao, como mencionado, a sua capacidade de amortizar o custo de classificao ao longo de muitas selees subseqentes. Entretanto, algumas vezes o nmero de selees que ser feito no

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)

SQL Server algoritmos de juno


Se voc ler os planos de execuo suficiente, voc provavelmente j percebeu que quando o SQL Server junta tabelas, usa diferentes algoritmos internos. Os trs algoritmos so:
y y y

Loop Join Merge Join Hash Join

Estes alogorithms que so utilizados so baseados em fatores de dados subjacentes.


Merge Join

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

Vous aimerez peut-être aussi