候補キー
初志
コメント
上記の悩みを解決する概念がある.ビットマスクです.
ビットマスクを使用して集合を実現する方法は簡略化(?)できる.解決できる.
列の個数をcolnumと呼ぶと、0checkIfMin()
与えられた数値が最小性を満たすかどうかを決定する方法
既存の鍵が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
Reference
この問題について(候補キー), 我々は、より多くの情報をここで見つけました
https://velog.io/@nelljun/후보키
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
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
Reference
この問題について(候補キー), 我々は、より多くの情報をここで見つけました https://velog.io/@nelljun/후보키テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol