Programmēšanas valodās masīvs ir vairāku elementu (piemēram, veselu skaitļu) glabāšanas veids. Šiem elementiem parasti jābūt viena tipa (piemēram, tikai veseli skaitļi, tikai virknes utt.), jo tradicionālajos masīvos nevar glabāt dažāda datu tipa elementus. Katram elementam masīvā ir numurs, lai programmētājs varētu iegūt elementu, izmantojot šo numuru. Šo numuru sauc par indeksu. Dažās programmēšanas valodās pirmajam elementam ir indekss 0, otrajam elementam ir indekss 1 utt. Bet citās valodās pirmajam elementam ir indekss 1 (un pēc tam 2, 3, ...).
Indeksi un robežas
Indekss norāda konkrētā elementa pozīciju masīvā. Ja masīvam ir n elementi, tad indeksu derīgais diapazons ir atkarīgs no indeksa sākuma:
- 0‑bāzētos masīvos derīgie indeksi ir 0..n-1.
- 1‑bāzētos masīvos derīgie indeksi ir 1..n.
Masīva lielums un izmērs
Kad programmētājs izveido masīvu, bieži jānorāda masīva lielums — tas ir elementu skaits, ko masīvs var glabāt. Tradicionālais (statiskais) masīvs parasti ir fiksēta izmēra, t.i., pēc izveides tā izmēru mainīt nevar. Ja nepieciešams glabāt vairāk elementu, jāizveido jauns, lielāks masīvs un jākopē dati vai jāizmanto dinamisks datu konteiners.
Dažās valodās ir iebūvēti dinamiskie masīvi vai konteineri (piemēram, ArrayList Java, vector C++, Python list), kas automātiski paplašinās pēc vajadzības, slēpjot detaļas par jaunas atmiņas rezervēšanu un esošo datu kopēšanu.
Atmiņas izkārtojums un veiktspēja
Lielākā daļa masīvu tiek glabāti kā atmiņas bloks ar secīgām (kontiguām) elementu vietām. Tas nodrošina:
- O(1) piekļuvi pēc indeksa — elementu var atrast tiešā adresēšanas veidā.
- Efektīvu kešo izmantošanu un ātru iterāciju, jo nākamie elementi bieži atrodas blakus atmiņā.
Multidimensionālie masīvi
Masīvus var paplašināt vairākās dimensijās — piemēram, matrica (2D masīvs) vai 3D dati. Piekļuve tiek īstenota ar vairākiem indeksiem, piemēram, a[i][j]. Svarīgi atcerēties, ka:
- 2D masīvs var būt "rindu × kolonnu" izkārtojums ar fiksētu rindu un kolonnu skaitu.
- Dažās valodās 2D masīvs ir patiesi kontiguāls bloks; citur tas ir masīvs no rindu masīviem, kas var būt atšķirīga garuma.
Biežākās operācijas
- Sākotnējā masīva izveide un inicializācija.
- Elementa nolasīšana vai ierakstīšana pēc indeksa — ātra un vienkārša.
- Iterācija pa visiem elementiem (for, foreach), bieži izmantojot indeksi vai tiešo iterētāju.
- Masīva kopēšana vai apvienošana — var būt lineāras izmaksas O(n).
- Masīva meklēšana — lineāra meklēšana O(n) vai binārā meklēšana O(log n) sakārtotā masīvā.
Salīdzinājums ar citām datu struktūrām
Masīvi ir labi, ja nepieciešama ātra piekļuve pēc indeksa un zināms elementu skaits. Tomēr, ja nepieciešamas biežas ievietošanas vai dzēšanas vidū bez dārgas pārrēķināšanas, labāk piemērotas ir saišu saraksti, dinamiskie vektori vai citas struktūras. Lūk daži punkti:
- Plusi: ātra piekļuve, vienkārša struktūra, efektīva atmiņas izmantošana (kontiguāls bloks).
- Mīnusi: fiksēts izmērs (statiskajos masīvos), dārgas vidējas ievietošanas/dzēšanas operācijas, iespēja IndexOutOfBounds kļūdām.
Praktiski piemēri (idejas)
- Skaitītāju uzglabāšana: int[] skaitli = {1,2,3}; — piekļuve ar skaitli[0] vai skaitli[1] atkarībā no valodas sintakses.
- Matricas reprezentēšana: double matrica[rows][cols]; vai saraksts no sarakstiem (list of lists).
- Dinamiska paplašināšana: C izmantojot malloc/realloc, Java izmantojot ArrayList, Python izmantojot list.
Padomi un labas prakses
- Vienmēr pārbaudiet indeksu robežas vai izmantojiet valodas, kas to automātiski pārbauda.
- Izvēlieties pareizo datu tipu elementiem, lai ietaupītu atmiņu (piemēram, short vs int, ja pietiek).
- Ja bieži jāmaina izmērs, izmantojiet dinamiskus konteinerus vai strukturēto paplašināšanu (amortizētas paplašināšanas stratēģijas).
- Izmantojiet izejošas funkcijas un bibliotēkas (piem., sort, copy), lai izvairītos no atkārtota koda rakstīšanas.