我必须实现一个二维区间矩阵,如:
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 ++。
答案 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
权重间隔。如果我们将这些n
和m
存储在age-intervals
或weight-intervals
中,则sorted vector
或map
计算将为age-interval
},row
或O(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);
。