Tema
/
Algoritmai ir duomenų struktūros GO
Pamoka 3 / 15 Susieti sąrašai ~35 min
Kodas

Mazgai, rodyklės ir du skaitikliai

Sukurk playlist.go (žr. dešinėje). Failas didokas, bet jame yra keturi atskiri dalykai, ir verta juos skirti.

Node ir Playlist — pati struktūra. Playlist laiko Head, Tail ir Len, kad Append būtų O(1): pridedant į galą uodega jau turima, ieškoti nereikia.

NodeAt — vaikščiojimas. Čia ir yra visa sąrašo kaina, ir todėl kiekvienas šuolis skaičiuojamas atskiru skaitikliu.

unlink ir insertBefore — pats perkėlimas. Abu O(1), abu tik rodyklių perrašymas.

MoveInSlice — tas pats darbas su []Item, kad būtų su kuo lyginti. Kiekvienas pastūmimas skaičiuojamas.

Du skaitikliai, ne vienas

Splice ima du skaitiklius:

func (p *Playlist) Splice(from, to int, walk, ptr *metrics.Counter) bool

Tai ne dailinimas. Jei suplaktum juos į vieną, gautum vieną skaičių ir prarastum visą pamoką: perkėlimas yra O(1), o kelias iki jo — O(n). Du skaitikliai leidžia pamatyti abu dalykus atskirai.

Ketvirtame žingsnyje pamatysi, kuris iš jų nusveria.

Kodėl container/list irgi

Go standartinėje bibliotekoje jau yra dvipusis sąrašas — container/list. MoveInStdList daro tą patį per jį.

Jis čia dėl trečios pamokos siūlo, kuri tęsis: kiek kainuoja abstrakcija. 6 pamokoje pamatysi, kad standartinės bibliotekos sort.Search yra greitesnė už ranka rašytą ciklą. 13 pamokoje pamatysi, kad standartinės bibliotekos container/heap yra lėtesnė už ranka rašytą krūvą. Tas pats klausimas, du priešingi atsakymai — ir taisyklė, kuri juos suderina, laukia 13 pamokoje.

Šioje pamokoje tiesiog užsirašyk trečią skaičių.