【问题标题】:Effective 2D array's delta data structure有效二维数组的增量数据结构
【发布时间】:2016-09-18 15:48:49
【问题描述】:

我正在制作原型,目前不知道如何设计一个装载齿轮。

它的目的很简单——保存 2D 数组的 delta 并稍后将其作为 getDelta(i,j) 或通过任何其他接口返回。现在不需要最好的压缩,只是不是数组大小内存的 O^2,但性能是。

详情:

  1. 形成delta以某种顺序求整个数组的delta,运算率为1:1。
  2. 目前,存储了一个浮点数据,但我不想将其作为实现细节。
  3. Delta 得到固定大小;它与数组的行数(或列数;此外,数组始终为正方形)相同。
  4. 这可以修改消费者和编写者代码以相同(或任何其他相互已知的)顺序放置和读取,但我不知道,这是使用它来优化它的最佳方法。

附注这是一项 Java 任务,但作为一般数据结构问题:C、Perl、Mathematica、Fortran、伪代码或想法是受欢迎的,其他基于语言的示例对我来说可能不太清楚。

【问题讨论】:

    标签: arrays algorithm performance multidimensional-array data-structures


    【解决方案1】:

    为了有效地存储两个二维数组之间的“delta”(即差异),以防大多数值是相同的,您可以使用hash mapmap 来存储仅用于不同的元素。

    用 C++ 快速实现:

    #include <bits/stdc++.h>
    using namespace std;
    
    typedef float value_type;
    vector<vector<value_type>> original_array;
    map<pair<int, int>, value_type> different_elements;
    
    void calculate_delta(const vector<vector<value_type>> &another_array) {
        int i, j;
        for (i = 0; i < original_array.size(); ++i) {
            for (j = 0; j < original_array[i].size(); ++j) {
               if (another_array[i][j] != original_array[i][j]) {
                   // store the different element
                   different_elements.insert(make_pair(make_pair(i, j),
                                                       another_array[i][j]);
               }
            }
        }
    }
    
    value_type get_delta(int i, int j) {
        auto it = different_elements.find(make_pair(i, j));
        if (it == different_elements.end()) {
            return original_array[i][j];
        }
        return it->second; // return the stored value
    }
    

    【讨论】:

    • 谢谢。如果我们谈论效率 - 地图接口实现在这里很重要。您建议的地图类型是哪些(附加的哈希地图/表格除外)?在第一个版本中,我将使用 HashMap(您也链接它)和 SortedMap(黑红树的实现)生成类似的代码。它显示为一种太慢的方法 - 新的关键对象生成和散列操作 ^2 从矩阵大小,这也是内存和相关操作开销(不存储在外部,但在 C 案例中被垃圾收集或破坏)。
    • @Les 在哈希映射中生成插入和查找的键具有O(1) 时间复杂度。查找和插入本身的预期复杂性,假设一个ok的散列函数也是O(1)。所有主要编程语言中映射和哈希映射的实际实现也非常有效。量化什么对您来说“太慢”,并提供有关您已经考虑过的方法的详细信息(代码)。
    • 是的,理论上的 O(1) 仍然是糟糕的表现。对不起,我经常对学术计算机科学的同事说同样的话。问题的更好角度是整个 delta put 或 get bulk 操作有一个 O("array side size"^2) 。我为仅写入两个原始数组(增量及其行 idx,包含在原始数组的元素顺序中的另一个信息)的基于游览的增量解决了这个问题,但上面的问题仍然让我感兴趣。
    猜你喜欢
    • 1970-01-01
    • 2018-12-02
    • 1970-01-01
    • 2015-07-13
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2012-02-28
    • 2021-09-22
    相关资源
    最近更新 更多