Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 数组中超界且复杂度恒定的子集的平均值_C_Arrays_Pixel - Fatal编程技术网

C 数组中超界且复杂度恒定的子集的平均值

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}

这是我上一期关于复杂度为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}
现在让我们假设我想得到[2][2]和[3][3]之间的数组的和,即加10+11+14+15除以4。这可以通过使用“总面积表”或“积分图像”技术在o(1)解决方案中实现

然而,我对如何保持o(1)的复杂性有点困惑,因为:

  • 数组子集扩展到实际数组之外
  • 实际数组之外的数组索引被视为零
  • 算法计算仍然是o(1)
  • 例如,对于这个像素和,我被要求得到[2][2]到[4][4]的和。这是一个理论数组,实际值以外的数字表示为f(表示伪),但被视为零:

    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)。无论有多少个零或它走了多远。它无法检查数组中的每个位置或扩展的“假”数组。我认为解决方案只是通过数组大小限制结束位置,这会导致与上一个问题相同的问题。