自学内容网 自学内容网

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)!