最佳阵列设置

Optimal array setup

本文关键字:设置 阵列 最佳      更新时间:2023-09-26

问题

  • 我有几个数组,每个数组有2000个数字,它们是0、1或2中的任意一个

例如:

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]
  • 我想测试相关性,所以理想情况下,这些数组中的每个元素都应该有两个属性:

    • 数据:0、1或2
    • 指向另一个数组的指针(如果数据与同一索引匹配,或者为null)
  • 我不想直接复印,但不是必须的。


我的尝试1

我想把数组中的每个元素转换成一个Object

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

(我希望blah.data返回的是指针,而不是数据)

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

我的尝试2

我想我应该把每个数组转换成两个关联数组,而不是一个Object数组:

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是其他阵列)

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


问题:

  • 哪种实施方式更好?第二次尝试比第一次快吗
  • JS似乎只有64位的数字类型。我是否有使用64位浮点来存储我的数字,而一个字节的作用不止于此?
    • 假设我的数据不超过3个不同的值,那么实现enum(通过bools?)会更有效吗?还是会浪费与JS数字类型一样多的空间

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

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

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

我的建议是:

  • 使用逻辑正确的设计(尝试1)
  • 当性能实际上成为一个问题时,解决它

没有特别的理由认为对象方法将是低效的。您可以创建这些对象的数组,因此这并不意味着所有对象都将"分散在不连续的内存中"。

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