在D3中,我需要将实验室样品加载到8行×12列或类似的塑料2D板中。 有时我一次加载一行,有时一次加载一行,偶尔我会加载1D 0..95或其他排序。 基础D3数据()结构是否应在列中嵌套行(或反之亦然),还是应该保持一维?
表示为列[columns [rows []]优化的数据会使代码在按行加载时变得复杂,反之亦然。表示平坦[0..95]是通用的,但它需要计算2D模式的所有行和列参考。我宁愿从一个共同的基础引用所有的排序,但到目前为止它是一个双赢的主张。我倾向于一维平坦并做数学。有双赢吗? 有没有办法参数化或反转排序并对两种方式进行优化?
答案 0 :(得分:0)
我相信在你的情况下,最好的实现是Associative array(具体来说,是hash table的实现)。键将是坐标,值将是您存储的数据。根据您的编程语言,您需要以某种方式处理密钥。
示例:
[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
修改强> 再想一想,如果尺寸的大小在运行期间不会改变 - 你应该自己使用所有数学的1维数组,因为它是最快的解决方案。如果您尝试将三维数组初始化为数组数组,则每次对元素的读/写操作都需要在内存中再添加2个跃点才能找到所需的地址。但是,写一些函数如:
int pos(w,h, x,y,z) {return z*w*h+y*w+x;} //w,h - dimensions, x,y,z, - position
会让大多数编译器内联并且非常快。