使用更新查询在2d矩阵中查找最大值的最佳数据结构

时间:2017-02-10 10:37:50

标签: c++ arrays algorithm

我有一个2d矩阵的双打。我的任务是在任何点找到矩阵的最大元素。

查询将有两种类型:

  • 更新查询:在此查询中,将更新2n-1个元素,即将更新第i行和第i列的所有元素。 (通过更新我的意思是,更改元素,它可以是任何内容,增量或减量)
  • 最大查询:返回2d数组中的最大元素。

我想出了一个使用二进制堆的解决方案。我的想法是保持使用数组实现的n ^ 2个元素的最大值,并维护另一个大小为n ^ 2的数组以保持堆元素的索引。所以(i,j)矩阵中的元素只是(i * n + j)平面数组中的元素将存储与其在堆中的位置相对应的索引。

这样,2n-1次更新将在(2n-1)log(n ^ 2)时间内处理。并且可以在O(1)时间内回答最大查询。

我无法使用STL实现,因为我必须跟踪堆元素,即在更新查询时我应该知道应该更新哪些堆元素。 STL也不支持更改密钥。

如何改善更新查询时间?是否有其他数据结构可以更快地处理这些操作?

1 个答案:

答案 0 :(得分:0)

我使用索引i*n+j的STL向量。使用您自己的比较函数对这个n ^ 2大小的数组进行排序。更新后的排序是n ^ 2 O(log n ^ 2)。查询maximun是要求向量中的第一个元素。

修改

如果您只对最大值感兴趣,可以保持其位置(i,j)缓存。更新矩阵后,只有在此缓存位置发生变化时才需要再次排序。