Massiiv (programmeerimine)

Massiiv on programmeerimises andmestruktuur, mis koosneb elementide hulgast, millest igaühel on oma indeks (järjekorranumber) või võti. Elementide indeksid algavad üldjuhul nullist ja viimase massiiviliikme indeks on m a s s i i v i   p i k k u s − 1 {\displaystyle massiivi\ pikkus-1} , kuid on ka keeli, mis lubavad alustada massiivi indeksiga 1 või hoopis indeksiga n. Kui keel lubab alustada massiivi suvalise indeksiga, siis tavaliselt võib selleks olla ka negatiivne arv. Massiivis on andmed hoitud nii, et iga elemendi asukohta on võimalik välja arvutada tema indeksi abil kasutades valemit. Massiivil võib olla indekseid rohkem kui üks – nii saadakse mitmemõõtmelised massiivid. Mitmemõõtmeline massiiv on massiiv, mille elementideks on omakorda massiivid. Ühemõõtmelist massiivi nimetatakse ka järjendiks, kahemõõtmelist maatriksiks või tabeliks. Kõik need massiivid võivad olla kas staatilised või dünaamilised. Staatiline on massiiv siis, kui tema mõõtmed on teada algusest peale ning hiljem ei saa neid muuta, kuid dünaamilise massiivi mõõtmeid on võimalik muuta käivitamisel. Massiivi üks suurimaid eeliseid on see, et nende elementidele saab suvaliselt ligi, tänu sellele on elementide võtmine indeksi alusel palju kiirem. Tavaliselt nimetatakse massiivis hoitavate tähetede kogumit sõneks. Massiivi tunnused: nimi, elementide tüüp, indeksite arv, elementide arv, elementide väärtused. Massiivid on ühed vanimad andmestruktuurid programmeerimises ja need leiavad kasutust peaaegu igas programmis. Neid kasutatakse paljude teiste struktuuride implementeerimiseks (näiteks loend (ingl list) ja sõne (ingl string)). Massiivid kasutavad väga hästi ära arvutite adresseerimisloogikat, nimelt uuemates arvutites ja välistel hoiuseadmetel on mälu ühemõõtmeline massiiv sõnu. Protsessorid on tihti optimeeritud massiivide jaoks. Iga massiivi elemendi mäluaadressi saab lihtsasti arvutada selle indeksi kaudu. Näiteks massiivis, mis asub mäluaadressil 2000, on element indeksiga i {\displaystyle i} aadressil 2000 + i ∗ e l e m e n d i   s u u r u s {\displaystyle 2000+i*elemendi\ suurus} . Esimesed arvutid kasutasid masinkeelt, et massiive luua ja neile juurde pääseda. John von Neumann kirjutas esimese sorteerimismeetodi massiividele (mestimissortimine) 1945. aastal. Masinkeeled ei toetanud üldjuhul enam massiive kui masin ise seda tegi, kuid esimesed programmeerimiskeeled nagu FORTRAN, Lisp, COBOL ja ALGOL 60 toetasid juba mitmemõõtmelisi massiive, sama tegi ka C keel. Massiive kasutatakse näiteks selleks, et implementeerida vektoreid ja maatrikseid. Mitmed andmebaasid, väiksed ja suured, koosnevad (või neis on) ühemõõtmelisest massiivist, mille elemendid on soovitud andmed. Massiive kasutatakse ka teiste andmestruktuuride implementeerimiseks nagu loend, kuhi, paisktabel ja sõne. Massiivipõhine struktuuride rakendamine on tihti kerge ja ruumi kokkuhoidev, kuid sellel on kehv keerukus võrreldes näiteks puupõhiste struktuuridega, eriti kui seda on muudetud (näiteks kui võrrelda massiiviga sorteerimist ja otsingupuud, siis puu struktuur on kiiruselt palju kiirem: puu keskmine ajaline keerukus on umbes O ( log ⁡ n ) {\displaystyle O(\log n)} , kuid massiivi keskmine ajaline keerukus on O ( n log ⁡ n ) {\displaystyle O(n\log n)} , mis sõltuvalt selle massiivi suurusest võib olla väga suur erinevus). Erinevates programmeerimiskeeltes vastavad massiivile erinevad asjad. Pythoni keeles on näiteks massiivi asemel kasutusel järjend (inglise keeles list), Javas on aga järjend ja massiiv mõlemad olemas. Üks näidisülesannetest, millal on mõistlik massiivi kasutada on näiteks trips-traps trulli mängu implemeteerimine, kus laud koosneb 3x3 massiivist (3 kolmeliikmelist massiivi). Kui mingile mänguruudule tehakse käik, siis asendatakse selles massiivis tühi koht mängija mängusümboliga (nt kui rist käib keskmisele ruudule, siis 2. massiivi 2. liige asendatakse ristiga). Pythoni massiivid võivad programmi erinevatel hetkedel omada erinevaid väärtuseid ehk tegemist on muteeritavate listidega (pythonis on list ja massiiv sama). Mõned käsud, mida saab kasutada erinevate tegevuste jaoks listidega - append (lisab elemendi listi lõppu), extend (lisab listitäie elemente listi lõppu), insert (lisab näidatud positsioonile näidatud elemendi, järgnevate elementide positsioonid nihkuvad), remove (eemaldab esimese näidatud väärtusega elemendi), pop (eemaldab viimase elemendi ja tagastab selle), clear (eemaldab listist kõik elemendid), sort (sorteerib listi kasvavaks), reverse (pöörab elementide järjekorra ümber). Siiski kui muuta massiivi või seda täiendada, siis tuleb järgida, et sama massiiv ei oleks omistatud mitmele muutujale, sest muidu juhtub nii, et ühe massiivile tehtud muutused kanduvad edasi ka järgmistele. Et seda vältida, tuleb massiivi omistamise asemel teha sellest koopia, siis ei teki seda probleemi. Kui ei tea, kas oled massiivi omistanud mitmele muutujale, siis seda saab tuvastada käsuga id, see käsk kuvab muutuja viite ja kui viited on samad, siis on omistatud mitmele muutujale sama massiiv, kui on erinevad, siis ei ole. Jaanus Pöial. "Meetod (alamprogramm)". Vaadatud 06.12.2018. Alex Chumbley, Thaddeus Abiy ja Krishna Ar. "Array (Data Structure)" (inglise). Vaadatud 06.12.2018. Bjoern Andres, Ullrich Koethe, Thorben Kroeger, Fred Hamprecht (2010). "Runtime-Flexible Multi-dimensional Arrays and Views for C++98 and C++0x". Jonathan Hartley (05.06.2017). "TimeComplexity" (inglise). Vaadatud 06.12.2018. Aivar Annamaa. "Listide muteerimine". Vaadatud 19.01.2019.