Tema
/
Algoritmai ir duomenų struktūros GO
Pamoka 8 / 15 Efektyvus rūšiavimas ~60 min
Namų darbas

Namų darbas

Ką atiduoti

algo su dc ir stable, praeinantį go test ./..., ir matavimų ataskaitą.

1. Keturios tvarkos, keturi algoritmai

n = 10 000, visos keturios tvarkos, visi keturi algoritmai — šešiolika eilučių:

tvarka algoritmas palyginimai perkėlimai laikas

Pažymėk kiekvienoje tvarkoje greičiausią. Ar nugalėtojas visur tas pats?

2. Riba, ties kuria O(n log n) atsiperka

Septintoje pamokoje įterpimo rikiavimas beveik tvarkingiems duomenims aplenkė sort.Slice iki maždaug n = 2 000.

Pakartok su savo suliejimo rikiavimu: nuo kokio n jis aplenkia tavo įterpimo rikiavimą? Matuok -order nearly ir -order shuffled atskirai — atsakymai skirsis.

3. Kvadratas grįžta

Patvirtink, kad QuickSortNaive surikiuotiems duomenims yra tiksliai n(n−1)/2:

n palyginimai n(n−1)/2 sutampa?
100
1 000
5 000

4. Atminties kaina

Suliejimo rikiavimas reikalauja papildomos vietos, greitasis — ne.

Pamatuok abiejų atminties sunaudojimą 100 000 įrašų (runtime.ReadMemStats, kaip ketvirtoje pamokoje). Nurodyk santykį baitais vienam įrašui.

Kada šis skirtumas nulemtų tavo pasirinkimą?

5. Neišmatuotas rikiavimas tikroje sistemoje

transit greičiausias maršrutų algoritmas (Connection Scan) aplenkia geriausią Dijkstrą maždaug 76 kartus. Visas jo paruošimas — vienas rikiavimas; šaltinyje tai pasakyta tiesiai: „This sort is the algorithm's entire preprocessing step." Rikiuojama 196 412 jungčių pagal išvykimo laiką, o lygiuosius sprendžia reiso numeris — tas pats determinuotas raktas, kaip 6 žingsnyje.

To rikiavimo kainos transit niekada nepamatavo. Nė viename jo matavime jos nėra.

Įvertink ją: 196 412 elementų, O(n log n). Kiek palyginimų? Palygink su tuo, ką Connection Scan sutaupo vienai užklausai (~0,7 ms prieš ~53 ms).

Po kelių užklausų tas rikiavimas atsiperka? Ir ar 76 kartų pagreitėjimas vis dar teisingas skaičius, jei paruošimą įskaitytum?

(Tai ne kritika. Tai klausimas, kurio niekas neuždavė — todėl jis tavo.)