【发布时间】:2012-12-25 20:41:11
【问题描述】:
目前,我正在使用大小为 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 中做这样的事情,我更快的选择是什么?
【问题讨论】:
-
为什么要使用元胞数组,而不是
sparse矩阵?这些值不只是标量吗? -
在某些情况下,我需要在这种情况下存储数组或字符串,所以...
-
好的,很抱歉不清楚这一点。
标签: matlab data-structures binary-tree implementation sparse-matrix