最佳阵列设置

Optimal array setup

问题

例如:

array1 = [0,0,0,0,1,2,2,2,2,0,2,2,0,1,..etc]
array2 = [1,1,1,1,1,1,2,2,2,2,0,2,2,1,..etc]

我的尝试1

我想到了将数组中的每个元素都转换成一个对象

{
  data: 0,   // or 1 or 2
  pointer: other_array[some_index].data
}

(我希望 blah.data returns 是指针而不是数据)

但这感觉会减慢数据的检索速度,因为它们现在可能分散在不连续的内存中。

我的尝试2

我想将每个数组转换为两个关联数组,而不是使用对象数组:

my_array = {
   data_array: [0,1,2,2,2,2,1,1,1,1,1,2,2,2],
   pter_array: [o_a.data_array[0], o_a.data_array[1], o_a.data_array[2], ... ]
};

(其中 o_a 是一些 other_array)

这样看起来 data_array 至少会更连续,并且检索速度有望更快,但我的指针数组可能不是指针。


问题:

第一次尝试显然是有意义的:它在逻辑上对相关信息进行了分组。第二个没有。

这可能只是一个美学问题,但根据您的用例,它可能会变得更复杂。例如,如果您需要删除或插入一个元素怎么办?您的第二次尝试将需要重复操作以确保两个阵列保持同步。

您担心性能问题,但不清楚原因。您是否真的创建了性能不佳的代码,或者这只是猜测?

我的建议是:

  • 使用逻辑上正确的设计(尝试 1)。
  • 在实际成为问题时解决性能问题。

没有特别的理由假设对象方法效率低下。您可以将这些对象组成一个数组,所以这并不意味着所有内容都是 "scattered in non-contiguous memory".

如果性能 一个问题,请退后一步,对设计进行更广泛的考虑,而不仅仅是这个问题。