inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

CS 지식의 정석 | 디자인패턴 네트워크 운영체제 데이터베이스 자료구조

조인 알고리즘 #2. 정렬병합조인(Sort Merge Join) ★★★

정렬병합조인 질문드립니다.

222

qnvr31p

작성한 질문수 6

0

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.

 

코드 내에서 값이 같은 경우 append를 하고

indexA += 1, indexB += 1을 해주셨는데

그럼 테이블B에 id가 중복된 경우 해당 행을 조인하지 못하고 건너뛰는 상황이 발생하지 않나요?

 

예를 들어 A의 id가 1, 2, 3, 4, 5이고

B의 id가 3, 3, 6, 7 이라고 하면

조인의 결과가 2행이 나와야 하는데

indexA = 2 indexB = 0 에서 매칭 후

바로 둘다 indexA = 3, indexB = 1이 되면

조인의 결과가 1행만 나올 것 같아요

면접 운영체제 기술면접

답변 1

0

큰돌

안녕하세요 ㅎㅎ

그럼 테이블B에 id가 중복된 경우 해당 행을 조인하지 못하고 건너뛰는 상황이 발생하지 않나요?

>> 네 맞습니다. 해당 실습 코드의 경우 id가 유니크한 경우를 기반으로 만들었습니다.

만약에 qn님이 생각하신 반례를 처리하는 코드를 만든다면 다음과 같이 만드시면 됩니다.

tableA = [{'id': 1, 'value': 'A1'}, {'id': 2, 'value': 'A2'}, {'id': 3, 'value': 'A3'}]
tableB = [{'id': 2, 'name': 'B2'}, {'id': 2, 'name': 'B3'}, {'id': 2, 'name': 'B4'}]

# 먼저 두 리스트를 'id'를 기준으로 정렬합니다.
sorted_tableA = sorted(tableA, key=lambda x: x['id'])
sorted_tableB = sorted(tableB, key=lambda x: x['id'])

joined_table = []

indexA, indexB = 0, 0
while indexA < len(sorted_tableA):
    rowA = sorted_tableA[indexA]
    temp_indexB = indexB  # 임시 인덱스
    while temp_indexB < len(sorted_tableB) and sorted_tableB[temp_indexB]['id'] <= rowA['id']:
        rowB = sorted_tableB[temp_indexB]
        if rowA['id'] == rowB['id']:
            joined_row = rowA.copy()
            joined_row.update(rowB)
            joined_table.append(joined_row)
        temp_indexB += 1

    indexA += 1  # 다음 rowA로 이동

    # ID가 더 작은 rowB를 건너뛰기 위해 indexB를 업데이트
    while indexB < len(sorted_tableB) and sorted_tableB[indexB]['id'] < rowA['id']:
        indexB += 1

# 결과 출력
for row in joined_table:
    print(row)

 

위 코드도 괜찮지만 정렬병합조인 설명하기에는 제가 설명했던 코드가 더 단순 + 설명하기 쉽기 때문에 해당 예제 코드를 사용했습니다.



또 질문 있으시면 언제든지 질문 부탁드립니다.

좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)

감사합니다.

강사 큰돌 올림.


REST API (Self-descriptive messages)

0

26

1

시스템 엔지니어 관련 질문입니다.

0

52

2

오버라이딩 관련하여 질문드립니다.

0

62

2

교착상태의 4가지 필요조건이 필요충분조건이 아닌 이유

0

90

1

렌더 트리, 렌더 레이어와 그래픽 레이어

0

57

2

로컬스토리지, 세션스토리지, 쿠키의 공통점

0

68

1

IPv4가 IPv6보다 빠른 경우

0

99

2

UDP가 전송계층의 역할을 못하는 건 아닌지

0

59

1

Path MTU 발견하였음에도 패킷 분할이 필요한 이유?

0

65

2

교재의 LFU 알고리즘에서 6번이 왜 히트인가요?

0

64

2

페이지 교체 알고리즘? 프레임 교체 알고리즘?

0

81

2

Static 키워드가 메모리에 올라가는 시점

0

77

2

헤더 압축부분 질문드립니다

0

73

2

공유 캐시 관련 질문 드립니다.

0

56

2

컨텍스트는 context와 contextual information으로 나눠진다는게 무슨뜻인가요?

0

200

1

회선과 대역폭의 관계

0

62

2

44강 질문

0

93

2

버스 토폴로지 질문 있씁니다

0

55

1

자바스크립트, xml 문법 관련

0

66

2

전략패턴과 의존성주입 질문

0

69

2

Model이 비즈니스 로직을 담당하나요?

0

106

2

CS 공부 하는 법

0

181

2

큰돌님 블로그에 개념정리해서 올려도될까요!

0

137

2

FIN 세그먼트 질문

0

70

2