3D版最大岛屿体积算法运行出现Core dumped错误如何优化
问题原因分析
首先你遇到的core dumped错误并非代码运行效率过低导致,核心诱因是递归实现的DFS触发了栈溢出:Python默认的递归调用栈深度上限通常在1000左右,当遇到超大连通岛屿时,递归深度会远超这个阈值,操作系统会直接终止进程抛出core dumped错误。
优化方案
- 替换递归DFS为迭代DFS/BFS:这是解决栈溢出的核心优化点。手动维护栈/队列存储待访问的坐标,这部分内存会在堆空间分配,不受系统递归栈大小的限制,完全规避深度过大导致的崩溃问题。
- 提前缓存维度参数:原代码每次边界判断都会重复计算三个维度的长度,提前缓存为常量可以减少不必要的重复运算开销。
- 保留原地修改标记访问的逻辑:原代码直接将访问过的体素设为0,无需额外开辟访问标记数组,已经是内存占用最低的实现方式,无需调整。
优化后代码示例
下面给出BFS实现的版本,可稳定处理200x200x200规模的体素输入:
from collections import deque class Solution3D: def maxAreaOfIsland3D(self, grid): max_volume = 0 # 提前缓存三个维度的长度,避免重复计算 R = len(grid) if R == 0: return 0 C = len(grid[0]) if C == 0: return 0 L = len(grid[0][0]) if L == 0: return 0 # 预定义6个搜索方向 dirs = [(-1, 0, 0), (1, 0, 0), (0, -1, 0), (0, 1, 0), (0, 0, -1), (0, 0, 1)] for r in range(R): for c in range(C): for l in range(L): if grid[r][c][l] == 1: current_volume = 0 q = deque() q.append((r, c, l)) grid[r][c][l] = 0 while q: x, y, z = q.popleft() current_volume += 1 for dx, dy, dz in dirs: nx, ny, nz = x + dx, y + dy, z + dz if 0 <= nx < R and 0 <= ny < C and 0 <= nz < L and grid[nx][ny][nz] == 1: grid[nx][ny][nz] = 0 q.append((nx, ny, nz)) max_volume = max(max_volume, current_volume) return max_volume
如果偏好DFS逻辑,只需将队列的popleft()改为pop()即可转为迭代DFS实现,二者内存占用和运行效率差异很小。
内容的提问来源于stack exchange,提问作者An Hernández
相关产品推荐
相关产品推荐

