sábado, 15 de dezembro de 2012

Ordigo Adiciante

fonte: http://tiagomadeira.com/2006/01/ordenacao-por-insercao/ 
Ankaŭ konata kiel Inserción Ordigi, Inserción Ordo de la IS por enmeti ero n vektora jam bonorda n-1 elementoj. En ĉi tiu artikolo, mi donas al vi tiun simplan algoritmon por ordigi tabeloj.
La _pseudocode_ de inserción varo estas kiel sekvas:
  Unu. Por j \leftarrow{}  2 al vektora longo, fari
 2-a. Elemento \leftarrow{}  vektoro [j]
 3-a. Mi \leftarrow{}  j - 1
 4. Dum i> 0 kaj batalarangxis [i]> elemento, do
 5. Vektora [i +1] \leftarrow{}  tabelo [i]
 6-a. Mi \leftarrow{}  i - 1
 7. Weekend dum
 8. Array [i +1] \leftarrow{}  elemento
 9a. To-fino 
Klarigi Mi tion faros ion, kion mi ĉiam faras ripari mian algoritmoj, ŝajnigi mi estas la programo, kurante ĉiu paŝo permane (kompreneble mi kutime rapida ĉar mi ne bezonas skribi ĉion, kion mi faru). Ni komencu per la jena vektora v
v [1] v [2] v [3] v [4] v [5] v [6]
5 3 7 8 2 5
Tiam sendu al mi la kodon por starti kun j=2 kaj persisti ĝis la longo de la vektoro (6). La unua ordo Li donas al mi estas stoki la elemento a[j] ( a[2] ) En la variablo elemento. Provizi ĉiujn ekspliko mi ĉiam pentras la griza v[j] kie mi estas (ĉi-kaze, la dua ero de la tabelo, 3) kaj la nigra vektoro ne ordema (elementoj \geq{}j ).
v [1] v [2] v [3] v [4] v [5] v [6]
5 3 7 8 2 5
Tiam li diras al mi ke i \leftarrow{} j-1 . Tiel, i=1 . Kaj nun li min iom (kio povus esti anstataŭita de por) kie mi devus iri mia malpliigi. Ni eniras en la buklo ...
Nu, mia i =1 estas pli granda ol 0. v[1]=5 estas pli granda ol elemento=3 ? Jes, do ni eniri la korpon dum ... Tie li diras al mi fari vetor[i+1] = vetor[i] , Kiu en ĉi tiu kazo estas fari v[2]=v[1]=5 .
v [1] v [2] v [3] v [4] v [5] v [6]
5 5 7 8 2 5
Kaj nun mi subtrae de valoro. Tiel, i=0 . Li revenas al la momento, sed ne nun kontentigi la kondiĉo i>0 Tial ĝi lasis la tempon. Tiam li petas vetor[i+1]=elemento ( v[1]=elemento ). Sekve, la vektoro aspektas jene:
v [1] v [2] v [3] v [4] v [5] v [6]
3 5 7 8 2 5
Kaj pliigo la j nun j=3 .
v [1] v [2] v [3] v [4] v [5] v [6]
3 5 7 8 2 5
elemento = 7i = 3-1 = 2i > 0 E ... 5 > 7 ? Neniu! Do ne eniras la tempon.
v[3] = elemento (No ŝanĝi)
Kaj tie ni iru j=4 kaj daŭrigante ĝis ni ordo vektoro:
v [1] v [2] v [3] v [4] v [5] v [6]
2 3 5 5 7 8

Kio estas la logiko?

Kiel mi diris en la enkonduko, sed sen tre klarigo, la Inserción Ordo de la vektora dividas en du. La unua (elementoj <j ) Enhavas ĉiujn ĝiajn valorojn ordo kaj dua (elementoj \geq{}j ) Enhavas la valoroj por esti enmetita en la unuan vektoro jam ordigis (tiel li nomis Inserción Algoritmo).
La ŝlosilo por la algoritmo okazos dum movo ĉiuj eroj por via enhavo +1 dum la elemento estas pli mallonga ol ili (post la elemento meti kie cxesis).
La variablo elemento nur utilas por ne perdi la valoro de v[j] (Ĉar tiam ni v[i+1]=v[i] kiam i=j-1 )
Mi kredas, ke sendube forlasis super. Preni alian rigardon kaj provu apliki la algoritmon. Se vi pli malfacile ĝin, metis debug mesaĝojn kompreni la strategia algoritmo. (Eg frua meti presi la valoro de j kaj la komenco de ĉiu loko kiel presi la valoroj elemento, i kaj v [i])

Kosti

Vi eble rimarkis ke ĉi tiu algoritmo havas fiksan kosto. Se la tuta vektoro estas ordigita, ĝi neniam bezonos ankaŭ persisti la i kaj sekve kuros pli rapide ol se la tuta vektoro estas en descendanta ordo (kiel li ĉiam bezonas persisti i ĝis la fino - 0). Do, en ĉi tiu artikolo, mi volas ilin prezenti la analizo de algoritmoj bazita sur kazoj. Por ĉi tiu programo, ni diras:
  • Bona okazo estas kiam ĉiuj elementoj estas jam ordigis. Kosto: \Theta{}(n)
  • Plej malbona okazo estas kiam la elementoj estas en malsuprenira ordo. Kosto: \Theta{}(n^{2})
En iuj programoj la averaĝa okazo estas ankaŭ grava sed ne estas la kazo de inserción varon. Ni vidas, ke estas tre granda diferenco inter la kosto de la du kazoj. Do ni bezonas scii kie nia algoritmo estos implementado kaj kion la eblojn de li esti la plej bona aŭ malbona afero. En ĝenerala, la plej malbona kazo estas la plej komuna ... Sekve, ni diros, ke la kosto de ĉi tiu algoritmo estas \Theta{}(n^{2}) .

Nenhum comentário:

Postar um comentário