我有一个2d矩阵的双打。我的任务是在任何点找到矩阵的最大元素。
查询将有两种类型:
我想出了一个使用二进制堆的解决方案。我的想法是保持使用数组实现的n ^ 2个元素的最大值,并维护另一个大小为n ^ 2的数组以保持堆元素的索引。所以(i,j)矩阵中的元素只是(i * n + j)平面数组中的元素将存储与其在堆中的位置相对应的索引。
这样,2n-1次更新将在(2n-1)log(n ^ 2)时间内处理。并且可以在O(1)时间内回答最大查询。
我无法使用STL实现,因为我必须跟踪堆元素,即在更新查询时我应该知道应该更新哪些堆元素。 STL也不支持更改密钥。
如何改善更新查询时间?是否有其他数据结构可以更快地处理这些操作?
答案 0 :(得分:0)
我使用索引i*n+j
的STL向量。使用您自己的比较函数对这个n ^ 2大小的数组进行排序。更新后的排序是n ^ 2 O(log n ^ 2)。查询maximun是要求向量中的第一个元素。
如果您只对最大值感兴趣,可以保持其位置(i,j)缓存。更新矩阵后,只有在此缓存位置发生变化时才需要再次排序。