如何快速搜索二维矩阵所有局部窗口极大值

godenlove007 2014-04-17 09:58:58
小弟想在一个二维矩阵中搜索局部窗口极大值,各位大牛可否给出一些好方法?

具体问题如下:
============================
对于一个大小为N * N的矩阵中的每个点P,在以P为圆心,半径为m的圆形窗口内,判定P是否是这个圆窗口内所有元素的局部极大值。要求能够找到整个矩阵内所有满足此条件的元素。(圆形窗口限制也可以放宽到以P为中心,宽高皆为(2m+1)的矩形窗口。)
===========================
本人目前只能想出复杂度为O(N * N * (2m+1) * (2m+1))的遍历算法,速度不行啊!

如果您能够给出一个高效率的算法实现,给出其复杂度分析,或者从一个新颖的角度分析此问题,或者哪怕是给出一点指点,我都非常感谢!!
...全文
775 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_35357815 2016-07-19
  • 打赏
  • 举报
回复
最高效的方法是哪一种啊
albert future 2014-05-04
  • 打赏
  • 举报
回复
说白了就是在二维平面上进行 非极大值抑制 NMS 你可以查一下,是有一些高效算法的! http://www.google.com.hk/url?sa=t&rct=j&q=&esrc=s&frm=1&source=web&cd=2&ved=0CC0QFjAB&url=%68%74%74%70%3a%2f%2f%77%77%77%2e%63%6e%62%6c%6f%67%73%2e%63%6f%6d%2f%72%6f%6e%6e%79%2f%70%2f%6f%70%65%6e%63%76%5f%72%6f%61%64%5f%39%2e%68%74%6d%6c&ei=hi5mU92LFIX78QWMg4LICg&usg=AFQjCNEiwv_62hWF8mxWj5UPdnXPT1qCCQ&bvm=bv.65788261,d.c2E&cad=rjt
dianyancao 2014-04-19
  • 打赏
  • 举报
回复
图像处理里的局部二值化,你可以用积分图来加速,能将O((2*m+1)*(2*m+1))优化为O(1)
FancyMouse 2014-04-19
  • 打赏
  • 举报
回复
引用 2 楼 zhao4zhong1 的回复:
无Profiler不谈效率。
不懂不要瞎起哄
FancyMouse 2014-04-19
  • 打赏
  • 举报
回复
引用 4 楼 buyong 的回复:
一个想法不太成熟: (1) 找到全局最大的 -> O(N) (2) 计算出这个最大值的覆盖范围:以P为圆心,半径为m的圆形窗口,在这范围内他肯定是局部最大,这范围内其他元素都不可能是局部最大了。 -》O(1) ? 把所有这些元素标记为已使用。 (3) 重复1,2,(仅对未使用的元素),直到所有元素都用过为止。 可能总体是O(n2)
你这个n是原题里的n^2……
godenlove007 2014-04-18
  • 打赏
  • 举报
回复
引用 1 楼 FancyMouse 的回复:
你首先要把1维的版本做会。采用单调队列的话1维是有O(n)的算法的。 会了1维以后,2维先对于每一行做一下1维的子问题,构造出一个新矩阵,表示这一行2m+1范围内的最大值,然后再对于新构造的矩阵对于每一列再做一次1维子问题,这样再构造出一个新矩阵,表示每个窗口的最大值。然后再用最大值去和原矩阵比较就行了。复杂度O(n^2)。
谢谢您的建议!
赵4老师 2014-04-18
  • 打赏
  • 举报
回复
无Profiler不谈效率。
godenlove007 2014-04-18
  • 打赏
  • 举报
回复
引用 4 楼 buyong 的回复:
一个想法不太成熟: (1) 找到全局最大的 -> O(N) (2) 计算出这个最大值的覆盖范围:以P为圆心,半径为m的圆形窗口,在这范围内他肯定是局部最大,这范围内其他元素都不可能是局部最大了。 -》O(1) ? 把所有这些元素标记为已使用。 (3) 重复1,2,(仅对未使用的元素),直到所有元素都用过为止。 可能总体是O(n2)
嗯,这个复杂度的确不低。话说怎么这种问题是不是对应了算法里的某个专门的问题啊?可是我不知道怎样去百度这样的哦问题。
buyong 2014-04-18
  • 打赏
  • 举报
回复
一个想法不太成熟: (1) 找到全局最大的 -> O(N) (2) 计算出这个最大值的覆盖范围:以P为圆心,半径为m的圆形窗口,在这范围内他肯定是局部最大,这范围内其他元素都不可能是局部最大了。 -》O(1) ? 把所有这些元素标记为已使用。 (3) 重复1,2,(仅对未使用的元素),直到所有元素都用过为止。 可能总体是O(n2)
FancyMouse 2014-04-18
  • 打赏
  • 举报
回复
你首先要把1维的版本做会。采用单调队列的话1维是有O(n)的算法的。 会了1维以后,2维先对于每一行做一下1维的子问题,构造出一个新矩阵,表示这一行2m+1范围内的最大值,然后再对于新构造的矩阵对于每一列再做一次1维子问题,这样再构造出一个新矩阵,表示每个窗口的最大值。然后再用最大值去和原矩阵比较就行了。复杂度O(n^2)。

65,207

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧