유일성(uniqueness) : 릴레이션에 있는 모든 튜플에 대해 유일하게 식별되어야 한다.
최소성(minimality)
유일성을 가진 키를 구성하는 속성(Attribute) 중 하나라도 제외하는 경우 유일성이 깨지는 것을 의미한다.
즉, 릴레이션의 모든 튜플을 유일하게 식별하는 데 꼭 필요한 속성들로만 구성되어야 한다.
문제 분류
Combination, Backtracking, Simulation
2. 알고리즘 설계
모든 키 개수에 대한 조합 구하기
키 개수를 DFS 함수에 조건으로 걸어주었다.
키 개수를 만족하면 유일성, 최소성을 확인
만족하면 현재 키의 구성을 후보키 목록에 기록한다.
최소성 확인을 위해서!
유일성
unordered_map 구조를 사용하였다.
단순히 문자열로 col1col2와 같이 이어붙이고,
같은 게 있다면(현재 크기가 1보다 크다면) false 리턴
boolis_uniqueness(){unordered_map<string,int>tmp;// (문자열, 개수)for(inti=0;i<cpy.size();i++){strings="";for(intj:keys)s+=cpy[i][j];// 데이터를 이어붙이고tmp[s]++;// 문자열의 개수 1증가if(tmp[s]>1)returnfalse;// 문자열의 개수가 2가 되면 중복}returntrue;}
최소성
현재 입력된 키가 유일성을 만족하면서 하나의 키라면 최소성도 반드시 만족한다.
여러개라면 현재 저장된 후보키 목록과 비교할 필요가 있다.
DFS를 통해 만들어진 키 조합을 unordered_map<int,int>로 카운팅
만약, 현재 키 조합이 전부 포함되는 후보키 리스트가 있다면 최소성을 만족하지 못한다.
boolis_minimality(){if(keys.size()==1)returntrue;// 유일성을 만족한 하나로 구성된 키 조합unordered_map<int,int>cmp;for(intk:keys)cmp[k]++;// 키 조합 카운팅for(autonxt:candidate){// 후보키 리스트를 하나씩 살피면서boolflag=false;// 현재 키 조합에서 하나라도 없는 게 있다면 넘어가고for(intx:nxt){if(cmp[x]==0){flag=true;break;}}// 후보키 리스트에 전부 포함된다면 불만족if(!flag)returnfalse;}returntrue;}