Haribo ML, AI, MATH, Algorithm

후보키


후보키

import pandas as pd
from itertools import chain, combinations
def key_options(items):
    return chain.from_iterable(combinations(items, r) for r in range(1, len(items)+1) )
def solution(relation):
    Candidate = []
    df = pd.DataFrame(data = relation)
    for candidate in key_options(list(df)):
        deduped = df.drop_duplicates(candidate)
        if len(deduped.index) == len(df.index):
            Candidate.append(set(candidate))
    k = 0
    while k <len(Candidate) :
        for i in Candidate[k+1:] :
            if Candidate[k].issubset(i) :
                Candidate.remove(i)
        k += 1
    return len(Candidate)

유일성 탐색

for candidate in key_options(list(df)):
    deduped = df.drop_duplicates(candidate)
    if len(deduped.index) == len(df.index):
        Candidate.append(set(candidate))

columns 가 가질 수 있는 모든 조합에 대해서 유일성 검사를한다. drop_duplicates 는 선택한 열들에서 중복을 제거해주는 역할을 한다.

중복 제거 후에도 길이 변함이 없으면 유일성이 있는 키로 판별

최소성 탐색

유일성을 만족하는 키(길이순으로 오름차순 정렬이 되어있음) 원소를 하나씩뽑아 자기자신을 포함하는 원소가있으면 지워나감.

while k <len(Candidate) :
    for i in Candidate[k+1:] :
        if Candidate[k].issubset(i) :
        	  Candidate.remove(i)

Similar Posts

이전 포스트 점프와 순간 이동

다음 포스트 2 x n 타일링

Comments