Паралельний масив

В програмуванні, парале́льний маси́в — структура даних для представлення масиву записів, котра фізично складається з окремих однотипних масивів однакової довжини для кожного з полей запису. Значення елементів з однаковим порядковим номером у кожному масиві, логічно належать до одної структури. Як вказники на структуру використовується загальний індекс в паралельному масиві. Цей підхід відрізняється від традиційного, при якому усі поля структури зберігаються у сусідніх областях пам'яті. Наприклад, можна оголосити масив строкового типу для 100 імен, та масив цілих чисел для 100 віків, та вважати, що кожному імені відповідає вік з таким самим індексом запису.

Приклад реалізації паралельних масивів на C:

char *first_names[] = {"Joe",   "Bob",   "Frank",   "Hans"    };
char *last_names[]  = {"Smith", "Seger", "Sinatra", "Schultze"};
int  *heights[]     = {169,     158,     201,       199       };

for (int i = 0; i < 4; i++) {
    printf("Ім'я: %s %s, зріст: %d см \n", first_names[i], last_names[i], heights[i]);
}

Приклад реалізації паралельних масивів на MQL4 (у цій мові відсутня підтримка структур):

string first_names[] = {"Joe",   "Bob",   "Frank",   "Hans"    };
string last_names[]  = {"Smith", "Seger", "Sinatra", "Schultze"};
int    heights[]     = {169,     158,     201,       199       };
int i;

for (i = 0; i < 4; i++) {
    Print(StringConcatenate("Ім'я: ", first_names[i], " ", last_names[i], ", зріст: ", heights[i], " см"));
}

Приклад реалізації на Perl (використано ассоціативний масив для логічного групування компонентів паралельного масиву):

my %data = (
    first_names => ['Joe',   'Bob',   'Frank',   'Hans'    ],
    last_names  => ['Smith', 'Seger', 'Sinatra', 'Schultze'],
    heights     => [169,     158,     201,       199       ],
);

for $i (0..$#{$data{first_names}}) {
    printf "Ім'я: %s %s, зріст: %i см \n", $data{first_names}[$i], $data{last_names}[$i], $data{heights}[$i];
}

Приклад реалізації на Python:

first_names = ["Joe",   "Bob",   "Frank",   "Hans"    ]
last_names  = ["Smith", "Seger", "Sinatra", "Schultze"]
heights     = [169,     158,     201,       199       ]

for i in range(len(first_names)):
	print("Ім'я: %s %s, зріст: %d см" % (first_names[i], last_names[i], heights[i]))

Приклад альтернативної реалізації на Python:

first_names = ["Joe",   "Bob",   "Frank",   "Hans"    ]
last_names  = ["Smith", "Seger", "Sinatra", "Schultze"]
heights     = [169,     158,     201,       199       ]

for (first_name, last_name, height) in zip(first_names, last_names, heights):
	print("Ім'я: %s %s, зріст: %d см" % (first_name, last_name, height))

Приклад реалізації на bash:

#!/bin/bash

declare -a first_names=('Joe'   'Bob'   'Frank'   'Hans'    );
declare -a  last_names=('Smith' 'Seger' 'Sinatra' 'Schultze');
declare -a     heights=(169     158     201       199       );

declare -i i;

for (( i = 0 ; i <= ${#first_names} ; i++ )); do {
	echo "Ім'я: ${first_names[${i}]} ${last_names[${i}]}, зріст: ${heights[${i}]} см";
}; done

У паралельних масивів є ряд практичних переваг у зрівнянні з класичним підходом:

  • Вони можуть бути використані у мовах, котрі підтримують тільки масиви примітивних типів, але не підтримують масиви записів, чи не підтримують записи взагалі.
  • Паралельні масиви прости для розуміння та використання, та часто використовуються там, де об'ява структури запису надмірна.
  • Вони можуть зберегти відчутний об'єм пам'яті у деяких випадках, так як більш ефективно вирішують питання вирівнювання. Наприклад, одним з полей структури може бути одиничний біт — при звичайному підході, невикористані біти доведеться вирівняти так, що єдиний біт займе повні 8, 16 або 32 біта, тоді як паралельний масив дозволить об'єднати по 32 або по 64 бітових поля у єдиному елементі, у залежності від разрядності архітектури процесора.
  • Якщо кількість елементів невелика, індекси масиву займають суттєво менше простору, чим повноцінні вказники, особливо на архітектурах з великою разрядністю.
  • Послідовне читання єдиного поля кожного запису у масиві дуже швидке на сучасних комп'ютерах, так як це рівноцінно лінейному ітеруванню по єдиному масиву, що дає ідеальні локальність[en] и поведінку кешу.

Незважаючи на це, у паралельних масивів є декілька суттєвих недоліків, котрі пояснюють, чому вони не використовуються повсюдно:

  • У них суттєво гірша локальність при послідовному ітеруванні по записам та читанні деяких полів, що є типовою задачею.
  • Зв'язок між полями одного запису може бути неочевидним та заплутаним.
  • Достатньо мала кількість мов підтримує паралельні масиви, як повноцінні структури — мова та її синтаксис, як правило, не позначують зв'язок між масивами у паралельному масиві.
  • Зміна розміру паралельного масиву — досить затратна операція, так як потребується заново виділити пам'ять під кожен з субмасивів. Многорівневі масиви є частковим вирішенням даної проблеми, але накладають обмеження на продуктивність через введення додаткового шару переспрямувань, щоб знайти потрібний елемент.

Погана локальність є серйозним недоліком, але можна скористуватися наступними підходами, щоб зменшити серйозність проблеми та її вплив на продуктивність:

  • Якщо у записі є окремі набори полів, що, як правило, використовуються разом, можна поділити структуру на декілька, та зробити паралельний масив з таких часткових записів. Цей спосіб дозволяє суттєво збільшити продуктивність доступу до дуже великих структур, зберігаючи їх логічну компоновку. Якщо це допустимо, деякі поля структури можуть бути продубльовані у різних субструктурах, але тоді на програміста лягає задача відстежування змінення записів, що дублюються, та оновлення усіх екземплярів.
  • Замість індексів масивів можна використовувати посилання, але результуюча продуктивність сильно залежить від мови, компілятора та архітектури процесора — подібне рішення може бути неефективним як по часу виконання, так і по об'єму використаної пам'яті.
  • Ще одним варіантом є об'єднання полей сумісних типів у єдиний одномірний масив так, щоб поля, що належать до одної структури, були записані послідовно. Наприклад, є паралельний масив з записів для зросту, ваги та віку — замість трьох роздільних масивів можна створити один, у якому записи будуть мати наступний вигляд: [зріст1, вага1, вік1, зріст2, вага2, вік2, ...], таким чином, для отримання J-ного поля (з M) у I-тому записі (з N), треба звернутися до елементу з індексом (M * I + J). Деякі компілятори автоматично здатні застосовувати подібну оптимізацію для розгортання масивів структур для адаптації під векторні процесори та SIMD-інструкції.
  • В пакеті pandas для мови програмування python використовується цей підход. Основна структура DataFrame розглядається як список колонок Series, кожна з яких складається з однотипних даних.

Див. також

Read other articles:

Liana LiberatoLiberato at the 2012 Toronto International Film Festival premiere of Stuck in LoveLahirLiana Daine Liberato20 Agustus 1995 (umur 28)Galveston, Texas, U.S.PekerjaanActressTahun aktif2005–present Liana Daine Liberato (lahir 20 Agustus 1995) adalah aktris film dan televisi berkebangsaan Amerika Serikat. Namanya dikenal luas ketika dia bermain dalam film The Best of Me tahun 2014 dan juga film tahun 2010, Trust dan The Last Sin Eater . Latar belakang Liberato lahir di G...

 

Liga 3 Lampung 2023Negara IndonesiaTanggal penyelenggaraan3 Januari 2024Tempat penyelenggaraan1 stadionJumlah peserta6 tim sepak bolaJuara bertahanAD Sport FCJuaraTS Saiburai Lampung(gelar ke-1)Tempat keduaPSBL Bandar LampungTempat ketigaSS Lampung FCKualifikasi untukLiga 3 2023 Putaran Nasional← 2022 (ditiadakan) 2024 → Liga 3 Lampung 2023 adalah edisi keenam dari Liga 3 Lampung yang diselenggarakan oleh Asprov PSSI Lampung.[1] Diikuti oleh 6 klub. Juara kompetisi ini akan l...

 

Holomycota NucleariaTaksonomiSuperdomainBiotaSuperkerajaanEukaryotaKladAmorpheaKladObazoaKladOpisthokontaSuperkerajaanHolomycota Tata namaSinonim takson Nucletmycea Brown et al. 2009[1] Holofungi Fungida Kelompok Cristidiscoidea Kingdom Fungi Aphelida Fungi sejati Rozellida lbs Holomycota atau Nucletmycea adalah sebuah klad Opisthokonta dan takson saudari dari Holozoa. Klad ini mencakup Cristidiscoidea dan kingdom Fungi. Posisi dari nucleariida, sejenis hewan amuba fagotrof unisel per...

Cari artikel bahasa  Cari berdasarkan kode ISO 639 (Uji coba)   Cari berdasarkan nilai Glottolog   Kolom pencarian ini hanya didukung oleh beberapa antarmuka Halaman rumpun acak Rumpun bahasaIndo-Arya IndikPersebaranAsia SelatanPenggolongan bahasaIndo-EropaIndo-IranIndo-Arya Zona Barat Laut Zona Utara Zona Tengah Zona Timur Zona Selatan Insular Kode bahasaISO 639-2 / 5incLokasi penuturan  Portal BahasaSunting kotak info • L • B • PWBantuan penggunaan t...

 

American city planning commentator O'Toole speaks at the Sensible Land-Use Coalition in Minneapolis in 2014 Randal O'Toole (born 1952) is an American public policy analyst. The majority of O'Toole's work has focused on public lands, land-use regulation, and transportation, particularly light rail. He frequently criticized proposals for passenger rail systems.[1][2][3] He had been associated with the Cato Institute as an adjunct scholar since 1995 and a senior fellow fr...

 

Un adaptateur d’antenne appelé aussi « coupleur d’antenne » adapte l’impédance de sortie d’un émetteur ou récepteur, généralement normalisée à 50 ohms, à l’impédance d’une antenne radioélectrique non résonnante à la fréquence utilisée, par exemple un fouet vertical de longueur fixe. Les adaptateurs peuvent être manuels ou automatiquement adaptés à la fréquence. Boîte de couplage automatique et antenne 1,6 MHz à 26 MHz sur un navire. ...

هيلسايد   الإحداثيات 41°55′05″N 74°02′00″W / 41.9181°N 74.0333°W / 41.9181; -74.0333   [1] تقسيم إداري  البلد الولايات المتحدة[2]  التقسيم الأعلى مقاطعة أولستر  خصائص جغرافية  المساحة 2.155999 كيلومتر مربع2.145579 كيلومتر مربع (1 أبريل 2010)  ارتفاع 97 متر  عدد السكان...

 

Cyclamen sp. Dracaena sanderiana Tanaman dalam ruangan adalah tanaman yang ditanam di dalam ruangan umumnya di dalam kantor dan rumah. Tujuan ditanamnya tumbuhan di dalam ruangan adalah untuk dekorasi dan kesehatan (fisik maupun psikologis). Tanaman dalam ruangan memiliki kebutuhan hidup yang sama dengan tanaman di luar ruangan. Efek terhadap kualitas udara Tanaman dalam ruangan dan ekosistem yang menyertainya (termasuk fauna tanah) meningkatkan kualitas udara dalam ruangan dengan menyerap se...

 

Expressway in Tehran, Iran This article does not cite any sources. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.Find sources: Abshenasan Expressway – news · newspapers · books · scholar · JSTOR (June 2019) (Learn how and when to remove this template message) You can help expand this article with text translated from the corresponding article in Persian. Click [show] for impor...

Zamfara merupakan sebuah negara bagian di Nigeria. Letaknya di bagian baratlaut. Ibu kotanya ialah Gusau. Didirikan pada tahun 1996. Negara bagian ini memiliki luas wilayah 39.762 km². Dengan memiliki jumlah penduduk sebanyak 3.602.356 jiwa (2005). Pembagian administrasi Anka Bakura Birnin-Magaji/Kiyaw Bukkuyum Bungudu Gummi Gusau Kaura-Namoda Maradun Maru Shinkafi Talata-Mafara Tsafe Zurmi lbsNegara bagian di Nigeria Abia · Wilayah Ibu Kota Federal Abuja · Adamawa · ...

 

Синелобый амазон Научная классификация Домен:ЭукариотыЦарство:ЖивотныеПодцарство:ЭуметазоиБез ранга:Двусторонне-симметричныеБез ранга:ВторичноротыеТип:ХордовыеПодтип:ПозвоночныеИнфратип:ЧелюстноротыеНадкласс:ЧетвероногиеКлада:АмниотыКлада:ЗавропсидыКласс:Пт�...

 

IGN

American entertainment website For other uses, see IGN (disambiguation). This article needs additional citations for verification. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.Find sources: IGN – news · newspapers · books · scholar · JSTOR (December 2022) (Learn how and when to remove this template message) IGNType of businessSubsidiaryType of siteEntertainmentAvailable ...

For the French Revolution militia, see National Guard (France). Republican GuardGarde républicaineEmblem of the Republican Guard[1]Active1848–presentCountry FranceBranchNational GendarmerieTypeInfantryCavalryRoleHonour GuardSecuritySize3,300 (Brigade of three regiments)Garrison/HQParisMarchDefile de la Garde RépublicaineMarch of the 1st Infantry Regiment (1st Infantry Regiment)Decorations Légion d'honneur Croix de Guerre TOEWebsiteOfficial website (in French)Military unit Th...

 

Edith Fischhof Gilboa in una foto del 2021 ospite a Sonnino presso il Museo delle terre di confine[12] Edith Fischhof Gilboa (Vienna, 5 giugno 1923[1]) è una giornalista e scrittrice austriaca, ebrea superstite dell'Olocausto, attiva testimone della Shoah[2][3] e costante relatrice nei Giorni della Memoria in diversi luoghi d' Italia[4][5][6] e in altri paesi europei[7][8][9]. Lo storico d'arte e accademico Aless...

 

Державний комітет телебачення і радіомовлення України (Держкомтелерадіо) Приміщення комітетуЗагальна інформаціяКраїна  УкраїнаДата створення 2003Керівне відомство Кабінет Міністрів УкраїниРічний бюджет 1 964 898 500 ₴[1]Голова Олег НаливайкоПідвідомчі ор...

Memorial in London, England This article includes a list of references, related reading, or external links, but its sources remain unclear because it lacks inline citations. Please help improve this article by introducing more precise citations. (December 2016) (Learn how and when to remove this message) The Rifle Brigade Memorial, Grosvenor Gardens, Westminster Central statue on the memorial The Rifle Brigade War Memorial in London commemorates the service of the Rifle Brigade in the First a...

 

هيئة فنون العمارة والتصميم البلد السعودية  المقر الرئيسي مدينة الرياض ،  السعودية تاريخ التأسيس 2020 النوع حكومية منطقة الخدمة المملكة العربية السعودية الرئيس د. سمية سليمان السليمان الموقع الرسمي الموقع الرسمي  تعديل مصدري - تعديل   هيئة فنون العمارة والتصميم هي...

 

Частина серії проФілософіяLeft to right: Plato, Kant, Nietzsche, Buddha, Confucius, AverroesПлатонКантНіцшеБуддаКонфуційАверроес Філософи Епістемологи Естетики Етики Логіки Метафізики Соціально-політичні філософи Традиції Аналітична Арістотелівська Африканська Близькосхідна іранська Буддій�...

ليونيديو    خريطة الموقع تقسيم إداري البلد اليونان  [1] خصائص جغرافية إحداثيات 37°09′57″N 22°51′16″E / 37.1657243°N 22.8544475°E / 37.1657243; 22.8544475   الارتفاع 40 متر  السكان التعداد السكاني 3737 (resident population of Greece) (2021)3165 (resident population of Greece) (2001)3526 (resident population of Greece) (1991)3761 (resi...

 

Galvano Fiamma Galvano Fiamma (in latino Galvanus o Galvagnus; Flamma, de Flama o de la Flamma; Milano, 1283 – Milano, 1344) è stato un frate domenicano, cappellano di Giovanni Visconti e cronachista milanese. Indice 1 Biografia 2 Opere 2.1 Galvano Fiamma cita l'America? 3 Note 4 Bibliografia 5 Altri progetti 6 Collegamenti esterni Biografia Galvano nacque presumibilmente a Milano nel 1283, come egli stesso dichiara nella sua Chronica parva, da una famiglia benestante milanese probabilment...