Johdanto
tässä opetusohjelmassa aiomme oppia yhdistämään kaksi lajiteltua ryhmää yhdeksi lajitelluksi ryhmäksi.
ongelma
ymmärretään ongelma. Meillä on kaksi lajiteltua ryhmää, ja haluaisimme yhdistää ne yhdeksi.
algoritmi
kun analysoimme ongelmaa, on melko helppo havaita, että voimme ratkaista tämän ongelman käyttämällä Merge Sort-yhdistämisoperaatiota.
sanotaan, että meillä on kaksi lajiteltua arrays foo ja bar Pituus fooLength ja barLength, vastaavasti. Seuraava, voimme julistaa Toisen array yhdistetty koko typeryys + barLength.
meidän pitäisi sitten kulkea molemmat taulukot samassa silmukassa. Säilytämme jokaisen indeksiarvon, fooPosition ja barPosition. On tietyn iteraation meidän silmukka, otamme kumpi array on pienempi-arvostettu Elementti niiden indeksi ja etukäteen, että indeksi. Tämä elementti miehittää seuraavan aseman yhdistetyssä array.
lopuksi, kun olemme siirtäneet kaikki elementit yhdestä matriisista, kopioimme loput toisesta yhdistettyyn matriisiin.
nyt katsotaan prosessi kuvina, jotta algoritmia voidaan ymmärtää paremmin.
Vaihe 1:
aloitamme vertaamalla molempien ryhmien alkuaineita, ja valitsemme pienemmän.
Then we increase the position in the first array.
Vaihe 2:
tässä kasvatetaan paikkaa toisessa ryhmässä ja siirrytään seuraavaan elementtiin, joka on 8.
Vaihe 3:
tämän iteraation lopussa olemme läpikäyneet kaikki ensimmäisen rivin elementit.
Vaihe 4:
tässä vaiheessa kopioimme vain kaikki jäljellä olevat alkuaineet toisesta matriisista tulokseksi.
Implementation
nyt katsotaan, miten se toteutetaan:
public static int merge(int foo, int bar) { int fooLength = foo.length; int barLength = bar.length; int merged = new int; int fooPosition, barPosition, mergedPosition; fooPosition = barPosition = mergedPosition = 0; while(fooPosition < fooLength && barPosition < barLength) { if (foo < bar) { merged = foo; } else { merged = bar; } } while (fooPosition < fooLength) { merged = foo; } while (barPosition < barLength) { merged = bar; } return merged;}
ja jatketaan lyhyellä testillä:
@Testpublic void givenTwoSortedArrays_whenMerged_thenReturnMergedSortedArray() { int foo = { 3, 7 }; int bar = { 4, 8, 11 }; int merged = { 3, 4, 7, 8, 11 }; assertArrayEquals(merged, SortedArrays.merge(foo, bar));}
Complexity
kuljemme molempien ryhmien läpi ja valitsemme pienemmän elementin. Loppujen lopuksi kopioimme loput elementit foo: sta tai bar array: sta. Joten aika monimutkaisuus tulee O (fooLength + barLength). Olemme käyttäneet varajärjestelmää saadaksemme tuloksen. Joten avaruuden monimutkaisuus on myös O (fooLength + barLength).
johtopäätös
tässä opetusohjelmassa opimme yhdistämään kaksi lajiteltua ryhmää yhdeksi.