银行家算法实现代码

简介: 银行家算法Java实现

银行家算法代码

简介:本文为大家奉献银行家算法的java代码实现,拿去吧,我的算法思路就是深度优先遍历(DFS),对深度优先遍历不熟悉的,可以看看我的这篇博客。

银行家算法银行家算法(Banker's Algorithm)是一个避免死锁(Deadlock)的著名算法,是由艾兹格·迪杰斯特拉在1965年为T.H.E系统设计的一种避免死锁产生的算法。它以银行借贷系统的分配策略为基础,判断并保证系统的安全运行。

/*银行家算法  Banker Algorithm*/
/*算法思路:dfs(深度优先遍历)*/
import java.util.*;

public class Main{    

    static class Process{ // 每个进程的情况
        public Resources max;
        public Resources allocation;
        public Resources need;
        public Process() {
            // TODO Auto-generated constructor stub
        }
        public Process(Resources max, Resources allocation, Resources need)
        {
            this.max = max;
            this.allocation = allocation;
            this.need = need;
        }
    }
    static class Resources  // 这里以三个资源为例子
    {
        int A, B, C;
        public Resources(int A, int B, int C) {
            this.A = A;
            this.B = B;
            this.C = C;
            //System.out.println("RE" + this.A + " " + this.B + " " + this.C);
        }
        void showAll()  // 查看当前的资源的占比情况 调试用的
        {
            System.out.println("A:" + A + " " + "B:" + B + " " + "C:" + C);
        }
    }
    static List<Process> pset = new ArrayList<Process>();   // 存放每个进程的情况
    static List<Integer> v = new ArrayList<Integer>();  // 存放最后的安全序列的
    static int N = 110;   // 资源的最大个数的限制
    static boolean [] st = new boolean[N];   // dfs的辅助数组
    static int n;
    static Resources available;    // 把可用的资源定义为全局数组 方便修改
    static int cnt = 0;   // 存放最后的结果数
    public static void main(String[] args) { 
        
        Scanner in = new Scanner(System.in);
        System.out.print("输入进程数:");
        n = in.nextInt();  // 进程的数量
        int a, b, c;
        int i = 0;
        int t = n;
        while(t -- > 0)
        {            
            System.out.println("输入进程P" + i + "的Max:");
            System.out.print("A:");
            a = in.nextInt();
            System.out.print("B:");
            b = in.nextInt();
            System.out.print("C:");
            c = in.nextInt();
            i ++;
            Resources max = new Resources(a, b, c);
            
            System.out.println("输入Allocation:");
            System.out.print("A:");
            a = in.nextInt();
            System.out.print("B:");
            b = in.nextInt();
    
            System.out.print("C:");
            c = in.nextInt();            

            Resources allocation = new Resources(a, b, c);
            pset.add(new Process(max, allocation, Sub(max, allocation)));
        }
        System.out.println("输入Available:");
        System.out.print("A:");
        a = in.nextInt();
        System.out.print("B:");
        b = in.nextInt();
        System.out.print("C:");
        c = in.nextInt();
        available = new Resources(a, b, c);
        
        if (n == 0) return;        
        dfs(0);
        if (cnt == 0) System.out.println("没有安全序列");
        System.out.println("安全序列的数量:" + cnt);
    }
    static Resources Sub(Resources r1, Resources r2)  // 计算两个资源集合相减的结果
    {

        Resources r = new Resources(r1.A - r2.A, r1.B - r2.B, r1.C - r2.C);
//        System.out.println("Sub");
//        r.showAll();
        return r;
    }
    static Resources Add(Resources r1, Resources r2)  // 两个资源集合相加
    {
    
        Resources r = new Resources(r1.A + r2.A, r1.B + r2.B, r1.C + r2.C);
//        System.out.println("Add:");
//        r.showAll();
        return r;
    }
    static boolean CP(Resources r1, Resources r2) // 对两个资源集合进行比较 r1 <= r2返回true
    {
        boolean flag = false;
        if (r1.A <= r2.A && r1.B <= r2.B && r1.C <= r2.C) flag = true;
//        if (flag == false)
//        {
//            System.out.println("r1 ");
//            r1.showAll();
//            System.out.println("r2 ");
//            r2.showAll();
//        }
        return flag;
    }

    // 深度优先遍历的模板
    static void dfs(int u)
    {
        if (u == n)
        {
            cnt ++;   
            for (Integer it : v)   // 打印结果
            {
                System.out.print("P" + it + " ");
            }
            System.out.println();
            return;
        }
        for (int i = 0; i < n; ++ i)
        {
            Resources t1 = pset.get(i).need;
            Resources t2 = pset.get(i).allocation;
            
            if (!st[i] && CP(t1, available)) // 如果当前的这个进程的need小于available而且没有被访问过
            {
                st[i] = true;
                available = Add(t2, available);
                v.add(i);
                dfs(u + 1);
                available = Sub(available, t2);
                st[i] = false;
                v.remove(v.size() - 1);
            }
        }
    }
}

运行结果

输入进程数:5
输入进程P0的Max:
A:7
B:5
C:3
输入Allocation:
A:0
B:1
C:0
输入进程P1的Max:
A:3
B:2
C:2
输入Allocation:
A:2
B:0
C:0
输入进程P2的Max:
A:9
B:0
C:2
输入Allocation:
A:3
B:0
C:2
输入进程P3的Max:
A:2
B:2
C:2
输入Allocation:
A:2
B:1
C:1
输入进程P4的Max:
A:4
B:3
C:3
输入Allocation:
A:0
B:0
C:2
输入Available:
A:3
B:3
C:2
P1 P3 P0 P2 P4 
P1 P3 P0 P4 P2 
P1 P3 P2 P0 P4 
P1 P3 P2 P4 P0 
P1 P3 P4 P0 P2 
P1 P3 P4 P2 P0 
P1 P4 P3 P0 P2 
P1 P4 P3 P2 P0 
P3 P1 P0 P2 P4 
P3 P1 P0 P4 P2 
P3 P1 P2 P0 P4 
P3 P1 P2 P4 P0 
P3 P1 P4 P0 P2 
P3 P1 P4 P2 P0 
P3 P4 P1 P0 P2 
P3 P4 P1 P2 P0 
安全序列的数量:16
相关文章
|
18天前
|
算法
分享一些提高二叉树遍历算法效率的代码示例
这只是简单的示例代码,实际应用中可能还需要根据具体需求进行更多的优化和处理。你可以根据自己的需求对代码进行修改和扩展。
|
1月前
|
算法 测试技术 开发者
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗;代码审查通过检查源代码发现潜在问题,提高代码质量和团队协作效率。本文介绍了一些实用的技巧和工具,帮助开发者提升开发效率。
37 3
|
29天前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
2月前
|
存储 缓存 算法
如何通过优化算法和代码结构来提升易语言程序的执行效率?
如何通过优化算法和代码结构来提升易语言程序的执行效率?
|
2月前
|
搜索推荐
插入排序算法的讲解和代码
【10月更文挑战第12天】插入排序是一种基础的排序算法,理解和掌握它对于学习其他排序算法以及数据结构都具有重要意义。你可以通过实际操作和分析,进一步深入了解插入排序的特点和应用场景,以便在实际编程中更好地运用它。
|
2月前
|
缓存 分布式计算 监控
优化算法和代码需要注意什么
【10月更文挑战第20天】优化算法和代码需要注意什么
18 0
|
2月前
|
算法 Java 测试技术
数据结构 —— Java自定义代码实现顺序表,包含测试用例以及ArrayList的使用以及相关算法题
文章详细介绍了如何用Java自定义实现一个顺序表类,包括插入、删除、获取数据元素、求数据个数等功能,并对顺序表进行了测试,最后还提及了Java中自带的顺序表实现类ArrayList。
26 0
|
3月前
|
机器学习/深度学习 存储 算法
经典算法代码
这段代码展示了多个经典算法,包括:穷举法解决“百钱买百鸡”问题;递推法计算“猴子吃桃”问题;迭代法求解斐波那契数列及折纸高度超越珠峰的问题。同时,还提供了希尔排序算法实现及披萨票务订购系统和汉诺塔问题的链表存储解决方案。每部分通过具体案例解释了算法的应用场景与实现方法。
31 3
|
4月前
|
人工智能 算法 数据可视化
DBSCAN密度聚类算法(理论+图解+python代码)
DBSCAN密度聚类算法(理论+图解+python代码)
|
4月前
|
数据采集 搜索推荐 算法
【高手进阶】Java排序算法:从零到精通——揭秘冒泡、快速、归并排序的原理与实战应用,让你的代码效率飙升!
【8月更文挑战第21天】Java排序算法是编程基础的重要部分,在算法设计与分析及实际开发中不可或缺。本文介绍内部排序算法,包括简单的冒泡排序及其逐步优化至高效的快速排序和稳定的归并排序,并提供了每种算法的Java实现示例。此外,还探讨了排序算法在电子商务、搜索引擎和数据分析等领域的广泛应用,帮助读者更好地理解和应用这些算法。
46 0