C 数组中超界且复杂度恒定的子集的平均值
这是我上一期关于复杂度为o(1)的2d阵列处理技术的后续问题 也就是说,获取数组子集的平均值,但如果该子集超出数组的边界,则将其视为零。这是一个二维数组 实际上,阵列的大小可以增加到[2000][2000],但为了简单起见,我们采用大小为[4][4]的2D阵列C 数组中超界且复杂度恒定的子集的平均值,c,arrays,pixel,C,Arrays,Pixel,这是我上一期关于复杂度为o(1)的2d阵列处理技术的后续问题 也就是说,获取数组子集的平均值,但如果该子集超出数组的边界,则将其视为零。这是一个二维数组 实际上,阵列的大小可以增加到[2000][2000],但为了简单起见,我们采用大小为[4][4]的2D阵列 array[4][4] = {0, 1, 2, 3 4, 5, 6, 7 8, 9, 10, 11 12, 13, 14, 15}
array[4][4] = {0, 1, 2, 3
4, 5, 6, 7
8, 9, 10, 11
12, 13, 14, 15}
现在让我们假设我想得到[2][2]和[3][3]之间的数组的和,即加10+11+14+15除以4。这可以通过使用“总面积表”或“积分图像”技术在o(1)解决方案中实现
然而,我对如何保持o(1)的复杂性有点困惑,因为:
array_theory[5][5] = {0, 1, 2, 3, 0f
4, 5, 6, 7, 0f
8, 9, 10, 11, 0f
12, 13, 14, 15, 0f
0f, 0f, 0f, 0f, 0f}
或者在图像中:
所以现在[2][2]和[4][4]之间的平均值是(10+11+0f+14+15+0f+0f+0f+0f+0f)/9
我想我必须使用某种过滤或图像处理技术,我似乎无法找到一个关键词,让我找到/实现它,并在我的搜索结果中调情
任何帮助都将不胜感激
要将其扩展到数组的较大边缘之外,只需将这些项钳制到它们的最大值:如果任何下标超过了数组的最后一个有效索引,则将其替换为数组的最后一个有效索引
我们可以定义一个辅助函数来访问和:
/* Return sums[i][j] from an array that is physically r rows and c columns
but is conceptually extended infinitely on all four sides as if
arrays[i][j] contained zeros for all elements outside the physical
array.
*/
Type Sums(ssize_t r, ssize_t c, Type sums[r][c], ssize_t i, ssize_t j)
{
if (i < 0 || j < 0) return 0;
if (r <= i) i = r-1;
if (c <= j) j = c-1;
return sums[i][j];
}
/*从物理上是r行和c列的数组返回和[i][j]
但从概念上来说,它是无限延伸到四面八方的
数组[i][j]包含物理层之外所有元素的零
数组。
*/
类型和(ssize_t r,ssize_t c,类型和[r][c],ssize_t i,ssize_t j)
{
如果(i<0 | | j<0)返回0;
if(r)需要四个变量:起始行、结束行、行中的起始位置和行中的结束位置。如果有这四个变量,可以编写一个通用算法。是的,问题是它需要是常量共模性,即o(1)。无论有多少个零或它走了多远。它无法检查数组中的每个位置或扩展的“假”数组。我认为解决方案只是通过数组大小限制结束位置,这会导致与上一个问题相同的问题。