Massiiv programmeerimises: definitsioon, indeksid, suurus ja tüübid
Massiiv programmeerimises: selgitus, indeksid (0- või 1-põhine), suuruse olulisus ja tüübid C-keeles. Õpi massiivi loomist, ligipääsu ja piiranguid kiirelt.
Programmeerimiskeeltes on massiiv andmestruktuur, mis hoiustab järjestatud kogumit elemente (näiteks täisarvude või stringid näite puhul). Tavaliselt peavad massiivi elemendid olema sama tüüpi (nt ainult täisarvud või ainult stringid), sest paljudes keeltes on massiiv formaalselt homogeenne. Siiski leidub keeli (näiteks Python), kus sarnase ülesande täitmiseks kasutatavad andmekogumid võivad hoida eri tüüpe. Igal elemendil massiivis on number ehk positsioon, nii et programmeerija saab selle numbri abil konkreetse elemendi kätte. Seda numbrit nimetatakse indeksiks.
Indeksid ja indeksimise eripärad
Paljudes keeltes (näiteks C, C++, Java, JavaScript) algab indeks nullist: esimese elemendi indeks on 0, järgmise 1 jne. Mõnes teises keeles (harvem) võivad indeksid algatada 1-st. Indeksimine võimaldab kiiret (tavaliselt O(1)) juurdepääsu suvalisele elemendile, sest iga elemendi asukoht arvutatakse indeksist ja elemendi suurusest lähtudes.
Suurus ja mälu
Kui programmeerija loob massiivi, peab ta tavaliselt määrama massiivi suuruse ehk selle, mitu elementi massiiv suudab hoida. Sellised massiivid on fikseeritud suurusega: kui vaja salvestada rohkem elemente, tuleb luua uus suurem massiiv ja kopeerida sinna olemasolevad andmed. See tingib lisatöötluse ning võib mõjutada jõudlust.
Massiivide elemendid on tavaliselt paigutatud järjepidevalt (contiguous) mällu, mis võimaldab kiiret indeksipõhist ligipääsu. Fikseeritud-mahu massiividega (nt C-s deklareeritud massiivid) tähendab see, et massiivi suurust ei saa pärast loomist muuta ilma uue massiivi loomata. Dynamilised andmestruktuurid (nt Java-s ArrayList, C++-is std::vector) käituvad sarnaselt massiiviga, kuid toetavad dünaamilist suuruse muutmist — sisemiselt luuakse tavaliselt suurem massiiv ja kopeeritakse elemendid, kui vaja suuremaks venitada.
Tüübid ja keelespetsiifika
- C ja C++: massiivid on tüübi järgi homogeenne ja indekseeritavad nullist. Deklaratsiooniks näiteks:
int a[10];. C-s ei toimu automaatset ruumi kontrolli (bound checking), mistõttu vale indeksiga ligipääs võib põhjustada mälukorruptsiooni. C++ pakub ka std::vector, mis on dünaamiline massiivi-laadne konteiner. - Java: massiivid on objekte; deklaratsioon näiteks:
int[] a = new int[10];. Java kontrollib jooksval ajal indeksipiire ja viskab erandi, kui indeks on vale. - Python: Pythonis on list tüüpi andmestruktuur väga paindlik — seda kasutatakse sageli massiivi sarnaseks konstruktsiooniks, aga Pythonilistelist võib sisaldada eri tüüpi elemente ja selle suurus on dünaamiline. Kui vaja homogeensemat ja kiiremat ladustust numbriliste andmete jaoks, kasutatakse mooduleid nagu array või NumPy massiive.
- Mitmemõõtmelised massiivid: massiiv võib olla mitmemõõtmeline (nt maatriks), mis on tegelikult massiivide massiiv (nt C-s
int m[3][4];).
Tavalised operatsioonid ja nende keerukus
- Ligipääs elemendile indeksiga: O(1)
- Traversaal (läbikäik kõigi elementide): O(n)
- Lisamine või kustutamine massiivi keskel: O(n) (on vaja nihutada elemente)
- Lisamine massiivi lõppu dünaamilises konteineris: amortiseeritud O(1)
Ohud ja parimad tavad
- Kontrolli indeksite kehtivust — mõnes keeles tehakse seda automaatselt, teistes peab arendaja ise ettevaatlik olema.
- Kui vajad dünaamilist suuruse muutmist, kasuta keele sobivaid tööriistu (ArrayList, std::vector, Python list jm) selle asemel, et käsitsi luua ja kopeerida fikseeritud massiive.
- Kui töötad suurte andmahulkadega, mõtle mälu ja andmetüübile — sobiv tüüp vähendab mälukasutust ja parandab sooritust.
Näited
C näide (staatiline massiiv):
int nums[5]; // indekseid 0..4 nums[0] = 10; int x = nums[3]; Java näide:
int[] nums = new int[5]; nums[0] = 10; int x = nums[3]; Python (dünaamiline list):
nums = [1, 2, 3] nums.append(4) # suurus muutub automaatselt x = nums[0] Kokkuvõtlikult: massiiv on elementide järjestatud konteiner, mis annab kiire indekspõhise ligipääsu, kuid on sageli fikseeritud suurusega ja nõuab tähelepanu indeksite ja mälukasutuse suhtes. Erinevates programmeerimiskeeltes on massiividelt oodata sarnaseid põhiomadusi, ent detailid (näiteks piirikontroll ja dünaamiline suuruse muutmine) sõltuvad keelest.
Massiivid C keeles
Programmeerimiskeeles C saab massiive luua järgmiselt:
See loob täisarvude massiivi ja see võib salvestada 5 täisarvu. Nüüd saab programmeerija salvestada täisarvud massiivi, tehes:
Programmeerija võib kasutada massiivi väärtust niimoodi:
Arrays in Java
Programmeerimiskeeles Java saab massiive luua järgmiselt:
See loob täisarvude massiivi ja see võib salvestada 5 täisarvu. Nüüd saab programmeerija salvestada täisarvud massiivi, tehes:
Programmeerija võib kasutada massiivi väärtust niimoodi:
Küsimused ja vastused
K: Mis on programmeerimiskeeltes massiiv?
V: Massiiv on programmeerimiskeeltes mitme sama tüüpi elemendi salvestamise viis.
K: Millist tüüpi elemente saab salvestada massiivi?
V: Massiivis saab salvestada ainult sama tüüpi elemente, näiteks täisarvud või stringid.
K: Mis on indeks massiivis?
V: Indeks on number, mis on määratud igale elemendile massiivis, nii et programmeerija saab sellele elemendile ligi, kasutades seda numbrit.
K: Kuidas määratakse massiivi esimese elemendi indeks?
V: Mõnes programmeerimiskeeles on esimese elemendi indeks 0, teistes aga 1.
K: Mida peab programmeerija massiivi loomisel esitama?
V: Programmeerija peab andma massiivi suuruse, mis on massiivi salvestatavate elementide arv.
K: Miks ei saa massiivi suurust muuta?
V: Massiivi suurust ei saa muuta, sest see määratakse massiivide loomisel.
K: Mida peab programmeerija tegema, kui ta tahab salvestada rohkem elemente, kui massiivi suurus võimaldab?
V: Kui programmeerija tahab salvestada rohkem elemente, kui massiivi suurus võimaldab, peab ta looma uue, suurema suurusega massiivi.
Otsige