平行數組

平行數組程序設計採用多個數組隱式表示一個以記錄(record)為元素的數組。多個數組在同一下標的元素隱式對應於記錄的各個域。

例子

例如,可以聲明一個數組包含100個名字,另一個數組包含100個年齡(整型),相同下標的元素成對表示一個人:

int  ages[]   = {0,          17,        2,          52,         25};
char *names[] = {"None",     "Mike",    "Billy",    "Tom",      "Stan"};
int  parent[] = {0 /*None*/, 3 /*Tom*/, 1 /*Mike*/, 0 /*None*/, 3 /*Tom*/};

for(i = 1; i <= 4; i++) {
    printf("Name: %s, Age: %d, Parent: %s \n",
           names[i], ages[i], names[parent[i]]);
}

Perl語言:

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

for $i (0..$#{$data{first_name}}) {
    printf "Name: %s %s\n", $data{first_name}[$i], $data{last_name}[$i];
    printf "Height in CM: %i\n", $data{height_in_cm}[$i];
}

Python語言:

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

for i in range(len(first_names)):
    print "Name: %s %s" % (first_names[i], last_names[i])
    print "Height in CM: %s" % heights_in_cm[i]

# Using zip:
for first_name, last_name, height in zip(first_names, last_names, heights_in_cm):
    print "Name: %s %s" % (first_name, last_name)
    print "Height in CM: %s" % height_in_cm

優點與缺點

優點:

  • 可用於僅支持基本類型作為數組元素類型的那些編程語言
  • 易於理解使用
  • 可能會避免了內存對齊從而節省了內存占用。
  • 順序遍歷小數組有利於提高cache一致性。
  • 有利於使用SIMD指令。

缺點:

  • 使用多個域時不利於cache性能
  • 增加或刪除元素時代價高昂。

參見

參考文獻

  • Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein. Introduction to Algorithms, Second Edition. MIT Press and McGraw-Hill, 2001. ISBN 0-262-03293-7. Page 209 of section 10.3: Implementing pointers and objects.
  • Skeet, Jon. Anti-pattern: parallel collections. 2014-06-03 [2014-10-28]. (原始內容存檔於2014-10-28).