【问题标题】:Banker's algorithm calculated time complexity银行家算法计算时间复杂度
【发布时间】:2009-08-19 07:28:55
【问题描述】:

银行家算法用于确定是否可以满足所有对资源的请求而不会导致死锁。

m 是资源类型的总数

n 是进程总数

NEED 是一个大小为 m * n 的数组,它定义了每种资源类型的待处理请求。例如:NEEDij = 2 表示进程 i 正在请求 2 项资源 j。

算法如下:

BOOLEAN function SAFESTATE is -- Determines if current state is safe
{ NOCHANGE : boolean; 
  WORK : array[1..m] of INTEGER = AVAILABLE;
  FINISH : array[1..n] of boolean = [false, ..,false];
  I : integer;

  repeat
    NOCHANGE = TRUE;
    for I = 1 to N do
      if ((not FINISH[i]) and
         NEEDi <= WORK) then {
         WORK = WORK + ALLOCATION_i;
         FINISH[i] = true;
         NOCHANGE = false;
      }
  until NOCHANGE;
  return (FINISH == (true, .., true));
}

我的问题是,时间复杂度如何为 0(n * n * m)?更具体地说,m 项如何进入多项式?是不是因为我们必须对长度为 m 的向量进行逐个元素的比较?

【问题讨论】:

  • 连同您对我刚刚删除的答案的评论,真的不清楚这段代码的含义。什么是 NEEDi、ALLOCATION_i 以及内部如何分配 WORK - 逐个元素或其他方式?这段代码来自哪里?

标签: algorithm complexity-theory


【解决方案1】:

下面部分介绍(n*m)时间复杂度

for I = 1 to N do // *n times
      if ((not FINISH[i]) and
         NEEDi <= WORK) then // *m times, if it's an array search

但它也嵌套在 repeat 循环中。如果该循环在最坏的情况下可以运行 n 次,则该过程的时间复杂度为 O(n*n*m)。

更新:我错过了一些东西,

WORK = WORK + ALLOCATION_i; // also O(m) operation, vectors addition

因此,在 for 循环中执行的代码具有 O(m+m) 时间复杂度。
当然,O(m+m) = O(m),最终复杂度是O(n*n*m)。

【讨论】:

  • 所以 m 是因为对大小为 m 的向量的
  • 是的,搜索/比较有额外的 O(m) 时间成本。
猜你喜欢
  • 2011-06-21
  • 2021-08-25
  • 1970-01-01
  • 1970-01-01
  • 2021-03-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多