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;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值