Sisekaemuslik
Kui sa oled IT inimene, siis sa saad ehk aru sellest tekstist, kui sa ei ole it inimene siis vaata järgmist lõiku:
igaljuhul mul on hetkel käsil sorteerimisalgoritmide analüüs, igast udupeened algoritmid plus veel üks eriti udupeen introsort/introspective sort/ ehk siis minu loodud tõlke järgi sisekaemuslik meetod, mis peaks olema hästi taibukas ja kiire… alguses alustab sorteerimist kiirsordiga ja kui asi võssa hakkab minema, läheb kuhjameetodile üle…
igal juhul peaks ta töötama umbes sama kiirelt kui kiirmeetod (quicksort) ja üldiselt kiiremini kui teised kiirsordi laadsed. no ma siis kirjutasin introsorti koodi ära ja hakkasin testima …
no ja krt ükskõik kuda ma need elemendid massiivis paika panen - vastupidises järjekorras, õiges järjekorras või mida iganes, introsordi tööaeg kahtlaselt aeglane no nii 2-3 korda aeglasem, kui kiirsort, ühildusmeetod ja teised tublimad… kahtlane… mässan ja mässan (Jaana mässab ;);)), uurin netist et noh pmst introsort peaks oma ülima tubliduse saavutama siis kui kiirsordil on oht töötada ruutkeerukusega, siis uurin kuda saavutada quicksordi halvimat juhtu (muide väga raske ja haruldane)
ja siis lõpuks avastasin…
//sorteerimisalgoritm alustab massiivi sorteerimist kiirmeetodiga ning kui selle rekursiivsete
//väljakutsete arv ületab arvu maksrekursioone (ehk läheneb ruutkeerukusele), siis jätkatakse sorteerimist kuhjameetodiga.
public void sisekaemuslikmeetod(int[] massiiv, int maksrekursioone) {
while(kiirmeetodirekursioonidearv < maksrekursioone) {
kiirmeetod(massiiv, 0, massiiv.length - 1);
}
kuhjameetod(massiiv);
}
ehk siis, ma kõigepealt sortisin kiirmeetodiga massiivi ära ja siis igaksjuhuks sorteerisin veel kuhjameetodiga üle… sellest ka topelt aeg… arva ära, kaua ma seda viga otsisin
Kui sa oled mitte-IT inimene, siis sa saad ehk aru sellest tekstist:
Jaanal on arvutis üks programm, mis peab lahendama üht konkreetset ülesannet, selle programmi sees on ülesande lahendamiseks kaks erinevat meetodit. Programm on kaval, ta algul hakkab ülesannet lahendama ühe meetodiga ja kui selgub, et selle meetodiga läheb jõle kaua aega, siis annab lahendamise üle teisele tublile töömehele. Ühesõnaga kui esimene meetod hakkama ei saa annab ta töö teisele üle, aga ta annab selle töö teisele üle ainult, siis kui ta hakkama ei saa… Ühesõnaga see tubli programm (mille sees on kaks tublit töömeest) peaks probleemi lahendama vähemalt sama kiiresti kui teised aga tavaliselt ikka kiiremini.
No ja mis mul juhtus, see tubli programm, mis peaks teistest kõigist tublim olema… töötas alati kõige aeglasemalt, lausa kaks korda aeglasemalt…
arva miks :P?
sellepärast, et programm mitte ei teinud seda, mida ma tahtsin, et ta teeks, vaid seda, mida ma käskisin tal teha…
seega, tegelik oli selline:
esimene meetod hakkas ilusti ülesannet lahendama, tavaliselt tal ei tekkinud selle lahendamisega probleeme ning ei olnud ka vajadust, ülesande lahendamine teisele töömehele üle anda…
aga mina olin programmil käskinud nii teha:
kõigepealt las esimene lahendab ülesande ära ja siis teine lahendagu igaksjuhuks üle…
sellest siis ka selle suure programmi topeltlahendusaeg …
ja arva ära, kaua ma seda topelttööaja põhjust taga otsisin :D?

