目前,我正在使用大小为 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 中做这样的事情,我更快的选择是什么?