鉴于下表:
|A|B|C|
|0|0|1|
|1|0|3|
|1|1|1|
|1|2|1|
|1|3|1|
|1|4|2|
|2|5|1|
我需要提出最有效的算法和存储格式,这将允许我,确定给定A和B的C:
+-----------+
| BLACK |
A = 0, B = 0 -> | BOX | -> 1
+-----------+
+-----------+
| BLACK |
A = 1, B = 4 -> | BOX | -> 2
+-----------+
算法应该在内存和效率之间提供良好的折衷。我的第一次尝试是从A和B中创建一个哈希并将其用作地图的键:
{
"0.0": 1,
"1.0": 3,
"1.1": 1,
"1.2": 1,
"1.3": 1,
"1.4": 2,
"2.5": 1
}
但是我怀疑它是最好的方法(关于为这样的地图分配的内存和查找时间,因为这个表可以包含数千行)。
有人能告诉我一个更好的解决方案吗?
答案 0 :(得分:1)
即使对于数千行,哈希表听起来也是一种非常合理的方法。你用的是什么语言?你的桌子有多大,第一次尝试的表现是什么?
您可以使用数据中的模式吗? A,B和C的可能范围是多少?
需要更多数据。
[这是评论不是答案,但显然我没有足够的声誉来发表评论。]
更新以包含我的嵌套数组想法的示例:
var table = [];
function add_entry (A, B, C) {
if (!table[A])
table[A] = []; // create if it doesn't already exist
table[A][B] = C;
}
function retrieve_entry (A,B) {
return table[A][B];
}
这产生了如下结构:
table = [
[ 1 ],
[ 3, 1, 1, 1, 2 ],
[ undefined, undefined, undefined, undefined, undefined, 1 ]
];
标准的javascript数组,只是伪装的对象,处理稀疏性就好了。 由于我错过了B均匀增加的部分,即使A改变(我认为B每次都重新开始为零),如果使用类型数组,则需要显式存储(类型数组,偏移)对;你还需要事先确定尺寸。这可能有点乱,但应该是完全可行的。它可能会或者可能不会更有效,主要取决于每个B值有多少C值。