warshall's algorithm

[tags] C++
// created by _yun on 2016.4.27

用warshall’s算法计算传递闭包

(1)时间复杂度为:O(n*n*n)
(2)用R的无穷闭包时间复杂度为O(n*n*n*(n - 1))

BinaryRelation BinaryRelation::transitiveClosure() const {
  BooleanMatrix temp(matrix);
  for (int i = 1; i <= temp.getRow(); i++)
    for (int j = 1; j <= temp.getColums(); j++)
      for (int k = 1; k <= temp.getRow(); k++)
        temp.replace(temp.getElement(j, k)|temp.getElement(j, i)&temp.getElement(i, k), j, k);
  BinaryRelation _relation(temp, set);
  return _relation;
}

对称闭包等于原闭包与其逆的 |

BinaryRelation BinaryRelation::symmetricClosure() const {
  BooleanMatrix temp(matrix.getBooleanMatrix()|matrix);
  BinaryRelation _brelation(temp, set);
  return _brelation;
}

自反闭包等于其与对角闭包的 |

BinaryRelation BinaryRelation::reflexiveClosure() const {
  BooleanMatrix temp(matrix);
  for (int i = 1; i <= matrix.getRow(); i++)
      if (matrix.getElement(i, i) == 0) temp.replace(1, i, i);
  BinaryRelation _relation(temp, set);
  return _relation;
}

得到集合中某个元素所在的位置


int BinaryRelation::getSetElePos(int element) {
  for (int i = 1; i <= set.getSize(); i++)
    if (set.get(i) == element) return i;
  return -1;
}

某个元素的入度inDegree

int BinaryRelation::inDegree(int element) {
  if (set.isInSet(element)) {
    int position = getSetElePos(element);
    int result = 0;
    for (int i = 1; i <= matrix.getRow(); i++)
      result += matrix.getElement(i, position);
    return result;
  }
  return -1;
}

某个元素的出度:outDegree

int BinaryRelation::outDegree(int element) {
  if (set.isInSet(element)) {
    int position = getSetElePos(element);
    int result = 0;
    for (int i = 1; i <= matrix.getColums(); i++)
      result += matrix.getElement(position, i);
    return result;
  }
  return -1;
}

关系relation的各种性质:(实现的难度较小)

    // Properties of Relations.
    bool isReflexive() const;
    bool isIrreflexive() const;
    bool isSymmetric() const;
    bool isAsymmetric() const;
    bool isAntisymmetric() const;
    bool isTransitive() const;

    bool isEquivalence() const;

用算法解决实际问题,离散数学中的问题,整个的思路很清晰,但是实现起来并没有想象中那么简单

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值