银行家算法代码

简介: 银行家算法代码

银行家算法代码

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

银行家算法:银行家算法(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

如果大家觉得有用的话,可以关注我下面的微信公众号,极客李华,我会在里面更新更多行业资讯,企业面试内容,编程资源,如何写出可以让大厂面试官眼前一亮的简历,让大家更好学习编程,我的抖音,B站也叫极客李华。

相关文章
|
22天前
|
存储 算法 程序员
C 语言递归算法:以简洁代码驾驭复杂逻辑
C语言递归算法简介:通过简洁的代码实现复杂的逻辑处理,递归函数自我调用解决分层问题,高效而优雅。适用于树形结构遍历、数学计算等领域。
|
23天前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
54 1
|
1月前
|
存储 缓存 算法
通过优化算法和代码结构来提升易语言程序的执行效率
通过优化算法和代码结构来提升易语言程序的执行效率
|
1月前
|
算法
分享一些提高二叉树遍历算法效率的代码示例
这只是简单的示例代码,实际应用中可能还需要根据具体需求进行更多的优化和处理。你可以根据自己的需求对代码进行修改和扩展。
|
1月前
|
算法 测试技术 开发者
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗;代码审查通过检查源代码发现潜在问题,提高代码质量和团队协作效率。本文介绍了一些实用的技巧和工具,帮助开发者提升开发效率。
44 3
|
1月前
|
分布式计算 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天】优化算法和代码需要注意什么
23 0
|
2月前
|
算法 Java 测试技术
数据结构 —— Java自定义代码实现顺序表,包含测试用例以及ArrayList的使用以及相关算法题
文章详细介绍了如何用Java自定义实现一个顺序表类,包括插入、删除、获取数据元素、求数据个数等功能,并对顺序表进行了测试,最后还提及了Java中自带的顺序表实现类ArrayList。
34 0