有效的2D阵列增量数据结构

时间:2016-05-21 11:56:50

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

我正在制作原型,目前还不确定如何设计一个装载的装备。

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

详细信息:

  1. 形成delta以询问整个数组的某个顺序操作率的增量为1:1。
  2. 目前,存储了浮动数据,但我不想将其作为实施细节固定。
  3. Delta有固定的尺寸;它与数组的行数量相同(或列;数组总是方形的,另外)。
  4. 这可以改为使用和编写代码以相同(或任何其他相互已知的)顺序放置和读取,但我不知道,这是使用它来优化它的最佳方式。 / LI>

    P.S。它是一项Java任务,但作为一般数据结构问题:C,Perl,Mathematica,Fortran,伪代码或想法是值得欢迎的,其他基于语言的示例可能对我来说不太清楚。 < / p>

1 个答案:

答案 0 :(得分:1)

有效地存储&#34; delta&#34; (如果差异)两个2D数组之间的大多数值预期是相同的,您可以使用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
}