java实现迭代(在大数据量时要比递归效率更高)
在项目中有个需求:查找指定机构下所有的子机构,之前使用的递归方式,效率相差很多
比如之前写的一个递归的方法:https://blog.csdn.net/qq_33651286/article/details/140539728
在Java中,递归和迭代是两种常用的算法实现方式。递归通过函数自身调用来解决问题,而迭代则通过循环结构(如for或while循环)来重复执行直到满足特定条件。下面将分别通过示例来说明如何在Java中实现递归和迭代。
递归与迭代的选择
- 递归:代码更简洁,易于理解(特别是对于某些问题,如树的遍历),但可能会消耗更多的内存(因为每次函数调用都会在调用栈上保存一些信息),并且如果递归深度太大,可能会导致栈溢出错误。
- 迭代:通常比递归更有效率(特别是对于大量数据的处理),因为它不需要额外的函数调用开销,也不会引起栈溢出问题(在合理的循环控制下)。但迭代可能需要更复杂的逻辑来管理循环条件。
在选择使用递归还是迭代时,需要根据具体问题的性质、数据量的大小、以及个人偏好来决定。在某些情况下,也可以将递归算法转换为迭代算法,以提高效率。
public List<Integer> getAllIdByOrganId(Integer rootOrganId, List<Organ> organs) {
List<Integer> ids = new ArrayList<>();
if (organs == null || organs.isEmpty() || rootOrganId == null) return ids;
// 构建从父机构ID到子机构ID列表的映射
Map<Integer, List<Integer>> parentToChildrenMap = new HashMap<>();
for (Organ organ : organs) {
if (organ.getOrganId() != null) {
parentToChildrenMap.computeIfAbsent(organ.getOrganId(), k -> new ArrayList<>()).add(organ.getId());
}
}
// 检查根机构是否有子机构
if (!parentToChildrenMap.containsKey(rootOrganId)) return ids;
// 使用队列进行BFS遍历
Queue<Integer> queue = new LinkedList<>(parentToChildrenMap.get(rootOrganId));
while (!queue.isEmpty()) {
Integer currentId = queue.poll();
// 将当前机构的ID添加到结果中
ids.add(currentId);
// 查找当前机构的所有直接子机构,并将它们加入队列
if (parentToChildrenMap.containsKey(currentId)) {
queue.addAll(parentToChildrenMap.get(currentId));
}
}
return ids;
}
原文地址:https://blog.csdn.net/qq_33651286/article/details/140660769
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!