Java算法之BFS,DFS,动态规划和贪心算法的实现

 更新时间:2023年04月07日 08:29:05   作者:亮点菌  
广度优先搜索(BFS)和深度优先搜索(DFS)是图遍历算法中最常见的两种算法,主要用于解决搜索和遍历问题。动态规划和贪心算法则用来解决优化问题。本文就来看看这些算法的具体实现吧

前言

广度优先搜索(BFS)和深度优先搜索(DFS)是图遍历算法中最常见的两种算法,主要用于解决搜索和遍历问题。动态规划和贪心算法则用来解决优化问题。

广度优先搜索

广度优先搜索算法是一种遍历或搜索树或图的算法,它从根节点开始搜索并逐层向下扩展,直到找到目标状态或所有节点都被遍历。BFS通常使用队列来实现,它每次将下一个节点放入队列中,直到所有的节点都被访问。

下面是一个Java实现:

public void bfs(Node start) {
    Queue<Node> queue = new LinkedList<>();
    Set<Node> visited = new HashSet<>();

    queue.offer(start);
    visited.add(start);

    while (!queue.isEmpty()) {
        Node node = queue.poll();
        System.out.print(node.val + " ");

        for (Node neighbor : node.neighbors) {
            if (!visited.contains(neighbor)) {
                visited.add(neighbor);
                queue.offer(neighbor);
            }
        }
    }
}

深度优先搜索

深度优先搜索算法是一种遍历或搜索树或图的算法,它从根节点开始递归地遍历所有子树,直到找到目标状态或所有节点都被遍历。DFS通常使用栈来实现,它每次将下一个节点压入栈中,直到所有的节点都被访问。

下面是一个Java实现:

public void dfs(Node node, Set<Node> visited) {
    System.out.print(node.val + " ");
    visited.add(node);

    for (Node neighbor : node.neighbors) {
        if (!visited.contains(neighbor)) {
            dfs(neighbor, visited);
        }
    }
}

动态规划

动态规划算法(DP)是一种解决问题的方法,它用来解决重叠子问题和最优子结构问题。DP通常用来解决优化问题,例如最短路径问题、背包问题等。

下面是一个Java实现:

public int knapsack(int[] weights, int[] values, int capacity) {
    int n = weights.length;
    int[][] dp = new int[n + 1][capacity + 1];

    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= capacity; j++) {
            if (weights[i - 1] <= j) {
                dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - weights[i - 1]] + values[i - 1]);
            } else {
                dp[i][j] = dp[i - 1][j];
            }
        }
    }

    return dp[n][capacity];
}

贪心

贪心算法是一种解决优化问题的方法,它总是选择当前最优解。与动态规划不同,贪心算法并没有考虑所有的子问题,而是只看当前的最优解。

下面是一个Java实现:

public int knapsack(int[] weights, int[] values, int capacity) {
    int n = weights.length;
    Item[] items = new Item[n];

    for (int i = 0; i < n; i++) {
        items[i] = new Item(weights[i], values[i]);
    }

    Arrays.sort(items, (a, b) -> b.valuePerWeight - a.valuePerWeight);

    int totalValue = 0;
    int remainingCapacity = capacity;

    for (Item item : items) {
        if (remainingCapacity >= item.weight) {
            totalValue += item.value;
            remainingCapacity -= item.weight;
        } else {
            totalValue += item.valuePerWeight * remainingCapacity;
            break;
        }
    }

    return totalValue;
}

class Item {
    int weight;
    int value;
    int valuePerWeight;

    public Item(int weight, int value) {
        this.weight = weight;
        this.value = value;
        this.valuePerWeight = value / weight;
    }
}

总结

在实际编程中,我们需要根据具体问题来选择不同的算法,例如搜索问题可以使用BFS或DFS,优化问题可以使用动态规划或贪心算法。需要注意的是,贪心算法往往只适用于一些特定的情况,有时会得到次优解或者错误解。因此,在使用贪心算法时需要仔细考虑问题和分析可能的情况。

到此这篇关于Java算法之BFS,DFS,动态规划和贪心算法的实现的文章就介绍到这了,更多相关Java算法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解Java中的JDK、JRE、JVM

    详解Java中的JDK、JRE、JVM

    本文主要介绍了Java中的JDK、JRE、JVM的相关知识。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-01-01
  • Java实现简单扫雷程序

    Java实现简单扫雷程序

    这篇文章主要为大家详细介绍了Java实现简单扫雷程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • Java基础之面向对象机制(多态、继承)底层实现

    Java基础之面向对象机制(多态、继承)底层实现

    这篇文章主要介绍了Java基础之面向对象机制(多态、继承)底层实现,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-04-04
  • java多线程编程之向线程传递数据的三种方法

    java多线程编程之向线程传递数据的三种方法

    在多线程的异步开发模式下,数据的传递和返回和同步开发模式有很大的区别。由于线程的运行和结束是不可预料的,因此,在传递和返回数据时就无法象函数一样通过函数参数和return语句来返回数据
    2014-01-01
  • Java中BigDecimal精度和相等比较的坑

    Java中BigDecimal精度和相等比较的坑

    BigDecimal是一种精确的数字类,一般用于高精度的开发领域中,例如银行。下面这篇文章主要给大家介绍了关于Java中BigDecimal精度和相等比较的坑的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2018-09-09
  • SpringSecurity 用户帐号已被锁定的问题及解决方法

    SpringSecurity 用户帐号已被锁定的问题及解决方法

    这篇文章主要介绍了SpringSecurity 用户帐号已被锁定,本文给大家分享问题原因及解决方式,需要的朋友可以参考下
    2023-12-12
  • 关于@Bean的使用方式

    关于@Bean的使用方式

    这篇文章主要介绍了关于@Bean的使用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • Java并发编程之性能、扩展性和响应

    Java并发编程之性能、扩展性和响应

    这篇文章主要介绍了Java并发编程之性能、扩展性和响应,重点在于多线程应用程序的性能问题,给性能和扩展性下一个定义,然后再仔细学习一下Amdahl法则,感兴趣的小伙伴们可以参考一下
    2016-02-02
  • java结束当前循环常用代码

    java结束当前循环常用代码

    在 Java中,当我们要结束一个循环时,通常会使用循环变量的实现类来结束,但在实际开发中,我们经常会遇到某个循环结束后需要进行其他的操作的情况,在本文中给大家分享java结束当前循环常用代码,感兴趣的朋友跟随小编一起看看吧
    2023-06-06
  • Java的web开发中SSH框架的协作处理应用笔记

    Java的web开发中SSH框架的协作处理应用笔记

    这篇文章主要介绍了Java的web开发中SSH框架的协作处理应用笔记,SSH是指Struts和Spring以及Hibernate的框架搭配,需要的朋友可以参考下
    2015-12-12

最新评论