Loading AI tools
Из Википедии, свободной энциклопедии
В программировании, паралле́льный масси́в — структура данных для представления массива записей, которая физически состоит из отдельных однотипных массивов одинаковой длины для каждого из полей записи. Значения элементов с одинаковым порядковым номером в каждом массиве, логически принадлежат одной структуре. В качестве указателей на структуру используется общий индекс в параллельном массиве. Этот подход отличается от традиционного, при котором все поля структуры хранятся в соседних областях памяти. К примеру, можно объявить массив строкового типа для 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
У параллельных массивов есть ряд практических достоинств по сравнению с классическим подходом:
Несмотря на это, у параллельных массивов есть несколько существенных недостатков, которые объясняют, почему они не используются повсеместно:
Плохая локальность является серьезным недостатком, но можно воспользоваться следующими подходами, чтобы уменьшить серьезность проблемы и её влияние на производительность:
[рост1, вес1, возраст1, рост2, вес2, возраст2, ...]
, таким образом, для получения J–ного поля (из M) в I–той записи (из N), нужно обратиться к элементу с индексом (M * I + J). Некоторые компиляторы автоматически способны применять подобную оптимизацию для разворачивания массивов структур для адаптации под векторные процессоры и SIMD–инструкции.Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.