2

目前,我正在使用大小为 1 x H 的单元格 C,其中 H 是一个非常大的数字。该单元主要用于在 O(1) 时间内快速存储和增加非常稀疏索引中的一些值。例如,

H = 10000000;
C = cell(1, H);
...
for i = 1:last

    % all values of someIndex(i) are values from 1 to H, unsorted, and contains repeating values.

    C{ someIndex(i) } = C{ someIndex(i) } + someValues(i);

end
...

只会使用单元格 C 中的一个很小的索引——我看到,大多数时候,大约是整个事情的 1-10%。起初,对于较小规模的数据库,实现是好的,但我会选择更大的数据库,H 将几乎呈指数增长。因此,这种幼稚的实现将不再有效。

我也在考虑类似的东西,而不是使用单元格,而是使用数组以这种方式存储每个索引和值:

假设我们检测到一个新索引:

IndexArray(size(IndexArray, 2) + 1) = someIndex(i);
ValueArray(size(ValueArray, 2) + 1) = someValue(i);

假设我们检测到一个旧索引:(当然,我们需要扫描整个 IndexArray 并查看是否存在这样的旧索引)

ValueArray( detectOldIndex(i) ) = ValueArray( detectOldIndex(i) ) + someValue(i);

但是,这也存在一个问题。随着越来越多的索引增长,扫描整个 IndexArray 将花费越来越多的时间。这是 O(N)。

当然,对于这样的事情,我们肯定要使用 Trees,但是,在 Matlab 中,我们没有有效的 Tree 结构。我可以考虑在嵌套单元格中使用嵌套单元格。但是实现可能非常难看。

所以如果我要在 Matlab 中做这样的事情,我更快的选择是什么?

4

2 回答 2

1

你考虑过使用Map container吗?

Map container基本上是一个哈希表。因此,在一个巨大的域上映射一小组“活动”索引应该是相当有效的。

于 2013-01-11T09:48:34.990 回答
1

如果你想做得很大,那么使用数据库可能是值得的。它还有额外的好处,您不必将完整的数据保存在内存中。

mksqlitemym与 mysql 一起使用很容易。

于 2013-01-11T11:17:26.580 回答