您将获得两个整数n和r,例如1 <= r
此数组的每个元素为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循环并检查每个元素。有更好的解决方法吗?
答案 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