【问题标题】:A suitable data structure implementation for incrementing values in sparse indices in MatlabMatlab中稀疏索引中递增值的合适数据结构实现
【发布时间】: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


【解决方案1】:

您是否考虑过使用Map container

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

【讨论】:

  • 有趣。你知道Matlab中Map的整体效率吗?我说的是不同 Map 操作的时间复杂度。
  • 很遗憾,我目前的 Matalb 版本不支持Maps,所以我无法检查。我强烈建议你做一个小基准并自己检查。
  • 我看到 Map 的性能随着元素的增加而有所下降——当然这是意料之中的。牺牲性能代替内存是值得的。此外,地图可以容纳任何东西,这就是我想要的。如果一两天内没有其他答案,我会接受这个答案。
  • @Karl - 我很高兴你发现我的回答值得。我很想知道是否有更好的解决方案...
【解决方案2】:

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

mksqlitemym与mysql一起使用很方便。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-28
    • 2014-05-12
    • 1970-01-01
    • 1970-01-01
    • 2018-01-22
    • 1970-01-01
    • 2017-12-29
    • 1970-01-01
    相关资源
    最近更新 更多