6

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

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 的向量进行逐个元素的比较吗?

4

1 回答 1

11

下面部分介绍(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

但它也嵌套在重复循环中。如果该循环在最坏的情况下可以运行 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)。

于 2009-08-19T07:49:57.387 回答