더북(TheBook)

배열 기반 집합을 가지고 읽기와 검색, 삽입, 삭제 연산을 분석해 보자.

집합 읽기는 배열 읽기와 완전히 똑같다. 컴퓨터는 특정 인덱스에 들어 있는 값을 한 단계 만에 찾는다. 이전에 설명한 대로 컴퓨터는 메모리 주소를 쉽게 계산해서 접근할 수 있으므로 집합 내 어떤 인덱스든 갈 수 있다.

집합의 검색도 배열의 검색과 아무런 차이가 없다. 집합에서 어떤 값을 찾는 데 최대 N단계가 걸린다. 삭제도 배열과 집합에서 동일하다. 값을 삭제하고 데이터를 왼쪽으로 옮겨 빈 공간을 메꾸는 데 최대 N단계가 걸린다.

하지만 삽입만큼은 배열과 집합이 다르다. 배열에서 최선의 시나리오였던 맨 끝에 삽입하는 경우를 먼저 생각해 보자. 배열에서 컴퓨터는 1단계로 값을 끝에 삽입했다.

하지만 집합에서는 먼저 이 값이 이미 집합에 들어 있는지 결정해야 한다. 중복 데이터를 막는 게 바로 집합의 역할이기 때문이다.

컴퓨터는 새 데이터가 집합에 없다고 어떻게 확신할까? 앞서 말했듯이 컴퓨터는 배열이나 집합의 셀에 어떤 값이 들어 있는지 바로 알 수 없다. 그러니 삽입하려는 값이 집합에 이미 있는지부터 먼저 검색해야 한다. 집합에 새 값이 없을 때에만 컴퓨터는 삽입을 허용한다.

따라서 모든 삽입에는 검색이 우선이다.

예제로 살펴보자. 이전 예제의 쇼핑 목록을 집합이라고 가정해 보자. 현실적으로 같은 물건을 중복 구매하지는 않으므로 적절한 선택이라 할 수 있다. 집합이 ["apples", "bananas", "cucumbers", "dates", "elderberries"]일 때 "figs"를 삽입하려면, 먼저 검색을 1번 수행한 후 다음의 단계를 거쳐야 한다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.