【问题标题】:How do I implement the following algorithm in O(1) time?如何在 O(1) 时间内实现以下算法?
【发布时间】:2015-09-27 13:41:12
【问题描述】:

我有一个用整数填充的二维数组。我想要一种在 O(1) 时间内找到数组某些部分的平均值的方法。例如,我有数组A[][] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};,算法的输入是边界。所以Algorithm(int top, int bottom, int left, int right)。如果 top = 1 , bottom = 2, left = 1, right = 2 ,则该部分将是从第二行到第三行以及从第二到第三列。所以平均值为 (5+6+8+9)/4。

【问题讨论】:

  • 你必须读取这些值,所以看不出这怎么可能是 O(1)。它几乎必须是 O(n)(其中“n”是值的数量),除非您对问题有其他限制。
  • @GordonLinoff 作业中有一条提示说,可以通过预先计算所有可能子区域的平均值来加快速度。但我不知道该怎么做?
  • 查找整体图像。

标签: algorithm multidimensional-array data-structures runtime


【解决方案1】:

你可以写一个总和的前缀表。

这个例子看起来像 你的数组

1 2 3

4 5 6

7 8 9

前缀数组:

1 3 6

5 12 21

12 27 45

那么当你想计算你的例子时:

X = (prefix[bottom][right] - prefix[bottom][left-1] - prefix[top-1][right] + prefix[top-1][left-1]) / (right - left + 1) * (bottom - top + 1);

X = (45 - 12 - 6 + 1) / 4 = 7;

模型在填充前缀数组中使用:

  For(int i = 0; i < n; i++)
    {
        for(int j = 0; j < m; j++)
        {
           prefix[i][j] = prefix[i-1][j] + prefix[i][j-1] + array[i][j] - prefix[i-1][j-1];
        }
    }

*代码是用 C++ 语言编写的 **n - 行数,m - 列数

【讨论】:

  • 什么是前缀数组?我不明白你是怎么计算出来的。
  • 前缀数组是一个使用动态规划的数组。您需要制作另一个数组。我编辑了我的帖子。看看那个。
【解决方案2】:

我将提示如何操作。您可以设置辅助数据结构以方便计算。但是,该数据结构需要超过 O(1) 的时间来计算,因此只有在您进行多次计算时才会有所帮助。

提示是累积值很有用。我将举一个一维的例子。您需要弄清楚如何扩展它。假设你有这些数据:

1      2      3      4      5
10    -3      6      6     -2

你也有同样的问题。如何在恒定时间内解决这个问题?那么,创建另一个具有累积和的数据结构:

1      2      3      4      5
10     7     13     19     17

现在,如果您想要 2-5 的 sum,您只需计算 17 - 10(即 2 之前的一个索引)。您可以将其除以 (1 + 5 - 2) 得到平均值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-30
    • 1970-01-01
    • 1970-01-01
    • 2022-07-07
    • 1970-01-01
    • 2023-03-25
    相关资源
    最近更新 更多