You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

寻找以矩阵左上角为圆心的最大和圆形区域的高效算法

寻找以矩阵左上角为圆心的最大和圆形区域的高效算法

嘿,这个问题挺有意思的!要找以矩阵左上角为圆心的圆形区域里元素和最大的那个半径,还要高效处理大矩阵,对吧?我来给你捋捋可行的思路。

首先得明确核心逻辑:每个网格点(x,y)到原点(0,0)的距离是sqrt(x² + y²),当半径r大于等于这个距离时,该点就会被包含进圆形区域。所以我们可以把问题转化为:按点到原点的距离从小到大排序,逐步累加这些点的数值,同时追踪过程中的总和峰值——这就是我们要的最大和,对应的半径就是刚好包含到该峰值时所有点的最小半径。

具体步骤拆解

1. 预处理所有点的距离与数值

遍历整个n×n矩阵,对每个点(x,y)(这里x、y对应矩阵的行列索引,也就是坐标系中的坐标),计算它到原点的距离平方d_sq = x² + y²(用平方代替开根号可以避免浮点运算的误差和额外开销,毕竟比较sqrt(a)和sqrt(b)的大小等价于比较a和b的大小),然后把每个点的(d_sq, 元素值)存储起来。

2. 按距离平方从小到大排序

把所有点按照d_sq从小到大排序,这样我们就能模拟半径从小到大扩张的过程,依次把点加入到圆形区域中。

3. 逐步累加并追踪最大和

初始化当前总和current_sum = 0,最大总和max_sum = -∞,对应的最优半径best_r = 0。

然后遍历排序后的点列表:

  • 将当前点的数值加到current_sum中
  • 计算当前点对应的最小半径r = sqrt(d_sq)
  • 如果current_sum超过了max_sum,就更新max_sum为当前总和,并把best_r设为这个r(只要是大于等于该值的半径都能得到这个最大和,所以取最小的这个r就足够)

4. 针对大矩阵的优化点

  • 避免重复计算:遍历矩阵时直接计算每个点的距离平方,一次搞定,不用重复运算
  • 排序效率可控:n×n个点的排序时间复杂度是O(n² log n),对于n=1000的大矩阵(1e6个点),现代计算机也能轻松处理
  • 可选提前终止:如果后续遍历的点全是负数,加到总和里只会让数值变小,这时候可以提前停止遍历,不过这个优化要看实际数据分布情况

用你提供的示例验证的代码

import numpy as np

def find_max_circle_sum(matrix):
    n = matrix.shape[0]
    points = []
    # 遍历所有点,记录距离平方和对应数值
    for x in range(n):
        for y in range(n):
            d_sq = x**2 + y**2
            points.append( (d_sq, matrix[x][y]) )
    
    # 按距离平方从小到大排序
    points.sort(key=lambda p: p[0])
    
    current_sum = 0
    max_sum = -np.inf
    best_r = 0.0
    
    # 逐步累加并追踪峰值
    for d_sq, val in points:
        current_sum += val
        if current_sum > max_sum:
            max_sum = current_sum
            best_r = np.sqrt(d_sq)
    
    return max_sum, best_r

# 你提供的示例矩阵
square = np.array([
    [ 3,  0,  2, -3, -3, -1, -2,  1, -1,  0],
    [-1,  0,  0,  0, -2, -3, -2,  2, -2, -3],
    [ 1,  3,  3,  1,  1, -3, -1, -1,  3,  0],
    [ 0,  0, -2,  0,  2,  1,  2,  2, -1, -1],
    [-1,  0,  3,  1,  1,  3, -2,  0,  0, -1],
    [-1, -1,  1,  2, -3, -2,  1, -2,  0,  0],
    [-3,  2,  2,  3, -2,  0, -1, -1,  3, -2],
    [-2,  0,  2,  1,  2,  2,  1, -1, -3, -3],
    [-2, -2,  1, -3, -2, -1,  3,  2,  3, -3],
    [ 2,  3,  1, -1,  0,  1, -1,  3, -2, -1]
])

max_sum, best_r = find_max_circle_sum(square)
print(f"最大和为: {max_sum}")
print(f"对应的最小半径为: {best_r:.2f}")

为什么这个方法高效?

对比枚举所有可能半径再逐个计算区域和的方法(时间复杂度O(n² * R),R为半径的可能取值数),这个方法的O(n² log n)复杂度在大矩阵场景下优势明显,不会随着矩阵规模的增大出现性能陡降的情况。

备注:内容来源于stack exchange,提问作者Simd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.20 08:43:12