|
|
1
6
它至少是O(n*m),不管你用什么方法切片它——你必须至少看一次每个细胞。节约的地方在于,在寻找最常见的值之前,先累积每个值的计数;如果整数在一个相对较小的范围内变化(比如说,它们是uint16),那么您可以简单地使用平面数组而不是映射。 我想你也可以继续计数 x , “最常见”和“最接近”的当前排名前和第二的候选人,并且在剩下(n*m)-(x-y)个单元格时尽早退出,因为在这一点上,亚军不可能超过排名第一的候选人。 像这样的整数运算相当快;即使是一张百万像素的图像,暴力算法也只需要几毫秒。 我注意到你已经编辑了你的原始问题,说像素值从0到255——在这种情况下,一定要使用一个简单的平面数组;它足够小,可以很容易地放入l1dcache,而平面数组中的查找是trez-quick。 [编辑]: 一旦你建立了直方图数组,处理“没有最常见的数字”的情况非常简单:你所要做的就是遍历它,找到“最多”和“第二最多”的常见数字;如果它们同样频繁,那么根据定义,没有一个是最常见的。
|
|
|
2
3
大概是这样的:
|
|
3
1
一个选项是LINQ—效率有点低,但对于非大型阵列来说还可以:
或者使用锯齿状阵列:
|
|
|
4
1
标记的(+)数字是您的窗口。w、 h是您的窗口尺寸。申请 bucket sorting (正如其他人所建议的,因为您的值范围非常有限)。不要把你的评价降低一半 Crashworks 建议。现在还不要放弃你的结果。这是第一步。
换句话说,您需要像这样移动窗口:
我假设您正在尝试实现一个非线性卷积滤波器。 欢迎指正。 |
|
|
5
1
当速度成为一个关于可读性的问题时,你最终必然会得到丑陋的代码。上述内容肯定会从重构中受益(因此注释过多),但它应该运行得很快。如果速度不够快,您可以通过将其移动到非托管代码来获得更多优化。 |
|
|
6
1
请看一下Paint.NET中的LocalHistorgRameEffect代码,特别是LocalHistorgRameEffect.RenderRect。
调整此选项以支持色调而不是RGB强度将非常简单。 性能相当好,并且出于您的目的,它在O(r^2+w)模式下运行 r+n w) ,其中r是半径,w是图像的宽度,n是直方图中的层数。 -杰克逊 |
|
|
7
0
迈克尔击败了我,但我也会这样做,比如:
它需要针对您的特定需求进行优化。 |
|
|
8
0
1.)确保当当前最常见值的计数大于;(M x N/2)。如果某件事发生了>50%的网络覆盖率是最常见的价值,无需继续。如果你的日常工作只需要在大部分时间是正确的,那么你可以降低百分比,并将其视为一种启发。您甚至可以运行一些分析,分析出覆盖率是否为>37.6%,然后99.9%的时间它将是最常见的值,然后使用该百分比。 2.)如果有任何方法可以确定最常见的值可能位于哪一侧、角落或一般位置(外边缘、中间等),则可以按照该顺序扫描,再加上上面的优化1,可以减少大量扫描。例如,在您的示例中,右上角重于公共值。如果这可以通过某种启发式方法确定,那么您可以以某种方式从右上角扫描到左下角。如果所需的扫描模式复杂,请预先生成。 |
|
|
A B · C#Excel自动调整列避免长文本时出错 1 年前 |
|
|
Megrez7 · C#ToArray转换合并为一行,导致数组元素更改 1 年前 |
|
Aycon · 在工厂方法中释放部分创建的对象的正确方法是什么? 1 年前 |
|
|
Sei · Avalonia/WPF将路由器传递到控制模板 1 年前 |