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

В программировании, паралле́льный масси́вструктура данных для представления массива записей, которая физически состоит из отдельных однотипных массивов одинаковой длины для каждого из полей записи. Значения элементов с одинаковым порядковым номером в каждом массиве, логически принадлежат одной структуре. В качестве указателей на структуру используется общий индекс в параллельном массиве. Этот подход отличается от традиционного, при котором все поля структуры хранятся в соседних областях памяти. К примеру, можно объявить массив строкового типа для 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 битовых поля в одном элементе, в зависимости от разрядности архитектуры процессора.
  • Если количество элементов мало, индексы массива занимают существенно меньше пространства, чем полноценные указатели, особенно на архитектурах с большой разрядностью.
  • Последовательное чтение единственного поля каждой записи в массиве очень быстро на современных компьютерах, т.к. это равноценно линейному проходу по единственному массиву, что дает идеальные локальность и поведение кэша.

Несмотря на это, у параллельных массивов есть несколько существенных недостатков, которые объясняют, почему они не используются повсеместно:

  • У них существенно хуже локальность при последовательном проходе по записям и чтении нескольких полей, что является типовой задачей.
  • Связь между полями одной записи может быть неочевидной и запутанной.
  • Достаточно малое количество языков поддерживает параллельные массивы, как полноценные структуры — язык и его синтаксис, как правило, не обозначают связь между массивами в параллельном массиве.
  • Изменение размера параллельного массива — достаточно дорогостоящая операция, т.к. требуется заново выделить память под каждый из субмассивов. Многоуровневые массивы являются частичным решением этой проблемы, но накладывают ограничение на производительность из–за введения дополнительного слоя перенаправлений, чтобы найти требуемый элемент.
  • При использовании параллельных массивов приходится печатать больше букв, чем при объявлении структуры записи. Это нерациональный подход к использованию рук программистов.

Плохая локальность является серьезным недостатком, но можно воспользоваться следующими подходами, чтобы уменьшить серьезность проблемы и её влияние на производительность:

  • Если у записи есть раздельные наборы полей, которые, как правило, используются вместе, можно поделить структуру на несколько, и сделать параллельный массив из таких частичных записей. Этот способ позволяет существенно увеличить производительность доступа к очень большим структурам, сохраняя их логическое объединение. Если это допустимо, некоторые поля структуры могут быть продублированы в различных субструктурах, но тогда на программиста ложится задача отслеживания изменения дублирующихся полей и обновления всех экземпляров.
  • Вместо индексов массивов можно использовать ссылки, но результирующая производительность сильно зависит от языка, компилятора и архитектуры процессора — подобное решение может быть неэффективным как по времени выполнения, так и по объему занимаемой памяти.
  • Еще одним вариантом является объединение полей совместимых типов в единый одномерный массив так, чтобы поля, принадлежащие к одной структуре, были записаны последовательно. К примеру, есть параллельный массив из записей для роста, веса и возраста — вместо трех раздельных массивов можно создать один, в котором записи будут иметь следующий вид: [рост1, вес1, возраст1, рост2, вес2, возраст2, ...], таким образом, для получения J–ного поля (из M) в I–той записи (из N), нужно обратиться к элементу с индексом (M * I + J). Некоторые компиляторы автоматически способны применять подобную оптимизацию для разворачивания массивов структур для адаптации под векторные процессоры и SIMD–инструкции.

См. также

Read other articles:

For the active professional club from Weert, see Basketball Academie Limburg. Basketball team in Weert, NetherlandsBSWLeaguesDutch Basketball LeagueFounded1968Dissolved2017ArenaSporthal BoshovenCapacity1,000LocationWeert, NetherlandsOwnershipStichting Basketball Stars WeertChampionships1 Dutch League Home Away Basketball Stars Weert, commonly known as BSW, was a professional basketball team based in Weert, Netherlands. The club was founded in 1968 and played in the Dutch Basketball League. ...

 

Dewarick Spencer Datos personalesNombre completo Dewarick Antwain SpencerNacimiento Mobile, Alabama  Estados Unidos04 de mayo de 1982 (41 años)Nacionalidad(es) EstadounidenseAltura 1,93 m (6′ 4″)Peso 95 kg (209 lb)Carrera deportivaDeporte BaloncestoEquipo universitario Iowa Western CC (2000-2001)Faulkner State CC (2001–2002)Arkansas State (2003-2005)Club profesionalDraft No elegido, 2005Club Agente librePosición Escolta       ...

 

هذه المقالة بحاجة لصندوق معلومات. فضلًا ساعد في تحسين هذه المقالة بإضافة صندوق معلومات مخصص إليها. يفتقر محتوى هذه المقالة إلى الاستشهاد بمصادر. فضلاً، ساهم في تطوير هذه المقالة من خلال إضافة مصادر موثوق بها. أي معلومات غير موثقة يمكن التشكيك بها وإزالتها. (يناير 2022) جغرافية

Artikel ini sebatang kara, artinya tidak ada artikel lain yang memiliki pranala balik ke halaman ini.Bantulah menambah pranala ke artikel ini dari artikel yang berhubungan atau coba peralatan pencari pranala.Tag ini diberikan pada Februari 2023. SD Pamor NusantaraInformasiJenisSekolah SwastaAlamatLokasi, Batam, Kepri,  IndonesiaMoto SD Pamor Nusantara, merupakan salah satu Sekolah Dasar swasta yang ada di Batam, Provinsi Kepulauan Riau. Sama dengan SD pada umumnya di Indonesia masa pendi...

 

TADANO Ltd.Nama asli株式会社タダノJenisPublik KKKode emitenTYO: 6395IndustriPermesinanDidirikanTakamatsu, Kagawa (24 Agustus 1948; 75 tahun lalu (1948-08-24))PendiriMasuo TadanoKantorpusatTakamatsu, Kagawa, 761-0185, Jepang[1]Wilayah operasiSeluruh duniaTokohkunciKoichi Tadano(Presiden dan CEO)ProdukDerek konstruksiDerek pemuat trukAnjungan kerjaPendapatan JPY 181,7 milyar (FY 2013) (US$ 1,7 milyar) (FY 2013)Laba bersih JPY 14,4 milyar (FY 2013) (US$ 139,9 juta) (FY 2013)K...

 

Dipa Karmakar— Pesenam —Nama lengkapDipa KarmakarNegaraIndiaLahir09 Agustus 1993 (umur 30)[1]Agartala, Tripura, IndiaKota asalAgartala, TripuraTinggi4 kaki 11 inchDisiplinSenam berirama putriTingkatSenior International ElitePelatihBisweshwar Nandi Rekam medali Mewakili  India Commonwealth Games 2014 Glasgow Vault Kejuaraan Asia 2015 Hiroshima Vault Dipa Karmakar (lahir 9 Agustus 1993)[1] adalah seorang pesenam artistik yang mewakili India di Olimpiade M...

تياغو إيسخايو معلومات شخصية الميلاد 1 أغسطس 1995 (28 سنة)  نازاري (البرتغال)  الطول 1.75 م (5 قدم 9 بوصة) مركز اللعب وسط الجنسية البرتغال  معلومات النادي النادي الحالي أروكا(معارًا من سبورتينغ براغا) الرقم 31 مسيرة الشباب سنوات فريق 2003–2009 Nazarenos 2009–2013 أونياو ليريا 2013–...

 

Saint James the GreatArtistEl GrecoYear1610Mediumoil on canvasDimensions72 cm × 55 cm (28 in × 22 in)LocationMuseo del Prado, Madrid Saint James the Great is a 1610 painting of James the Great by El Greco, now in the Museo del Prado. The painting is key to Gregorio Marañón's theory that the painter used mental patients at the Hospital del Nuncio as models. It originally formed part of a series of works produced by the artist for the parish church ...

 

Karnataka formation day Kannada RajyotsavaKarnataka State DayTraditional dance of Dollu Kunitha in progress as part of RajyotsavaAlso calledKannada Rajyotsava, Karnataka Formation DayObserved byKannadigas in India and overseas[1]TypeStateSignificanceUnification of Kannada-speaking regions of South India as the state of KarnatakaCelebrationsHoisting of Kannada flag, Processions, Cultural events, Rajyotsava Awards[2]Date1 NovemberNext time1 November 2024 (2024-11-...

Lokasi Kabupaten Buru di Provinsi Maluku Berikut ini adalah daftar kecamatan dan desa di Kabupaten Buru, Provinsi Maluku, Indonesia. Kabupaten Buru terdiri atas 10 kecamatan dan 82 desa dengan luas wilayah 4.932,32 km² dan jumlah penduduk 130.696 jiwa (2017). Kode Wilayah Kabupaten Buru adalah 81.04.[1][2][3] Kode Wilayah Nama Kecamatan Ibu kota Jumlah Desa Daftar Kelurahan dan Desa 81.04.01 Namlea Namlea 7 lbsKecamatan Namlea, Kabupaten Buru, MalukuDesa Batuboy Jamil...

 

2020 video gameDisney Twisted-WonderlandDeveloper(s)f4samuraiPublisher(s)JP: AniplexNA: Aniplex of AmericaDesigner(s)Yana TobosoArtist(s)Wataru Osakabe ATELIER MUSAComposer(s)Takumi Ozawa Half HP StudioPlatform(s)Android, iOSReleaseJP: March 18, 2020NA: January 20, 2022Genre(s)Adventure, rhythmMode(s)Single-player Disney Twisted-Wonderland (ディズニー ツイステッドワンダーランド, Dizunī Tsuisuteddo Wandārando)[1] is a Japanese mobile game created by Aniplex and Walt...

 

石川県立七尾東雲高等学校 県立七尾東雲高等学校 北緯37度0分46秒 東経136度55分45.6秒 / 北緯37.01278度 東経136.929333度 / 37.01278; 136.929333座標: 北緯37度0分46秒 東経136度55分45.6秒 / 北緯37.01278度 東経136.929333度 / 37.01278; 136.929333国公私立の別 公立学校(県立)設置者  石川県学区 (演劇科)全国募集(演劇科以外)全県一学区併合学校 石川県...

Chinese television series The Love You Give MePromotional posterSimplified Chinese你给我的喜欢Hanyu PinyinNǐ gěi wǒ de xǐhuān Genre Romance Comedy Based onThe Hope You Gave Meby Shi DingrouWritten by Guo Shuang Directed byDing YingzhouStarring Wang Yuwen Wang Ziqi Cui Yixin Li Chuan Ma Xinrui Opening themeBraving Love by Yu JiayunEnding themeI Always Love You by Curley GaoCountry of originChinaOriginal languageMandarinNo. of seasons1No. of episodes28ProductionProduction locationsSh...

 

Romanian-born American tennis player Edina Gallovits-HallGallovits-Hall at the 2015 Wimbledon ChampionshipsFull nameKlaudia Edina Gallovits-HallCountry (sports) Romania (1999–2014)  United States (2015)ResidenceAtlanta, Georgia, U.S.Born (1984-12-10) December 10, 1984 (age 38)Timișoara, RomaniaHeight1.65 m (5 ft 5 in)Turned pro1999PlaysRight-handed (two-handed backhand)Prize money$1,294,978SinglesCareer record419–262 (61.5%)Career ti...

 

Jean-Jacques Rousseau Pertimbangan-Pertimbangan perihal Pemerintahan Polandia (judul asli dalam bahasa Prancis: Considérations sur le gouvernement de Pologne) adalah sebuah esai yang ditulis pada tahun 1782 oleh filsuf Prancis Jean-Jacques Rousseau perihal rancangan undang-undang dasar baru untuk Persemakmuran Polandia-Lituania. Karya ini merupakan tulisan terakhir Rousseau mengenai teori politik. Rousseau menulis esai ini setelah mendapatkan permintaan dari Michał Wielhorski agar ia member...

American football player (born 1975) This article may need to be rewritten to comply with Wikipedia's quality standards. You can help. The talk page may contain suggestions. (May 2016) American football player Lamar KingNo. 92Position:Defensive endPersonal informationBorn: (1975-08-10) August 10, 1975 (age 48)Baltimore, Maryland, U.S.Height:6 ft 3 in (1.91 m)Weight:311 lb (141 kg)Career informationHigh school:Essex (MD) ChesapeakeCollege:Saginaw Valley StateNFL D...

 

Supermarket chain in Hawaii For other uses, see Foodland. FoodlandTypeSubsidiaryIndustryRetailFounded1948 (Honolulu, Hawaii)HeadquartersHonoluluNumber of locations32ProductsBakery, dairy, deli, frozen foods, general grocery, meat, pharmacy, produce, seafood, snacks, liquorParentSullivan Family of CompaniesWebsitefoodland.com Foodland Hawaii store in Pupukea, O‘ahu. Sack 'n Save store in Kailua Kona, Hawaii, USA Foodland (Full name Foodland Super Market, Ltd.) is an American supermarket chai...

 

Chrysler New Yorker Descrizione generale Costruttore  Chrysler Produzione dal 1940 al 1996 Serie Prima (1940–1942)Seconda (1946–1948)Terza (1949–1954)Quarta (1955–1956)Quinta (1957–1959)Sesta (1960–1964) Settima (1965–1968) Ottava (1969–1973) Nona (1974–1978) Decima (1979–1981) Undicesima (1982) Dodicesima (1983–1988) Tredicesima (1988–1993) Quattordicesima (1994–1996) Sostituita da Chrysler LHS La New Yorker è un'autovettura full-size prodotta dalla Chrys...

Sonia Vivas Información personalNacimiento 25 de mayo de 1978 (45 años)Barcelona (España) EducaciónEducada en Universidad Nacional de Educación a Distancia (Grado en Educación Social) Información profesionalOcupación Policía, escritora y entrenadora Cargos ocupados Concejal del Ayuntamiento de PalmaFecha de fundación (2019-2022) [editar datos en Wikidata] Sonia Vivas Rivera (Vall d'Hebron, Barcelona, 25 de mayo de 1978) es una política, articulista, activista so...

 

Sub-district in Al Bayda, YemenAl Hayash آل هياشSub-districtAl HayashLocation in YemenCoordinates: 14°7′48″N 45°20′21″E / 14.13000°N 45.33917°E / 14.13000; 45.33917Country YemenGovernorateAl BaydaDistrictAt TaffahPopulation (2004) • Total7,116Time zoneUTC+3 Al Hayash (Arabic: آل هياش) is a sub-district located in At Taffah District, Al Bayda Governorate, Yemen. Al Hayash had a population of 7116 according to the 2004 census...

 

Strategi Solo vs Squad di Free Fire: Cara Menang Mudah!