ActionScript
3. 집합의 연산
미나토
2009. 5. 22. 14:01
① 합집합
두개의 집합을 모두 포함한 집합
array ∪ array2 = {o | o ∈ array or o ∈ array2}
② 교집합
두개의 집합에서 같이 포함한 원소만을 모아놓은 집합
array ∩ array2 = {o | o ∈ array and o ∈ array2}
③ 전체집합
모든 집합이 부분집합인 집합
U
④ 여집합
집합 array 에는 속하지만 전체집합 U 에는 속하지 않는 집합을 array 의 여집합이라고 한다
arrayc= {o | o ∈ U and o ∉ array}
⑤ 차집합
집합 A 와 B 가 있을 때 A 에서 B 와의 교집합을 뺀 집합
array - array2 = {o | o ∈ array and o ∉ array2}
기존 클래스에 위의 연산메소드를 포함시켰다
package com.minarto.math
{
public class MathSet
{
/**
* 배열의 중복 원소를 제거
*/
public static function convertMathSet(a:Array):Array
{
if(!a) return null;
var mathSet:Array = [];
var cnt:uint = a.length;
var i:uint;
while(i < cnt)
{
var n:Number = a[i];
if(a.indexOf(n, i + 1) == - 1) mathSet.push(n);
i++;
}
return mathSet;
}
/**
* 부분집합
* a 가 b 의 부분집합인지 판단
*/
public static function isSubSet(a:Array, b:Array):Boolean
{
var same:Boolean = true;
var cnt:uint = a.length;
var i:uint;
while(i < cnt)
{
var n:Number = a[i];
if(b.indexOf(n) == - 1)
{
same = false;
break;
}
i++;
}
return same;
}
/**
* 상등
* 두 집합이 같은지를 판단
*/
public static function isEqualsSet(a:Array, b:Array):Boolean { return isSubSet(a, b) && isSubSet(b, a); }
/**
* 진부분집합
*/
public static function isProperSubSet(a:Array, b:Array):Boolean { return isSubSet(a, b) && !isEqualsSet(a, b); }
/**
* 합집합
*/
public static function sumOfSets(a:Array, b:Array):Array { return convertMathSet(a.concat(b)); }
/**
* 여집합
* @param a:Array - 여집합을 구할 집합
* @param u:Array - 전체집합
*/
public static function complementaryMathSet(a:Array, u:Array):Array
{
var mathSet:Array = [];
var cnt:uint = u.length;
var i:uint;
while(i < cnt)
{
var n:Number = u[i];
if(a.indexOf(n) == - 1) mathSet.push(n);
i++;
}
return mathSet;
}
/**
* 차집합
* a - b
* @param a:Array - 차집합을 구할 집합
* @param b:Array - 뺄 집합
*/
public static function differenceMathSet(a:Array, b:Array):Array
{
var mathSet:Array = [];
var cnt:uint = a.length;
var i:uint;
while(i < cnt)
{
var n:Number = a[i];
if(b.indexOf(n) == - 1) mathSet.push(n);
i++;
}
return mathSet;
}
}
}
{
public class MathSet
{
/**
* 배열의 중복 원소를 제거
*/
public static function convertMathSet(a:Array):Array
{
if(!a) return null;
var mathSet:Array = [];
var cnt:uint = a.length;
var i:uint;
while(i < cnt)
{
var n:Number = a[i];
if(a.indexOf(n, i + 1) == - 1) mathSet.push(n);
i++;
}
return mathSet;
}
/**
* 부분집합
* a 가 b 의 부분집합인지 판단
*/
public static function isSubSet(a:Array, b:Array):Boolean
{
var same:Boolean = true;
var cnt:uint = a.length;
var i:uint;
while(i < cnt)
{
var n:Number = a[i];
if(b.indexOf(n) == - 1)
{
same = false;
break;
}
i++;
}
return same;
}
/**
* 상등
* 두 집합이 같은지를 판단
*/
public static function isEqualsSet(a:Array, b:Array):Boolean { return isSubSet(a, b) && isSubSet(b, a); }
/**
* 진부분집합
*/
public static function isProperSubSet(a:Array, b:Array):Boolean { return isSubSet(a, b) && !isEqualsSet(a, b); }
/**
* 합집합
*/
public static function sumOfSets(a:Array, b:Array):Array { return convertMathSet(a.concat(b)); }
/**
* 여집합
* @param a:Array - 여집합을 구할 집합
* @param u:Array - 전체집합
*/
public static function complementaryMathSet(a:Array, u:Array):Array
{
var mathSet:Array = [];
var cnt:uint = u.length;
var i:uint;
while(i < cnt)
{
var n:Number = u[i];
if(a.indexOf(n) == - 1) mathSet.push(n);
i++;
}
return mathSet;
}
/**
* 차집합
* a - b
* @param a:Array - 차집합을 구할 집합
* @param b:Array - 뺄 집합
*/
public static function differenceMathSet(a:Array, b:Array):Array
{
var mathSet:Array = [];
var cnt:uint = a.length;
var i:uint;
while(i < cnt)
{
var n:Number = a[i];
if(b.indexOf(n) == - 1) mathSet.push(n);
i++;
}
return mathSet;
}
}
}
⑥ 집합의 연산법칙
다음은 정석 책에 있는 연산법칙을 그대로 옮긴 것이다. 이것은 위의 클래스를 활용하여 직접 확인해 보는 수밖에 없다
교환법칙 : A∪B = B∪A, A∩B = B∩A
결합법칙 : (A∪B)∪C = A∪(B∪C), (A∩B)∩C = A∩(B∩C)
분배법칙 : A∪(B∩C) = (A∪B)∩(A∪C), A∩(B∪C) = (A∩B)∪(A∩C)
흡수법칙 : A∪(A∩B) = A, A∩(A∪B) = A
드모르간의 법칙 : (A∪B)c = Ac∩Bc, (A∩B)c = Ac∪Bc