728x90
반응형

Transitive Relation 은 추이관계로 aRb이고 bRc이면 aRc를 만족하는 관계이다.

추이관계의 판별하는 방법에는 정의에 의한 판별도 있지만 프로그래밍하기 쉽게 다른 판별법을 알아보자

 

1  1  1

0  0  0

0  0  1

 

위의 행렬을 R이라고 두고 기수만큼 거듭제곱을 해준다.

R^3

 

1  1  1

0  0  0

0  0  1

 

로 R^3 ⊂= R 을 만족시킨다. 일반화 시키면 기수가 n 인 R 행렬에서 R^n ⊂= R 이면 추이관계이다.

위를 만족시키면 추이관계가 성립하게 된다.(흠... 설명이 부족해 보인다?)

위 과정을 코딩해보겠다.

 

#include <stdio.h>

void MatrixMul(int mul[][3],int arr1[][3],int arr2[][3]) {//행렬의 곱셈을 논리곱으로 표현
	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 3; j++) {
			for (int k = 0; k < 3; k++) {
				mul[i][j] |= arr1[i][k] & arr2[k][j];
			}
		}
	}

}

void TransitiveRelation(int arr[][3]) {//행렬의 논리곱을 활용하여 추이관계 표현
	int result[3][3] = { 0 };
	MatrixMul(result,arr,arr);
	MatrixMul(result, result, arr); //R^3의 표현
	int a = 0;

	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 3; j++) {
			if (arr[i][j] == 1 || result[i][j] == arr[i][j]) //포함관계 이므로 R이 1이거나 R과 R^3 같다면 a를 추가하는 방식으로 구현해보았다.
				a++;
		}
	}

	if (a == 9)
		printf("추이관계!\n");
	else
		printf("추이관계 아님!\n");
}

int main() {
	int arr1[3][3] = { {1,1,1},{0,0,0},{0,0,1 } };
	int arr2[3][3] = { {0,1,0},{0,1,1},{1,0,0 } };

	TransitiveRelation(arr1);
	TransitiveRelation(arr2);
}

 

앞에서 반사, 대칭, 추이적 관계를 설명했다. 이를 토대로 부분순서관계에 대한 개념을 다음글에 설명하겠다.

728x90
반응형

+ Recent posts