候補キー


初志

  • 列を結合し、各組合せは各列の文字列を結合し、Setに挿入する.
  • SetのサイズがTuple全体の数に等しい場合は、Tupleを一意に識別できることを意味し、したがって候補キーとなるColumnの組み合わせである.
  • のすべての色の組み合わせを一意性調査するにはどうすればいいですか?
  • 4つなら、0、1、2、3、01、02、03、12、13、23、012、013、023、123、0123のような異なる組み合わせは、どのように表現すればいいのでしょうか.
  • で一意性を満たすカラムの組合せが-001 12123の場合、最小性をチェックするにはどのように格納すればよいのでしょうか.int[]? 新しいオブジェクト?など、解決できないか複雑に見えるプロセスがたくさんあります.
  • コメント


    上記の悩みを解決する概念がある.ビットマスクです.
    ビットマスクを使用して集合を実現する方法は簡略化(?)できる.解決できる.
    列の個数をcolnumと呼ぶと、0

    checkIfMin()


    与えられた数値が最小性を満たすかどうかを決定する方法
    既存の鍵が0011、現在の鍵が1011の場合、0011&1011=001は既存の鍵と同じ値になります.
    List<Integer> keys = new ArrayList<>();
    
    boolean checkIfMin(int i) {
        for (Integer key : keys) {
            if ((key & i)==key) return false;
        }//for end
        return true;
    }

    solution()


    まず、現在の鍵の最小性を確認します.
    一意性は上図に示すように,kバイナリ数では値1の文字列を集合に貼り付け,総数と比較する.
    public static int solution(String[][] relation) {
        int rowNum = relation.length; //행수
        int colNum = relation[0].length; //열수
    
        //한 키당 해당 컬럼의 튜플 값 저장할 set
        Set<String> set = new HashSet<>();
        //키에서 값이 1인 자릿수의 문자열 붙일 sb
        StringBuilder sb = new StringBuilder();
    
        for (int k = 0; k < (1<<colNum); k++) {
            //현재 키 최소성 체크
            if(!checkIfMin(k)) continue;
    
            //set 초기화
            set.clear();
    
            for (int i = 0; i < rowNum; i++) {
                //sb 초기화
               sb.setLength(0);
    
                for (int j = 0; j < colNum; j++) {
    
                    if (((1<<j) & k) > 0) {
                        //현재 키에서 값이 1인 자릿수에 해당하는 j 인덱스에
                        //해당하는 문자열을 sb에 붙인다.
                        sb.append(relation[i][j]);
                    }
                }//for end
    
                //조립한 문자열을 set에 넣었을 때 false라면
                //유일성이 만족하지 않은 것이므로 해당 key에 대해 break
                if (!set.add(sb.toString())) break;
            }//for end
    
            //해당 키에서의 set 사이즈가 튜플의 수와 같다면
            //유일성 만족하므로 후보키 저장 리스트에 추가
            if(set.size()==rowNum) keys.add(k);
        }//for end
    
        return keys.size();
    }//solution() end
    リファレンス
     https://girawhale.tistory.com/102