二维区间矩阵

时间:2014-09-24 10:20:40

标签: c++ data-structures

我必须实现一个二维区间矩阵,如:

            Weight Range.
AgeRange.   7-10kg       11-17kg      18-30kg       31-60kg     61-80kg...
1  - 10       0             0           0              0           0
11 - 20       0             0           0              0           0
21 - 30       0             0           0              0           0
31 - 40       0             0           0              0           0
41 - 50       0             0           0              0           0
...

Weight Range. AgeRange. 7-10kg 11-17kg 18-30kg 31-60kg 61-80kg... 1 - 10 0 0 0 0 0 11 - 20 0 0 0 0 0 21 - 30 0 0 0 0 0 31 - 40 0 0 0 0 0 41 - 50 0 0 0 0 0 ... 让我将上述内容称为AWMatrix。 我的间隔是静态的,一旦建成就不会改变。最初所有数据在矩阵中都为零

支持的操作:

AddData(Age, Weight): example AddDate(1, 9) will increment AWMatrix[0,0] by 1.
                      example AddDate(32, 74) will increment AWMatrix[3,4] by 1.
GetData(Age, Weight) : example GetData(32, 62) will return 1.

年龄和体重间隔都不重叠。

我读过有关间隔树/段树的内容。这些是要走的路,还是我们可以在这里使用更专业的东西?我正在使用C ++。

2 个答案:

答案 0 :(得分:1)

以下可能会有所帮助:

std::pair<std::size_t, std::size_t>
GetIndexes(std::size_t age, std::size_t weight)
{
    if (age == 0) { // Maybe high limit
        throw std::out_of_range("Bad age value");
    }
    if (weight < 7 ) { // Maybe high limit
        throw std::out_of_range("Bad weight value");
    }
    // age_index can be computed simply
    // but age_index can be found in a similar way that weight_index
    const std::size_t age_index = (age - 1) / 10; 

    const std::vector<int> v = { 6, 10, 17, 30, 60, 80 };
    const std::size_t weight_index = std::lower_bound(v.begin(), v.end(), weight) - v.begin();

    return std::make_pair(age_index, weight_index - 1);
}

所以GetIndexes(32, 74) == GetIndexes(32, 62) == std::make_pair(3u, 4u)

答案 1 :(得分:0)

这是解决此问题的简单方法。要执行操作AddData(age, weight),请找到包含age-interval(or row)的{​​{1}},找到包含age的{​​{1}},然后执行操作weight-interval (or column)。操作weight的结果由AWMatrix[row][column]++给出 因此,问题减少到矩阵中的点(或元素)更新和点(或元素)查询。由于分段树用于解决涉及GetData(age,weight)AWMatrix[row][column]的问题,因此无需在此处使用分段树。
我们假设有point updation-range query年龄间隔和range updation-point query权重间隔。如果我们将这些nm存储在age-intervalsweight-intervals中,则sorted vectormap计算将为age-interval },rowO(log(n))计算将为weight-interval,其余操作将为column
因此O(log(m))O(1)

如果Time Complexity = O(log(m) + log(n))的数量远小于Space Complexity =O(n*m)并且我们希望降低空间复杂度,那么我们可以使用以下方法。
制作地图:(row,col) pairs
操作O(n*m)如下:
map< pair<row,col> , val>
AddData(age, weight)
if(map.find(make_pair(row,col))!=map.end())
map[make_pair(row,col)]++;

操作else如下:
map[make_pair(row,col)]=1;
GetData(age, weight)
if(map.find(make_pair(row,col))!=map.end())
return(map[make_pair(row,col)]);

时间复杂度= else
空间复杂度= return(0);