表3xN的高效算法和存储格式

时间:2013-05-16 06:49:47

标签: arrays algorithm storage lexer dfa

鉴于下表:

|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
}

但是我怀疑它是最好的方法(关于为这样的地图分配的内存和查找时间,因为这个表可以包含数千行)。

有人能告诉我一个更好的解决方案吗?

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值。