scaleform.minarto.com

3. 집합의 연산 본문

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;
        }
    }
}


⑥ 집합의 연산법칙

다음은 정석 책에 있는 연산법칙을 그대로 옮긴 것이다. 이것은 위의 클래스를 활용하여 직접 확인해 보는 수밖에 없다

교환법칙 : 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