问题
- 我有几个数组,每个数组有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数字类型一样多的空间
- 假设我的数据不超过3个不同的值,那么实现
第一次尝试显然是有意义的:它从逻辑上对相关信息进行分组。第二个没有。
这可能只是一个美学问题,但根据您的用例,它可能会变得更多。例如,如果需要删除或插入元素,该怎么办?第二次尝试将需要重复的操作,以确保两个阵列保持同步。
您担心性能,但原因尚不清楚。您是否真的创建了性能不佳的代码,或者这只是猜测?
我的建议是:
- 使用逻辑正确的设计(尝试1)
- 当性能实际上成为一个问题时,解决它
没有特别的理由认为对象方法将是低效的。您可以创建这些对象的数组,因此这并不意味着所有对象都将"分散在不连续的内存中"。
如果性能是一个问题,那么退一步,对设计进行更广泛的考虑,而不仅仅是这一个问题。