31
TAOCP 2.3.3 트리의 다른 표현들 아꿈사 김성안 <[email protected]>

taocp 2.3.3

Embed Size (px)

Citation preview

Page 1: taocp 2.3.3

TAOCP – 2.3.3 트리의 다른 표현들

아꿈사

김성안<[email protected]>

Page 2: taocp 2.3.3

트리의 다른 표현들

순차 할당 기법

• 전위 순차 표현

• 가족 순차 표현

• 수준 순서 순차 표현

• 차수가 부연된 후위 순서

순차 표현

연결된형태의 표현

• 연결 트리

• 삼중 연결 트리

• 고리 구조

Page 3: taocp 2.3.3

순차 할당 기법

• 트리 구조를 간결하게 표현하고자 할 때 적

합하다.

• 트리 노드의 LLINK필드를 제거하고, 연속

적인 주소 접근 방식을 사용하는 형태이다.

Page 4: taocp 2.3.3

순차 할당 기법

• 다음 트리를 생각해 봅시다.

• 이를 트리 형태와 이진트리 형태로 표현하

Page 5: taocp 2.3.3

전위 순차 표현1

• 노드를 전위 순서로 배치한다.

• 각노드에 INFO, RLINK, LTAG 필드를 둔

다.

• 화살표는 공링크가 아닌 RLINK이다.

• 말단 노드는 LTAG=1이다.

• LLINK는 공링크이거나 바로 다음 항목이기

때문에 필요가 없다.

Page 6: taocp 2.3.3

전위 순차 표현1

• 한 노드의 모든 하위 트리는 그 노드 바로다음에 나타난다.

• RLINK 화살표가 서로 교차하지 않는다.

– X와 RLINK(X)사이의 노드는 X의 왼쪽 하위 트리에 놓인다.

– 전위 순서로 배치했기 때문이다.

• LTAG필드는 중복이다.

– LTAG는 숲의 끝에서만, 모든 아래쪽 화살표에앞서서 나타난다.

Page 7: taocp 2.3.3

전위 순차 표현1

• RLINK 절반 이상이 공링크이다.

• 순차적으로 탐색하지 않는 이상 추가적인

계산이 필요하다.

Page 8: taocp 2.3.3

전위 순차 표현2

• RLINK도 중복이다.

• RTAG 필드를 둔다.

• 트리를 재구축하려면 LTAG=1인 경우 가장

최근에 발견된 불완전한 RLINK를 완성해

야한다.

• 즉, 스택이 필요하다.

Page 9: taocp 2.3.3

전위 순차 표현2

• RLINK도 중복이다.

• RTAG 필드를 둔다.

• 트리를 재구축하려면 LTAG=1인 경우 가장

최근에 발견된 불완전한 RLINK를 완성해

야한다.

• 즉, 스택이 필요하다.

Page 10: taocp 2.3.3

전위 순차 표현3

• 각 노드의 RLINK에 그 노드 아래의 하위 트

리 다음의 주소를 넣는다.

• RLINK는 범위를 뜻하는 SCOPE라고 부르

기도 한다.

• LTAG(X)=1는 SCOPE(X) = X + c를 따른다.

– C는 노드당 워드 개수

Page 11: taocp 2.3.3

전위 순차 표현4

• RLINK필드를 제거하고, 공링크가 아닌

RLINK를 가진 노드 앞에 특별한 “링크” 노

드를 둔다.

• INFO필드와 RLINK가 대략 같은 공간을 사

용한다면 메모리를 절약할 수 있다.

Page 12: taocp 2.3.3

가족 순차 표현

• LLINK대신 RLINK를 생략하는 표현이다.

• 역 후위 순위 순서와 동일하다.

Page 13: taocp 2.3.3

가족 순차 표현

• RTAG는 가족을 구분하는 역할이다.

• 모든 트리의 루트를 나열하고 가장 최근에

나타난 노드가 속한 가족을 택하는 방식으

로 진행한다.

• LLINK 화살표는 교차하지 않는다.

• 전위 표현의 다른 성질도 물려 받는다.

Page 14: taocp 2.3.3

수준 순서 순차 표현

• 각 수준마다 노드들을 그냥 왼쪽에서 오른

쪽으로 나열하다.

– 너비 우선 탐색

– 선입선출

• cf. 전위/가족 순서 표현

– 깊이 우선 탐색

– 후입선출

Page 15: taocp 2.3.3

차수가 부연된 후위 순서 순차 표현

• 노드를 후위 순서로 나열하고 각 노드에 링

크대신 차수를 부여한다.

• 트리 노드들에 대해 정의된 “상향식”으로

평가할 때 유용하다.

– 알고리즘 F

Page 16: taocp 2.3.3

알고리즘 F

• 트리 안에서 국소 정의된 함수를 평가한다.

– F1.[초기화]스택을 비우고, P가 숲의 후위 순서로

첫째 노드를 가리키게 한다.

– F2.[평가]d<-DEGREE(P)로 설정한다. f(NODE(P))

를 스택에 있는 f(x)의 값들을 이용해서 평가한다.

– F3.[스택갱신]최상위항목 d개를 제거한다. 그리고

f(NODE(P))를스택 최상위에 넣는다.

– F4.[전진]만일 P가 후위 순서로 마지막 노드이면

알고리즘을 끝낸다. 그런 다음 단계 F2로 돌아간

다.

Page 17: taocp 2.3.3

연결된 형태의 표현

• (3)을 (6)으로 바꾸는 변환과 관련이 있다.

• 모든 비말단 노드에서 INFO필드를 제거한

다.

• 해당 정보를 담은 새 말단 노드를 그전 노드

아래에 추가한다.

Page 18: taocp 2.3.3

연결된 형태의 표현

• LLINK와 INFO는 서로 배타적이다.

• 각 노드에서 같은 필드 공간을 공유할 수 있다.

• LLINK인지 INFO인지는 LTAG로 지정하면 된다.

• INFO를 조절하면 하나의 노드를 하나의 워드에 담을 수 있다.

• NODE 수는 15로 늘어났다.– 메모리 절약 효과가 없다.

– LLINK가 제거되었지만, 그만큼 RLINK가 추가된노드가 생기기 때문이다.

Page 19: taocp 2.3.3

삼중 연결 트리

• 좀 더 빠른 상향 참조를 위해 각 노드에

PARENT링크를 추가한다.

Page 20: taocp 2.3.3

PARENT링크

• PARENT링크 그 자체로도 임의의 유향 트

리를 규정하는데 충분히 명백하다.

• 루트를 제외한 모든 노드는 자식이 여러 개

일 수 있지만 부모는 오직 하나이다.

• 하향 링크를 두는 것보다 상향 링크를 두는

것이 더 간단하다.

Page 21: taocp 2.3.3

PARENT링크

• 그러나, PARENT링크만으로 된 트리는 큰

쓸모가 없다.

– 노드가 말단인지 아닌지 빠르게 판단하기 힘들

다.

– 주어진 노드의 자식을 빠르게 찾기도 힘들다.

• 그러나!, 상향 링크들로만 충분한 한 가지

매우 중요한 응용이 존재한다.

– 동치 관계를 다루는 알고리즘

Page 22: taocp 2.3.3

동치 관계

• “≡”로 표기하는 동치관계는 객체들의 집합

S의 원소들 사이의 한 관계로, S의 임의의

객체 x, y, z에 대해 다음의 세 성질들을 만

족한다.

• 1)만일 x≡y이고 y≡z이면 x≡z. (추이)

• 2)만일 x≡y이고 y≡x. (대칭)

• 3)x≡x. (반영)

Page 23: taocp 2.3.3

동치 관계

• 유향 트리 구조로 동치류들을 합치거나 주

어진 두 원소가 같은 부류인지 판정이 가능

하다.

– 알고리즘E

Page 24: taocp 2.3.3

알고리즘E

• 동치 관계를 처리한다.

– E1.[초기화]1≤k≤n에대해 PARENT[k]←0으로 설정한다.

– E2.[입력]입력에서 다음 동치 관계쌍 “j≡k”를 가져온다. 입력을 다 소비했다면 알고리즘을 끝낸다.

– E3.[루트찾기]만일 PARENT[j]>0이면j←PARENT[j]로설정하고 이 단계를 반복한다. 만일 PARENT[k]>0이면 k←PARENT[k]를설정하고이 단계를 반복한다.

– E4.[트리병합]만일 j≠k이면 PARENT[j]←k로설정하고, 단계 E2로 돌아간다.

Page 25: taocp 2.3.3

알고리즘E

Page 26: taocp 2.3.3

고리구조

• 두 방향 링크 LLINK와 RLINK 모두에 순환

링크를 사용하는 방법이다.

Page 27: taocp 2.3.3

고리구조

• 다항식 산술에 적용

– 알고리즘A

Page 28: taocp 2.3.3
Page 29: taocp 2.3.3

알고리즘A

Page 30: taocp 2.3.3

연습문제

• 이...이건...

Page 31: taocp 2.3.3