1

在 D3 中,我需要可视化将实验室样品加载到 8 行 x 12 列或类似的塑料二维板中。有时我一次加载一行,有时一次加载一列,有时我加载平面 1D 0..95 或其他排序。基本 D3 data() 结构应该在列中嵌套行(反之亦然)还是应该保持一维?

表示为列优化的数据 [columns[rows[]] 使代码在按行加载时变得复杂,反之亦然。将其表示为平面 [0..95] 是通用的,但它需要计算 2D 模式的所有行和列引用。我宁愿引用一个共同基础的所有排序,但到目前为止,这是一个双赢的命题。我倾向于一维平面并做数学。有双赢吗?有没有办法参数化或反转排序并针对两种方式进行优化?

4

1 回答 1

0

我相信在您的情况下,最好的实现是关联数组(特别是它的哈希表实现)。键是坐标,值是您存储的数据。根据您的编程语言,您需要以一种或另一种方式处理密钥。

例子:

[0,0,0] -> someData(1,2,3,4,5)
[0,0,1] -> someData(4,2,4,6,2)
[0,0,2] -> someData(2,3,2,1,5)

使用简单的关联数组将为您提供出色的插入速度和读取速度,但是如果需要选择一些复杂的数据块,代码将变得一团糟。在这种情况下,使用一些数据库可能是合理的(尽管比关联数组的 hashmap 实现慢)。它可以让你批量查询一些特定的数据。例如,您可以使用一个简单的查询获取整行(或几行)数据:

SELECT * FROM data WHERE x=1 AND y=2 ORDER BY z ASC

或者,假设从 3d 数据的中间选择一个 2x2x2 立方体:

SELECT * FROM data WHERE x>=5 AND x <=6 AND y>=10 AND Y<=11 AND z >=3 AND z <=4 ORDER BY x ASC, y ASC, z ASC

编辑: 再想一想,如果维度的大小在运行时不会改变 - 你应该自己使用所有数学计算一维数组,因为它是最快的解决方案。如果您尝试将 3 维数组初始化为数组数组的数组,则对元素的每次读/写都需要在内存中增加 2 跳才能找到所需的地址。但是,编写一些函数,例如:

int pos(w,h, x,y,z) {return z*w*h+y*w+x;} //w,h - dimensions, x,y,z, - position

会使它被大多数编译器内联并且非常快。

于 2013-03-08T07:00:47.197 回答