计算密度图D

时间:2019-02-13 01:13:40

标签: python

您将获得两个整数n和r,例如1 <= r 尺寸为n×n的二维阵列W。

此数组的每个元素为0或1。

您的目标是使用r的半径计算阵列W的密度图D。

输出密度图也是二维数组

其中每个值代表指定半径内矩阵W中1的数量。

给出以下大小为5,半径为1(n = 5,r = 1)的输入数组W

1 0 0 0 1
1 1 1 0 0
1 0 0 0 0
0 0 0 1 1
0 1 0 0 0

输出(使用Python):

3 4 2 2 1
4 5 2 2 1
3 4 3 3 2
2 2 2 2 2
1 1 2 2 2

逻辑:输入第一行,第一列的值为1。r值为1。因此,我们应检查1个右元素,1个左元素,1个顶部元素,左上,右上,底部,左下和右下,并对所有元素求和。

不应使用任何第三方库。

我使用for循环和内部for循环并检查每个元素。有更好的解决方法吗?

1 个答案:

答案 0 :(得分:0)

优化:每W中的1,更新其所属社区中位置的计数

尽管对于大小为W的{​​{1}},以下算法仍将采用O(n ^ 2)步,但是,如果W是稀疏的,即1的数量(例如nxn){ {1}},然后采用k步骤,而不是上述问题的<< nxn步骤,如果rxrxnxn

nxn + rxrxk分配并k << nxn存储为

r

然后关注

W

将所需的值存储在[[1, 0, 0, 0, 1], [1, 1, 1, 0, 0], [1, 0, 0, 0, 0], [0, 0, 0, 1, 1], [0, 1, 0, 0, 0]]

对于output = [[ 0 for i in range(5) ] for j in range(5) ] for i in range(len(W)): for j in range(len(W[0])): if W[i][j] == 1: for off_i in range(-r,r+1): for off_j in range(-r,r+1): if (0 <= i+off_i < len(W)) and (0 <= j+off_j < len(W[0])): output[i+off_i][j+off_j] += 1 output是必需的

r = 1