Massiiviloend ja lingitud loend on andmete salvestamise ja hankimise levinud mõisted. Kuigi salvestusseadmeid on palju, sõltuvad need lõppkokkuvõttes salvestusmehhanismist. Need kaks salvestusmehhanismi paigutavad teie andmed salvestusseadmetesse ja hangivad need vajadusel üles. Vaatame, kuidas nad andmeid oma mällu talletavad. Massiivide loend kasutab järjestikust salvestust ja andmeid tükki hoitakse üksteise järel. See on võib-olla lihtsam ladustamisviis - see hoiab ära segaduse. Jah, me saame järgmise elemendi või andmed massiivi nimekirja järgmisest mälukohast; siiski salvestatakse see osutite abil lingitud loendisse. Siin on meil vaja kahte mälukohta ladustamiseks - üks andmete jaoks, teine osuti jaoks. Kursor näitab järgmiste andmete mälukohta. Saame hõlpsasti aru, et lingitud loend ei salvesta andmeid kunagi järjestikku; pigem kasutab see juhuslikku salvestusmehhanismi. Osutused on võtmeelemendid mälu andmete asukohtade leidmisel.
Oleme juba arutanud, kuidas mõlemad salvestusmehhanismid andmeid sisestavad ja massiivi loendi sisemise salvestusskeemi jaoks võime anda termini „dünaamiline massiiv”. See paneb lihtsalt andmeühikud üksteise järel - siis nime järgi -, samas kui lingitud loend kasutab järgmise üksuse jälgimiseks osutite abil sisemist loendit. Seetõttu kasutab ta järgmiste andmete kuvamiseks sisemist lingitud nimekirja, nagu üksikult või kahekordselt lingitud loetelu.
Kuna massiiviloend salvestab ainult tegelikke andmeid, vajame ruumi ainult meie salvestatud andmete jaoks. Vastupidiselt, lingitud loendis kasutame ka viiteid. Seetõttu on vaja kahte mälupesa ja võime öelda, et lingitud loend kulutab rohkem mälu kui massiivide loend. Lingitud nimekirja eeliseks on see, et see ei eelda kunagi meie andmete salvestamiseks pidevat mälukohta, erinevalt massiivi loendist. Osutid on võimelised hoidma järgmise andmekoha positsiooni ja võime kasutada isegi väiksemaid mälupesi, mis pole pidevad. Mälukasutuse osas mängivad osutid lingitud loendis peamist rolli ja ka nende tõhusus.
Massiiviloendi korral on isegi tühja nimekirja jaoks vaja 10, kuid lingitud loendi korral pole meil nii suurt ruumi vaja. Saame luua tühja lingitud loendi suurusega 0. Hiljem saame seda vajadusel suurendada.
Andmete otsimine on massiiviloendis lihtsam, kuna see salvestub järjest. Vaja on vaid tuvastada esimene andmete asukoht; sealt pääseb järgmisele kohale järjestikku, et ülejäänud kokku saada. See arvutatakse nagu esimene andmepositsioon + 'n', kus 'n' on massiivide loendis olevate andmete järjekord. Lingitud loend osutab esialgsele osutile esimese andmete asukoha leidmiseks ja sealt see osutab iga andmetega seotud osutile järgmise andmete asukoha leidmiseks. Väljastusprotsess sõltub peamiselt siin olevatest osutitest ja need näitavad meile tõhusalt järgmist andmete asukohta.
Massiivi loend kasutab andmete lõpu tähistamiseks nullväärtust, samas kui seostatud loend kasutab selleks nullkursorit. Niipea kui süsteem tuvastab nullandmed, peatab massiiviloend järgmise andmete hankimise. Sarnasel viisil peatab nullkursor süsteemi jätkamise järgmise andmeotsinguga.
Lingitud loend võimaldab meil laskuva desiteraatori () abil vastupidises suunas liikuda. Massiivide loendis meil sellist võimalust siiski pole - tagurpidi liikumine muutub siin probleemiks.
Vaatame mõlema salvestusmehhanismi Java süntaksi.
Massiiviloendi loomine:
Loend arraylistsample = new ArrayList ();
Objektide lisamine massiiviloendisse:
Arraylistsample.add (“nimi1”);
Arraylistsample.add (“nimi2”);
Nii näeb välja tulemuseks olev massiivide loend - [name1, name2].
Lingitud loendi loomine:
Loetelude lingitud loetelu = uus linkitud loend ();
Objektide lisamine lingitud loendisse:
Linkedlistsample.add (“nimi3”);
Linkedlistsample.add (“nimi4”);
Nii näeb välja tulenev lingitud loend - [name3, name4].
Massiivide loend võtab andmeotsingute tegemiseks O (1) aega, samas kui lingitud loend võtab n O jaoks n O (n)th andmete otsing. Seetõttu kasutab massiivide loend andmete otsimiseks alati konstantset aega, kuid lingitud loendis sõltub kuluv aeg andmete asukohast. Seetõttu on massiivide loendid alati parem valik Hangi või Otsi toimingute jaoks.
Nii massiivide loend kui ka lingitud loend võtab andmete lisamiseks aega O (1). Kuid kui massiiv on täis, võtab massiivide loend selle suuruse muutmiseks ja üksuste uude kopeerimiseks märkimisväärselt palju aega. Sel juhul on parem valik Linked.
Eemaldamise toiming võtab nii massiivi loendis kui ka lingitud loendis peaaegu sama palju aega. Massiivi loendis kustutab see toiming andmed ja nihutab seejärel andmete asukohta uuema massiivi moodustamiseks - see võtab O (n) aega. Lingitud loendis liigub see toiming konkreetsete andmete juurde ja muudab kursori positsioone, moodustades uuema loendi. Läbiviimise ja eemaldamise aeg on siin ka O (n).
Me teame, et massiivide loend kasutab tegelike andmete salvestamiseks sisemist massiivi. Seega, kui mõni teave kustutatakse, vajavad kõik eelseisvad andmed mäluvahetust. Ilmselt nõuab see märkimisväärselt palju aega ja aeglustab asju. Sellist mälu nihutamist pole lingitud loendis vaja, kuna see muudab vaid osuti asukohta. Seetõttu on lingitud loend kiirem kui massiivide loend igasuguses andmesalvestuses. See sõltub aga puhtalt toimingu tüübist, s.t operatsiooni Hangi või otsimine jaoks võtab lingitud loend palju rohkem aega kui massiivi loend. Üldist toimivust vaadates võime öelda, et lingitud nimekiri on kiirem.
Massiivide loend sobib kõige paremini väiksemate andmenõuete jaoks, kui pidev mälu on saadaval. Kuid kui tegeleme tohutute andmemahtudega, rakendab pideva mälu olemasolu andmesalvestusmehhanisme, olgu see siis väike või tohutu. Järgmisena otsustage, kumba valida - massiiviloend või lingitud loend. Massiiviloendiga saate edasi minna, kui vajate lihtsalt andmete salvestamist ja otsimist. Kuid loetelu aitab teil andmete töötlemisega ka kaugemale jõuda. Kui olete otsustanud, kui sageli on andmetega manipuleerimine vajalik, on oluline kontrollida, millist tüüpi andmete otsingut tavaliselt teostate. Kui tegemist on lihtsalt Hangi või Otsimisega, on parem valik Massiiviloend; muude toimingute jaoks, näiteks sisestamine või kustutamine, jätkake lingitud nimekirjaga.
Vaadelgem tabelitabeli erinevusi.
S.Ei | Kontseptsioonid | Erinevused | |
Massiivide nimekiri | Lingitud nimekiri | ||
1 | Andmesalvestuse mood | Kasutab järjestikust andmesalvestust | Kasutab mitte järjestikust andmete salvestamist |
2 | Sisemine salvestusskeem | Säilitab sisemise dünaamilise massiivi | Säilitab lingitud nimekirja |
3 | Mälu kasutamine | Nõuab ainult andmete jaoks mäluruumi | Nõuab mäluruumi nii andmete kui ka viidete jaoks |
4 | Algloendi suurus | Vajab ruumi vähemalt 10 eseme jaoks | Ei vaja ruumi ja saame luua isegi tühja lingitud loendi suurusega 0. |
5 | Andmete taastamine | Arvutab nagu esimene andmepositsioon + 'n', kus 'n' on andmete järjekord massiivi loendis | Vajalik on läbimine esimesest või viimasest kuni nõutavate andmete esitamiseni |
6 | Andmete lõpp | Nullväärtused tähistavad lõppu | Nullkursor tähistab lõppu |
7 | Tagurpidi liikumine | Ei luba seda | Võimaldab seda laskuva laskuri abil () |
8 | Loendi loomise süntaks | Loend arraylistsample = new ArrayList ();
| Loetelude lingitud loetelu = uus linkitud loend ();
|
9 | Objektide lisamine | Arraylistsample.add (“nimi1”);
| Linkedlistsample.add (“nimi3”);
|
10 | Hankige või otsige | Võtab aega O (1) ja on jõudluses parem | Võtab O (n) aeg ja jõudlus sõltuvad andmete asukohast |
11 | Lisamine või lisamine | Tarbib O (1) aega, välja arvatud juhul, kui massiiv on täis | Tarbib O (1) aega igas olukorras |
12 | Kustutamine või eemaldamine | Võtab aega O (n) | Võtab aega O (n) |
13 | Millal kasutada? | Kui seotud on palju hanke- või otsingutoiminguid; mälu saadavus peaks olema suurem isegi alguses | Kui sisestamise või kustutamise toiminguid on palju ja mälu saadavus ei pea olema pidev |