您的位置:首页 > 编程语言 > Go语言

warshall's algorithm

2016-04-27 20:58 281 查看
[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;


用算法解决实际问题,离散数学中的问题,整个的思路很清晰,但是实现起来并没有想象中那么简单
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: