The Art of Computer Programming 2.4 다중연결구조

1,275 views

Published on

TAOCP 아꿈사 스터디 발표

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,275
On SlideShare
0
From Embeds
0
Number of Embeds
246
Actions
Shares
0
Downloads
0
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

The Art of Computer Programming 2.4 다중연결구조

  1. 1. The Art of Computer Programming2.4 다중연결 구조<br />아키텍트를 꿈꾸는 사람들cafe.naver.com/architect1<br />현수명 soomong.net<br />#soomong<br />
  2. 2. 다중연결구조<br />링크가 여러 개!<br />COBOL 예제<br /> COBOL 상세규칙<br /> Algorithm A<br /> Algorithm B<br /> Algorithm C<br />
  3. 3. 다중연결 구조<br />링크필드가 여러개인 노드<br /><ul><li> 구조적 정보가 좀 더 복잡한 사례
  4. 4. 여러종류의 구조들이 동시에 나타나는 경우</li></li></ul><li><ul><li> 노드에 여러종류의 LINK 가 있다고 해서 해당 알고리즘을 작성 or 이해하는 것이 이미 살펴본 알고리즘보다 반드시 더 어려운것은 아니다.</li></li></ul><li>COBOL 예제<br /> - COBOL 의 프로그램 변수들<br /> - COBOL 컴파일러는 이 변수들을 어떻게 해석할까?<br />1 PURCHASES<br /> 2 DATE<br /> 3 DAY<br /> 3 MONTH<br /> 3 YEAR<br /> 2 TRANSACTION<br /> 3 ITEM<br /> 3 QUANTITY<br /> 3 PRICE<br /> 3 TAX<br /> 3 SHIPPER<br /> 4 NAME<br /> 4 ADDRESS<br />1 SALES<br /> 2 DATE<br /> 3 MONTH<br /> 3 DAY<br /> 3 YEAR<br /> 2 TRANSACTION<br /> 3 ITEM<br /> 3 QUANTITY<br /> 3 PRICE<br /> 3 TAX<br /> 3 BUYER<br /> 4 NAME<br /> 4 ADDRESS<br />
  5. 5. 1 PURCHASES<br /> 2 DATE<br /> 3 DAY<br /> 3 MONTH<br /> 3 YEAR<br /> 2 TRANSACTION<br /> 3 ITEM<br /> 3 QUANTITY<br /> 3 PRICE<br /> 3 TAX<br /> 3 SHIPPER<br /> 4 NAME<br /> 4 ADDRESS<br />1 SALES<br /> 2 DATE<br /> 3 MONTH<br /> 3 DAY<br /> 3 YEAR<br /> 2 TRANSACTION<br /> 3 ITEM<br /> 3 QUANTITY<br /> 3 PRICE<br /> 3 TAX<br /> 3 BUYER<br /> 4 NAME<br /> 4 ADDRESS<br /><ul><li>구성 : SALES 는 DATE 와 TRANSACTION 으로 구성
  6. 6. 순서 : 외부 표현 순서기준.</li></ul>-변수Type : 여기서는 논외로 하자.<br />
  7. 7. 1 PURCHASES<br /> 2 DATE<br /> 3 DAY<br /> 3 MONTH<br /> 3 YEAR<br /> 2 TRANSACTION<br /> 3 ITEM<br /> 3 QUANTITY<br /> 3 PRICE<br /> 3 TAX<br /> 3 SHIPPER<br /> 4 NAME<br /> 4 ADDRESS<br />1 SALES<br /> 2 DATE<br /> 3 MONTH<br /> 3 DAY<br /> 3 YEAR<br /> 2 TRANSACTION<br /> 3 ITEM<br /> 3 QUANTITY<br /> 3 PRICE<br /> 3 TAX<br /> 3 BUYER<br /> 4 NAME<br /> 4 ADDRESS<br />개별 변수를 지칭<br /><ul><li>DAY : SALES 의 DAY 인지 ?</li></ul> PURCHASES 의 DAY 인지?<br />DAY OF DATE OF SALES<br />
  8. 8. 1 PURCHASES<br /> 2 DATE<br /> 3 DAY<br /> 3 MONTH<br /> 3 YEAR<br /> 2 TRANSACTION<br /> 3 ITEM<br /> 3 QUANTITY<br /> 3 PRICE<br /> 3 TAX<br /> 3 SHIPPER<br /> 4 NAME<br /> 4 ADDRESS<br />1 SALES<br /> 2 DATE<br /> 3 MONTH<br /> 3 DAY<br /> 3 YEAR<br /> 2 TRANSACTION<br /> 3 ITEM<br /> 3 QUANTITY<br /> 3 PRICE<br /> 3 TAX<br /> 3 BUYER<br /> 4 NAME<br /> 4 ADDRESS<br />NAME OF SHIPPER OF TRANSACTION OF PURCHASES<br />NAME OF SHIPPER<br />SHIPPER 는 오직 한부분에만 나오기 때문<br />
  9. 9. COBOL 상세규칙<br />수준번호 level number<br />한 그룹의 항목은 같은 수준번호를 가짐<br />그 번호는 부모 그룹의 수준번호보다 작음<br />A0 OF A1 OF … OF An, n>=0 , 0<j<n<br />이런 조건을 만족하는 A0 은 오직 하나만 존재<br />한정<br />같은 이름 A0 가 여러장소에 나타난다면 <br />한정을 통해서 지칭하는 방법이 있어야함<br />
  10. 10. COBOL 상세규칙<br />MOVE CORRESPONDING A TO B<br />자료영역 A 에서 자료영역 B 로<br />대응되는 이름을 가진 모든 항목들을 옮긴다<br />MOVE CORRESPONDING DATE OF SALES TO <br />DATE OF PURCHASES <br />SALES 의 MONTH,DAY,YEAR 값을<br />PURCHASES 의 MONTH,DAY,YEAR 로 이동한다<br />
  11. 11. COBOL 컴파일러 알고리즘 설계<br />연산1) 수준번호와 이름을 처리해서<br />연산2와 연산3에서 사용할수<br />있도록 컴파일러 내부의 표에<br />집어넣는다<br />연산2) 주어진 한정된 참조가 유효한지 판정하고,<br />유효하다면 해당자료 항목의 위치를 찾는다<br />연산3) 주어진 CORRESPONDING 문장이 지시하는<br />모든 대응 항목 쌍들을 찾는다<br />
  12. 12. COBOL 컴파일러 알고리즘 설계<br />연산1) 수준번호와 이름을 처리해서<br />연산2와 연산3에서 사용할수<br />있도록 컴파일러 내부의 표에<br />집어넣는다<br />표에는 어떤 정보가 들어가야 할까?<br />연산2와 연산3에서 어떤 정보가 필요한지<br />먼저 체크되어야 결정가능!<br />
  13. 13. COBOL 컴파일러 알고리즘 설계<br />연산2) 주어진 한정된 참조가 유효한지 판정하고,<br />유효하다면 해당자료 항목의 위치를 찾는다<br />연산3) 주어진 CORRESPONDING 문장이 지시하는<br />모든 대응 항목 쌍들을 찾는다<br /><ul><li>기호표에서 이름 A0 를 조회할수있어야 한다</li></ul>-기호표에서 더 자세한 정보를 가진 자료표로의 링크가 필요<br /><ul><li>자료표요소에는 상위 항목에 대한 링크도 필요
  14. 14. 자료표에서 다시 기호표로 돌아가는 링크도 필요
  15. 15. 하위 항목에 대한 링크도 필요
  16. 16. 동등 항목에 대한 링크도 필요</li></li></ul><li>COBOL 컴파일러 알고리즘 설계<br />연산2) 주어진 한정된 참조가 유효한지 판정하고,<br />유효하다면 해당자료 항목의 위치를 찾는다<br />연산3) 주어진 CORRESPONDING 문장이 지시하는<br />모든 대응 항목 쌍들을 찾는다<br />1 SALES<br />2 DATE<br />2 TRANSACTION<br />3 MONTH<br />3 DAY<br />3 YEAR<br />3 MONTH<br />
  17. 17. COBOL 컴파일러 알고리즘 설계<br />1 SALES<br />2 DATE<br />2 TRANSACTION<br />3 MONTH<br />3 DAY<br />3 YEAR<br />3 MONTH<br />Symbol Table<br />PREV : 같은 이름을 가진 이전요소로의 링크<br />PARENT : 속해있는 상위 그룹으로 링크<br />NAME : 항목에 대한 기호표 요소로의 링크<br />CHILD : 첫째 하위 항목으로 링크<br />SIB : 같은 그룹의 다음 항목으로 링크<br />
  18. 18. Algorithm A (자료표구축)<br />A1. [초기화] <br />스택을 비우고 (0,Λ) 삽입<br />A2. [다음항목] <br />입력에서 다음 자료 항목 (L,P) 를 가져온다<br /> if( 더이상없음 ) then END!<br /> Q ← AVAIL<br />A3. [이름 링크들을 설정] <br /> PREV(Q) ← LINK(P)<br /> LINK(P) ← Q<br /> NAME(Q) ← P<br />A4. [수준들을 비교] <br />스택의 최상위 요소를 (L1,P1) 에 복사한다<br /> if( L1<L ) then <br /> CHILD(P1) ← Q<br /> if( P1 == Λ) then FIRST ← Q<br /> GOTO A6<br />A5. [최상위 수준을 제거] <br /> if( L1>L ) then <br />스택최상위 요소를 제거<br />스택의 최상위 요소를 (L1,P1) 에 복사한다<br /> GOTO A5<br /> if( L1<L ) then 오류를 보고<br /> else <br /> SIB(P1) ← Q <br />스택최상위 요소를 제거<br />스택의 최상위 요소를 (L1,P1) 에 복사한다<br />A6. [가족 링크들을 설정] <br /> PARENT(Q) ← P1 , CHILD(Q) ←Λ , SIB(Q) ←Λ<br />A7. [스택에 추가] <br /> (L,Q) 를 스택에 PUSH <br /> GOTO A2<br />아…어떻게 설명을<br />해야할까요ㅜㅜ<br />
  19. 19. 어떻게 하면 알고리즘을 알기쉽게 잘 <br />설명 할 수 있을까?<br />세부적으로 모든 구문을 설명<br />대략적인 과정을 설명<br />한줄 또는그림하나로 설명<br />
  20. 20. Algorithm A (자료표구축)<br />왼쪽의 (L,P) 쌍들을 입력받아서<br />오른쪽의 자료표를 만든다<br />(L,P)<br />
  21. 21. Algorithm A (자료표구축)<br />A1. [초기화] <br />스택을 비우고 (0,Λ) 삽입<br />A2. [다음항목] <br />입력에서 다음 자료 항목 (L,P) 를 가져온다<br /> if( 더이상없음 ) then END!<br /> Q ← AVAIL<br />A3. [이름 링크들을 설정] <br /> PREV(Q) ← LINK(P)<br /> LINK(P) ← Q<br /> NAME(Q) ← P<br />A4. [수준들을 비교] <br />스택의 최상위 요소를 (L1,P1) 에 복사한다<br /> if( L1<L ) then <br /> CHILD(P1) ← Q<br /> if( P1 == Λ) then FIRST ← Q<br /> GOTO A6<br />A5. [최상위 수준을 제거] <br /> if( L1>L ) then <br />스택최상위 요소를 제거<br />스택의 최상위 요소를 (L1,P1) 에 복사한다<br /> GOTO A5<br /> if( L1<L ) then 오류를 보고<br /> else <br /> SIB(P1) ← Q <br />스택최상위 요소를 제거<br />스택의 최상위 요소를 (L1,P1) 에 복사한다<br />A6. [가족 링크들을 설정] <br /> PARENT(Q) ← P1 , CHILD(Q) ←Λ , SIB(Q) ←Λ<br />A7. [스택에 추가] <br /> (L,Q) 를 스택에 PUSH <br /> GOTO A2<br />(0,Λ)<br />1 A<br /> 3 B<br /> 7 C<br /> 7 D<br /> 3 E<br />
  22. 22. Algorithm A (자료표구축)<br />A1. [초기화] <br />스택을 비우고 (0,Λ) 삽입<br />A2. [다음항목] <br />입력에서 다음 자료 항목 (L,P) 를 가져온다<br /> if( 더이상없음 ) then END!<br /> Q ← AVAIL<br />A3. [이름 링크들을 설정] <br /> PREV(Q) ← LINK(P)<br /> LINK(P) ← Q<br /> NAME(Q) ← P<br />A4. [수준들을 비교] <br />스택의 최상위 요소를 (L1,P1) 에 복사한다<br /> if( L1<L ) then <br /> CHILD(P1) ← Q<br /> if( P1 == Λ) then FIRST ← Q<br /> GOTO A6<br />A5. [최상위 수준을 제거] <br /> if( L1>L ) then <br />스택최상위 요소를 제거<br />스택의 최상위 요소를 (L1,P1) 에 복사한다<br /> GOTO A5<br /> if( L1<L ) then 오류를 보고<br /> else <br /> SIB(P1) ← Q <br />스택최상위 요소를 제거<br />스택의 최상위 요소를 (L1,P1) 에 복사한다<br />A6. [가족 링크들을 설정] <br /> PARENT(Q) ← P1 , CHILD(Q) ←Λ , SIB(Q) ←Λ<br />A7. [스택에 추가] <br /> (L,Q) 를 스택에 PUSH <br /> GOTO A2<br />Symbol<br />Table<br />(0,Λ)<br />Q<br />(L,P)<br />(1,A)<br />1 A<br /> 3 B<br /> 7 C<br /> 7 D<br /> 3 E<br />
  23. 23. Algorithm A (자료표구축)<br />A1. [초기화] <br />스택을 비우고 (0,Λ) 삽입<br />A2. [다음항목] <br />입력에서 다음 자료 항목 (L,P) 를 가져온다<br /> if( 더이상없음 ) then END!<br /> Q ← AVAIL<br />A3. [이름 링크들을 설정] <br /> PREV(Q) ← LINK(P)<br /> LINK(P) ← Q<br /> NAME(Q) ← P<br />A4. [수준들을 비교] <br />스택의 최상위 요소를 (L1,P1) 에 복사한다<br /> if( L1<L ) then <br /> CHILD(P1) ← Q<br /> if( P1 == Λ) then FIRST ← Q<br /> GOTO A6<br />A5. [최상위 수준을 제거] <br /> if( L1>L ) then <br />스택최상위 요소를 제거<br />스택의 최상위 요소를 (L1,P1) 에 복사한다<br /> GOTO A5<br /> if( L1<L ) then 오류를 보고<br /> else <br /> SIB(P1) ← Q <br />스택최상위 요소를 제거<br />스택의 최상위 요소를 (L1,P1) 에 복사한다<br />A6. [가족 링크들을 설정] <br /> PARENT(Q) ← P1 , CHILD(Q) ←Λ , SIB(Q) ←Λ<br />A7. [스택에 추가] <br /> (L,Q) 를 스택에 PUSH <br /> GOTO A2<br />Symbol<br />Table<br />(0,Λ)<br />Q<br />(L,P)<br />(1,A)<br />1 A<br /> 3 B<br /> 7 C<br /> 7 D<br /> 3 E<br />
  24. 24. Algorithm A (자료표구축)<br />A1. [초기화] <br />스택을 비우고 (0,Λ) 삽입<br />A2. [다음항목] <br />입력에서 다음 자료 항목 (L,P) 를 가져온다<br /> if( 더이상없음 ) then END!<br /> Q ← AVAIL<br />A3. [이름 링크들을 설정] <br /> PREV(Q) ← LINK(P)<br /> LINK(P) ← Q<br /> NAME(Q) ← P<br />A4. [수준들을 비교] <br />스택의 최상위 요소를 (L1,P1) 에 복사한다<br /> if( L1<L ) then <br /> CHILD(P1) ← Q<br /> if( P1 == Λ) then FIRST ← Q<br /> GOTO A6<br />A5. [최상위 수준을 제거] <br /> if( L1>L ) then <br />스택최상위 요소를 제거<br />스택의 최상위 요소를 (L1,P1) 에 복사한다<br /> GOTO A5<br /> if( L1<L ) then 오류를 보고<br /> else <br /> SIB(P1) ← Q <br />스택최상위 요소를 제거<br />스택의 최상위 요소를 (L1,P1) 에 복사한다<br />A6. [가족 링크들을 설정] <br /> PARENT(Q) ← P1 , CHILD(Q) ←Λ , SIB(Q) ←Λ<br />A7. [스택에 추가] <br /> (L,Q) 를 스택에 PUSH <br /> GOTO A2<br />Symbol<br />Table<br />(0,Λ)<br />Q<br />FIRST<br />(L1,P1)<br />(L,P)<br />(1,A)<br />(0, Λ )<br />1 A<br /> 3 B<br /> 7 C<br /> 7 D<br /> 3 E<br />
  25. 25. Algorithm A (자료표구축)<br />A1. [초기화] <br />스택을 비우고 (0,Λ) 삽입<br />A2. [다음항목] <br />입력에서 다음 자료 항목 (L,P) 를 가져온다<br /> if( 더이상없음 ) then END!<br /> Q ← AVAIL<br />A3. [이름 링크들을 설정] <br /> PREV(Q) ← LINK(P)<br /> LINK(P) ← Q<br /> NAME(Q) ← P<br />A4. [수준들을 비교] <br />스택의 최상위 요소를 (L1,P1) 에 복사한다<br /> if( L1<L ) then <br /> CHILD(P1) ← Q<br /> if( P1 == Λ) then FIRST ← Q<br /> GOTO A6<br />A5. [최상위 수준을 제거] <br /> if( L1>L ) then <br />스택최상위 요소를 제거<br />스택의 최상위 요소를 (L1,P1) 에 복사한다<br /> GOTO A5<br /> if( L1<L ) then 오류를 보고<br /> else <br /> SIB(P1) ← Q <br />스택최상위 요소를 제거<br />스택의 최상위 요소를 (L1,P1) 에 복사한다<br />A6. [가족 링크들을 설정] <br /> PARENT(Q) ← P1 , CHILD(Q) ←Λ , SIB(Q) ←Λ<br />A7. [스택에 추가] <br /> (L,Q) 를 스택에 PUSH <br /> GOTO A2<br />Symbol<br />Table<br />(0,Λ)<br />Q<br />FIRST<br />(L1,P1)<br />(L,P)<br />(1,A)<br />(0, Λ )<br />1 A<br /> 3 B<br /> 7 C<br /> 7 D<br /> 3 E<br />
  26. 26. Algorithm A (자료표구축)<br />A1. [초기화] <br />스택을 비우고 (0,Λ) 삽입<br />A2. [다음항목] <br />입력에서 다음 자료 항목 (L,P) 를 가져온다<br /> if( 더이상없음 ) then END!<br /> Q ← AVAIL<br />A3. [이름 링크들을 설정] <br /> PREV(Q) ← LINK(P)<br /> LINK(P) ← Q<br /> NAME(Q) ← P<br />A4. [수준들을 비교] <br />스택의 최상위 요소를 (L1,P1) 에 복사한다<br /> if( L1<L ) then <br /> CHILD(P1) ← Q<br /> if( P1 == Λ) then FIRST ← Q<br /> GOTO A6<br />A5. [최상위 수준을 제거] <br /> if( L1>L ) then <br />스택최상위 요소를 제거<br />스택의 최상위 요소를 (L1,P1) 에 복사한다<br /> GOTO A5<br /> if( L1<L ) then 오류를 보고<br /> else <br /> SIB(P1) ← Q <br />스택최상위 요소를 제거<br />스택의 최상위 요소를 (L1,P1) 에 복사한다<br />A6. [가족 링크들을 설정] <br /> PARENT(Q) ← P1 , CHILD(Q) ←Λ , SIB(Q) ←Λ<br />A7. [스택에 추가] <br /> (L,Q) 를 스택에 PUSH <br /> GOTO A2<br />Symbol<br />Table<br />(1,A)<br />(0,Λ)<br />Q<br />FIRST<br />(L1,P1)<br />(L,P)<br />(1,A)<br />(0, Λ )<br />1 A<br /> 3 B<br /> 7 C<br /> 7 D<br /> 3 E<br />
  27. 27. Algorithm A (자료표구축)<br />A1. [초기화] <br />스택을 비우고 (0,Λ) 삽입<br />A2. [다음항목] <br />입력에서 다음 자료 항목 (L,P) 를 가져온다<br /> if( 더이상없음 ) then END!<br /> Q ← AVAIL<br />A3. [이름 링크들을 설정] <br /> PREV(Q) ← LINK(P)<br /> LINK(P) ← Q<br /> NAME(Q) ← P<br />A4. [수준들을 비교] <br />스택의 최상위 요소를 (L1,P1) 에 복사한다<br /> if( L1<L ) then <br /> CHILD(P1) ← Q<br /> if( P1 == Λ) then FIRST ← Q<br /> GOTO A6<br />A5. [최상위 수준을 제거] <br /> if( L1>L ) then <br />스택최상위 요소를 제거<br />스택의 최상위 요소를 (L1,P1) 에 복사한다<br /> GOTO A5<br /> if( L1<L ) then 오류를 보고<br /> else <br /> SIB(P1) ← Q <br />스택최상위 요소를 제거<br />스택의 최상위 요소를 (L1,P1) 에 복사한다<br />A6. [가족 링크들을 설정] <br /> PARENT(Q) ← P1 , CHILD(Q) ←Λ , SIB(Q) ←Λ<br />A7. [스택에 추가] <br /> (L,Q) 를 스택에 PUSH <br /> GOTO A2<br />Symbol<br />Table<br />(1,A)<br />(0,Λ)<br />FIRST<br />A1<br />Q<br />(L1,P1)<br />(L,P)<br />(3,B)<br />(0, Λ )<br />1 A<br /> 3 B<br /> 7 C<br /> 7 D<br /> 3 E<br />
  28. 28. Algorithm A (자료표구축)<br />A1. [초기화] <br />스택을 비우고 (0,Λ) 삽입<br />A2. [다음항목] <br />입력에서 다음 자료 항목 (L,P) 를 가져온다<br /> if( 더이상없음 ) then END!<br /> Q ← AVAIL<br />A3. [이름 링크들을 설정] <br /> PREV(Q) ← LINK(P)<br /> LINK(P) ← Q<br /> NAME(Q) ← P<br />A4. [수준들을 비교] <br />스택의 최상위 요소를 (L1,P1) 에 복사한다<br /> if( L1<L ) then <br /> CHILD(P1) ← Q<br /> if( P1 == Λ) then FIRST ← Q<br /> GOTO A6<br />A5. [최상위 수준을 제거] <br /> if( L1>L ) then <br />스택최상위 요소를 제거<br />스택의 최상위 요소를 (L1,P1) 에 복사한다<br /> GOTO A5<br /> if( L1<L ) then 오류를 보고<br /> else <br /> SIB(P1) ← Q <br />스택최상위 요소를 제거<br />스택의 최상위 요소를 (L1,P1) 에 복사한다<br />A6. [가족 링크들을 설정] <br /> PARENT(Q) ← P1 , CHILD(Q) ←Λ , SIB(Q) ←Λ<br />A7. [스택에 추가] <br /> (L,Q) 를 스택에 PUSH <br /> GOTO A2<br />Symbol<br />Table<br />(1,A)<br />(0,Λ)<br />FIRST<br />A1<br />Q<br />(L1,P1)<br />(L,P)<br />(3,B)<br />(0, Λ )<br />1 A<br /> 3 B<br /> 7 C<br /> 7 D<br /> 3 E<br />
  29. 29. Algorithm A (자료표구축)<br />A1. [초기화] <br />스택을 비우고 (0,Λ) 삽입<br />A2. [다음항목] <br />입력에서 다음 자료 항목 (L,P) 를 가져온다<br /> if( 더이상없음 ) then END!<br /> Q ← AVAIL<br />A3. [이름 링크들을 설정] <br /> PREV(Q) ← LINK(P)<br /> LINK(P) ← Q<br /> NAME(Q) ← P<br />A4. [수준들을 비교] <br />스택의 최상위 요소를 (L1,P1) 에 복사한다<br /> if( L1<L ) then <br /> CHILD(P1) ← Q<br /> if( P1 == Λ) then FIRST ← Q<br /> GOTO A6<br />A5. [최상위 수준을 제거] <br /> if( L1>L ) then <br />스택최상위 요소를 제거<br />스택의 최상위 요소를 (L1,P1) 에 복사한다<br /> GOTO A5<br /> if( L1<L ) then 오류를 보고<br /> else <br /> SIB(P1) ← Q <br />스택최상위 요소를 제거<br />스택의 최상위 요소를 (L1,P1) 에 복사한다<br />A6. [가족 링크들을 설정] <br /> PARENT(Q) ← P1 , CHILD(Q) ←Λ , SIB(Q) ←Λ<br />A7. [스택에 추가] <br /> (L,Q) 를 스택에 PUSH <br /> GOTO A2<br />Symbol<br />Table<br />(1,A)<br />(0,Λ)<br />FIRST<br />A1<br />Q<br />(L1,P1)<br />(L,P)<br />(3,B)<br />(1,A)<br />1 A<br /> 3 B<br /> 7 C<br /> 7 D<br /> 3 E<br />
  30. 30. Algorithm A (자료표구축)<br />A1. [초기화] <br />스택을 비우고 (0,Λ) 삽입<br />A2. [다음항목] <br />입력에서 다음 자료 항목 (L,P) 를 가져온다<br /> if( 더이상없음 ) then END!<br /> Q ← AVAIL<br />A3. [이름 링크들을 설정] <br /> PREV(Q) ← LINK(P)<br /> LINK(P) ← Q<br /> NAME(Q) ← P<br />A4. [수준들을 비교] <br />스택의 최상위 요소를 (L1,P1) 에 복사한다<br /> if( L1<L ) then <br /> CHILD(P1) ← Q<br /> if( P1 == Λ) then FIRST ← Q<br /> GOTO A6<br />A5. [최상위 수준을 제거] <br /> if( L1>L ) then <br />스택최상위 요소를 제거<br />스택의 최상위 요소를 (L1,P1) 에 복사한다<br /> GOTO A5<br /> if( L1<L ) then 오류를 보고<br /> else <br /> SIB(P1) ← Q <br />스택최상위 요소를 제거<br />스택의 최상위 요소를 (L1,P1) 에 복사한다<br />A6. [가족 링크들을 설정] <br /> PARENT(Q) ← P1 , CHILD(Q) ←Λ , SIB(Q) ←Λ<br />A7. [스택에 추가] <br /> (L,Q) 를 스택에 PUSH <br /> GOTO A2<br />Symbol<br />Table<br />(1,A)<br />(0,Λ)<br />FIRST<br />A1<br />Q<br />(L1,P1)<br />(L,P)<br />(3,B)<br />(1,A)<br />1 A<br /> 3 B<br /> 7 C<br /> 7 D<br /> 3 E<br />
  31. 31. Algorithm A (자료표구축)<br />A1. [초기화] <br />스택을 비우고 (0,Λ) 삽입<br />A2. [다음항목] <br />입력에서 다음 자료 항목 (L,P) 를 가져온다<br /> if( 더이상없음 ) then END!<br /> Q ← AVAIL<br />A3. [이름 링크들을 설정] <br /> PREV(Q) ← LINK(P)<br /> LINK(P) ← Q<br /> NAME(Q) ← P<br />A4. [수준들을 비교] <br />스택의 최상위 요소를 (L1,P1) 에 복사한다<br /> if( L1<L ) then <br /> CHILD(P1) ← Q<br /> if( P1 == Λ) then FIRST ← Q<br /> GOTO A6<br />A5. [최상위 수준을 제거] <br /> if( L1>L ) then <br />스택최상위 요소를 제거<br />스택의 최상위 요소를 (L1,P1) 에 복사한다<br /> GOTO A5<br /> if( L1<L ) then 오류를 보고<br /> else <br /> SIB(P1) ← Q <br />스택최상위 요소를 제거<br />스택의 최상위 요소를 (L1,P1) 에 복사한다<br />A6. [가족 링크들을 설정] <br /> PARENT(Q) ← P1 , CHILD(Q) ←Λ , SIB(Q) ←Λ<br />A7. [스택에 추가] <br /> (L,Q) 를 스택에 PUSH <br /> GOTO A2<br />Symbol<br />Table<br />(3,B)<br />(1,A)<br />(0,Λ)<br />FIRST<br />A1<br />Q<br />(L1,P1)<br />(L,P)<br />(3,B)<br />(1,A)<br />1 A<br /> 3 B<br /> 7 C<br /> 7 D<br /> 3 E<br />
  32. 32. Algorithm A (자료표구축)<br />A1. [초기화] <br />스택을 비우고 (0,Λ) 삽입<br />A2. [다음항목] <br />입력에서 다음 자료 항목 (L,P) 를 가져온다<br /> if( 더이상없음 ) then END!<br /> Q ← AVAIL<br />A3. [이름 링크들을 설정] <br /> PREV(Q) ← LINK(P)<br /> LINK(P) ← Q<br /> NAME(Q) ← P<br />A4. [수준들을 비교] <br />스택의 최상위 요소를 (L1,P1) 에 복사한다<br /> if( L1<L ) then <br /> CHILD(P1) ← Q<br /> if( P1 == Λ) then FIRST ← Q<br /> GOTO A6<br />A5. [최상위 수준을 제거] <br /> if( L1>L ) then <br />스택최상위 요소를 제거<br />스택의 최상위 요소를 (L1,P1) 에 복사한다<br /> GOTO A5<br /> if( L1<L ) then 오류를 보고<br /> else <br /> SIB(P1) ← Q <br />스택최상위 요소를 제거<br />스택의 최상위 요소를 (L1,P1) 에 복사한다<br />A6. [가족 링크들을 설정] <br /> PARENT(Q) ← P1 , CHILD(Q) ←Λ , SIB(Q) ←Λ<br />A7. [스택에 추가] <br /> (L,Q) 를 스택에 PUSH <br /> GOTO A2<br />Symbol<br />Table<br />(7,D)<br />(7,C)<br />(3,B)<br />(1,A)<br />(0,Λ)<br />FIRST<br />A1<br />B3<br />C7<br />1 A<br /> 3 B<br /> 7 C<br /> 7 D<br /> 3 E<br />(L1,P1)<br />(L,P)<br />(7,C)<br />(7,D)<br />
  33. 33. Algorithm A (자료표구축)<br />A1. [초기화] <br />스택을 비우고 (0,Λ) 삽입<br />A2. [다음항목] <br />입력에서 다음 자료 항목 (L,P) 를 가져온다<br /> if( 더이상없음 ) then END!<br /> Q ← AVAIL<br />A3. [이름 링크들을 설정] <br /> PREV(Q) ← LINK(P)<br /> LINK(P) ← Q<br /> NAME(Q) ← P<br />A4. [수준들을 비교] <br />스택의 최상위 요소를 (L1,P1) 에 복사한다<br /> if( L1<L ) then <br /> CHILD(P1) ← Q<br /> if( P1 == Λ) then FIRST ← Q<br /> GOTO A6<br />A5. [최상위 수준을 제거] <br /> if( L1>L ) then <br />스택최상위 요소를 제거<br />스택의 최상위 요소를 (L1,P1) 에 복사한다<br /> GOTO A5<br /> if( L1<L ) then 오류를 보고<br /> else <br /> SIB(P1) ← Q <br />스택최상위 요소를 제거<br />스택의 최상위 요소를 (L1,P1) 에 복사한다<br />A6. [가족 링크들을 설정] <br /> PARENT(Q) ← P1 , CHILD(Q) ←Λ , SIB(Q) ←Λ<br />A7. [스택에 추가] <br /> (L,Q) 를 스택에 PUSH <br /> GOTO A2<br />Symbol<br />Table<br />(7,D)<br />(7,C)<br />(3,B)<br />(1,A)<br />(0,Λ)<br />FIRST<br />A1<br />B3<br />C7<br />D7<br />1 A<br /> 3 B<br /> 7 C<br /> 7 D<br /> 3 E<br />(L1,P1)<br />(L,P)<br />(7,C)<br />(7,C)<br />
  34. 34. Algorithm A (자료표구축)<br />A1. [초기화] <br />스택을 비우고 (0,Λ) 삽입<br />A2. [다음항목] <br />입력에서 다음 자료 항목 (L,P) 를 가져온다<br /> if( 더이상없음 ) then END!<br /> Q ← AVAIL<br />A3. [이름 링크들을 설정] <br /> PREV(Q) ← LINK(P)<br /> LINK(P) ← Q<br /> NAME(Q) ← P<br />A4. [수준들을 비교] <br />스택의 최상위 요소를 (L1,P1) 에 복사한다<br /> if( L1<L ) then <br /> CHILD(P1) ← Q<br /> if( P1 == Λ) then FIRST ← Q<br /> GOTO A6<br />A5. [최상위 수준을 제거] <br /> if( L1>L ) then <br />스택최상위 요소를 제거<br />스택의 최상위 요소를 (L1,P1) 에 복사한다<br /> GOTO A5<br /> if( L1<L ) then 오류를 보고<br /> else <br /> SIB(P1) ← Q <br />스택최상위 요소를 제거<br />스택의 최상위 요소를 (L1,P1) 에 복사한다<br />A6. [가족 링크들을 설정] <br /> PARENT(Q) ← P1 , CHILD(Q) ←Λ , SIB(Q) ←Λ<br />A7. [스택에 추가] <br /> (L,Q) 를 스택에 PUSH <br /> GOTO A2<br />Symbol<br />Table<br />(7,D)<br />(7,C)<br />(3,B)<br />(1,A)<br />(0,Λ)<br />FIRST<br />A1<br />B3<br />C7<br />D7<br />Q<br />1 A<br /> 3 B<br /> 7 C<br /> 7 D<br /> 3 E<br />(L1,P1)<br />(L,P)<br />(3,E)<br />(7,C)<br />
  35. 35. Algorithm A (자료표구축)<br />A1. [초기화] <br />스택을 비우고 (0,Λ) 삽입<br />A2. [다음항목] <br />입력에서 다음 자료 항목 (L,P) 를 가져온다<br /> if( 더이상없음 ) then END!<br /> Q ← AVAIL<br />A3. [이름 링크들을 설정] <br /> PREV(Q) ← LINK(P)<br /> LINK(P) ← Q<br /> NAME(Q) ← P<br />A4. [수준들을 비교] <br />스택의 최상위 요소를 (L1,P1) 에 복사한다<br /> if( L1<L ) then <br /> CHILD(P1) ← Q<br /> if( P1 == Λ) then FIRST ← Q<br /> GOTO A6<br />A5. [최상위 수준을 제거] <br /> if( L1>L ) then <br />스택최상위 요소를 제거<br />스택의 최상위 요소를 (L1,P1) 에 복사한다<br /> GOTO A5<br /> if( L1<L ) then 오류를 보고<br /> else <br /> SIB(P1) ← Q <br />스택최상위 요소를 제거<br />스택의 최상위 요소를 (L1,P1) 에 복사한다<br />A6. [가족 링크들을 설정] <br /> PARENT(Q) ← P1 , CHILD(Q) ←Λ , SIB(Q) ←Λ<br />A7. [스택에 추가] <br /> (L,Q) 를 스택에 PUSH <br /> GOTO A2<br />Symbol<br />Table<br />(7,D)<br />(7,C)<br />(3,B)<br />(1,A)<br />(0,Λ)<br />FIRST<br />A1<br />B3<br />C7<br />D7<br />Q<br />1 A<br /> 3 B<br /> 7 C<br /> 7 D<br /> 3 E<br />(L1,P1)<br />(L,P)<br />(3,E)<br />(7,C)<br />
  36. 36. Algorithm A (자료표구축)<br />A1. [초기화] <br />스택을 비우고 (0,Λ) 삽입<br />A2. [다음항목] <br />입력에서 다음 자료 항목 (L,P) 를 가져온다<br /> if( 더이상없음 ) then END!<br /> Q ← AVAIL<br />A3. [이름 링크들을 설정] <br /> PREV(Q) ← LINK(P)<br /> LINK(P) ← Q<br /> NAME(Q) ← P<br />A4. [수준들을 비교] <br />스택의 최상위 요소를 (L1,P1) 에 복사한다<br /> if( L1<L ) then <br /> CHILD(P1) ← Q<br /> if( P1 == Λ) then FIRST ← Q<br /> GOTO A6<br />A5. [최상위 수준을 제거] <br /> if( L1>L ) then <br />스택최상위 요소를 제거<br />스택의 최상위 요소를 (L1,P1) 에 복사한다<br /> GOTO A5<br /> if( L1<L ) then 오류를 보고<br /> else <br /> SIB(P1) ← Q <br />스택최상위 요소를 제거<br />스택의 최상위 요소를 (L1,P1) 에 복사한다<br />A6. [가족 링크들을 설정] <br /> PARENT(Q) ← P1 , CHILD(Q) ←Λ , SIB(Q) ←Λ<br />A7. [스택에 추가] <br /> (L,Q) 를 스택에 PUSH <br /> GOTO A2<br />Symbol<br />Table<br />(7,D)<br />(7,C)<br />(3,B)<br />(1,A)<br />(0,Λ)<br />FIRST<br />A1<br />B3<br />C7<br />D7<br />Q<br />1 A<br /> 3 B<br /> 7 C<br /> 7 D<br /> 3 E<br />(L1,P1)<br />(L,P)<br />(3,E)<br />(7,D)<br />
  37. 37. Algorithm A (자료표구축)<br />A1. [초기화] <br />스택을 비우고 (0,Λ) 삽입<br />A2. [다음항목] <br />입력에서 다음 자료 항목 (L,P) 를 가져온다<br /> if( 더이상없음 ) then END!<br /> Q ← AVAIL<br />A3. [이름 링크들을 설정] <br /> PREV(Q) ← LINK(P)<br /> LINK(P) ← Q<br /> NAME(Q) ← P<br />A4. [수준들을 비교] <br />스택의 최상위 요소를 (L1,P1) 에 복사한다<br /> if( L1<L ) then <br /> CHILD(P1) ← Q<br /> if( P1 == Λ) then FIRST ← Q<br /> GOTO A6<br />A5. [최상위 수준을 제거] <br /> if( L1>L ) then <br />스택최상위 요소를 제거<br />스택의 최상위 요소를 (L1,P1) 에 복사한다<br /> GOTO A5<br /> if( L1<L ) then 오류를 보고<br /> else <br /> SIB(P1) ← Q <br />스택최상위 요소를 제거<br />스택의 최상위 요소를 (L1,P1) 에 복사한다<br />A6. [가족 링크들을 설정] <br /> PARENT(Q) ← P1 , CHILD(Q) ←Λ , SIB(Q) ←Λ<br />A7. [스택에 추가] <br /> (L,Q) 를 스택에 PUSH <br /> GOTO A2<br />(7,D)<br />Symbol<br />Table<br />(7,C)<br />(3,B)<br />(1,A)<br />(0,Λ)<br />FIRST<br />A1<br />B3<br />C7<br />D7<br />Q<br />1 A<br /> 3 B<br /> 7 C<br /> 7 D<br /> 3 E<br />(L1,P1)<br />(L,P)<br />(3,E)<br />(1,A)<br />
  38. 38. Algorithm B (한정된 참조 점검)<br />이 참조가 유효한지를 점검하고 유효하다면<br />변수 Q 를 이 참조가 지칭하는 항목에 대한<br />자료표 요소의 주소로 설정한다<br />이런 서브루틴이 <br />있다고 가정<br />서브루틴<br />
  39. 39. Algorithm B (한정된 참조 점검)<br />NAME OF SHIPPER OF TRANSACTION OF PURCHASES<br />이게 유효한가?<br />1<br />1 PURCHASES<br /> 2 DATE<br /> 3 DAY<br /> 3 MONTH<br /> 3 YEAR<br /> 2 TRANSACTION<br /> 3 ITEM<br /> 3 QUANTITY<br /> 3 PRICE<br /> 3 TAX<br /> 3 SHIPPER<br /> 4 NAME<br /> 4 ADDRESS<br />2<br />Q<br />
  40. 40. Algorithm B (참조 점검)<br />B1. [초기화] <br />B2. [끝인가?] <br />B3. [부합 완료?] <br />B4. [K를 증가] <br />B5. [트리를 따라 위로] <br />B6. [Ak가 부합하는가?] <br />
  41. 41. Algorithm B (참조점검)<br />1 A<br /> 3 B<br /> 7 C<br /> 7 D<br /> 3 E<br />D OF B OF A<br />k:0~2<br />Q<br />
  42. 42. Algorithm B (참조점검)<br />1 A<br /> 3 B<br /> 7 C<br /> 7 D<br /> 3 E<br />D OF B OF A<br />k : 0<br />Q : Λ<br />
  43. 43. Algorithm B (참조점검)<br />1 A<br /> 3 B<br /> 7 C<br /> 7 D<br /> 3 E<br />D OF B OF A<br />k : 0<br />Q : Λ<br />
  44. 44. Algorithm B (참조점검)<br />1 A<br /> 3 B<br /> 7 C<br /> 7 D<br /> 3 E<br />D OF B OF A<br />k : 0<br />Q : D<br />
  45. 45. Algorithm B (참조점검)<br />1 A<br /> 3 B<br /> 7 C<br /> 7 D<br /> 3 E<br />D OF B OF A<br />k : 1<br />Q : D<br />
  46. 46. Algorithm B (참조점검)<br />1 A<br /> 3 B<br /> 7 C<br /> 7 D<br /> 3 E<br />D OF B OF A<br />k : 1<br />Q : D<br />
  47. 47. Algorithm B (참조점검)<br />1 A<br /> 3 B<br /> 7 C<br /> 7 D<br /> 3 E<br />D OF B OF A<br />k : 1<br />Q : D<br />
  48. 48. Algorithm B (참조점검)<br />1 A<br /> 3 B<br /> 7 C<br /> 7 D<br /> 3 E<br />D OF B OF A<br />k : 1<br />Q : B<br />
  49. 49. Algorithm B (참조점검)<br />1 A<br /> 3 B<br /> 7 C<br /> 7 D<br /> 3 E<br />D OF B OF A<br />k : 2<br />Q : B<br />
  50. 50. Algorithm B (참조점검)<br />1 A<br /> 3 B<br /> 7 C<br /> 7 D<br /> 3 E<br />D OF B OF A<br />k : 2<br />Q : B<br />
  51. 51. Algorithm B (참조점검)<br />1 A<br /> 3 B<br /> 7 C<br /> 7 D<br /> 3 E<br />D OF B OF A<br />k : 2<br />Q : B<br />
  52. 52. Algorithm B (참조점검)<br />1 A<br /> 3 B<br /> 7 C<br /> 7 D<br /> 3 E<br />D OF B OF A<br />k : 2<br />Q : A<br />
  53. 53. Algorithm B (참조점검)<br />1 A<br /> 3 B<br /> 7 C<br /> 7 D<br /> 3 E<br />D OF B OF A<br />k : 2<br />Q : A<br />
  54. 54. Algorithm C (Corresponding 쌍들을 찾기)<br />MOVE CORRESPONDING A TO B<br />자료영역 A 에서 자료영역 B 로<br />대응되는 이름을 가진 모든 항목들을 옮긴다<br />MOVE CORRESPONDING A TO H<br />MOVE B OF A TO B OF H<br />MOVE G OF F OF A TO G OF F OF H<br />
  55. 55. Algorithm C (Corresponding 쌍들을 찾기)<br />MOVE TO<br />대응되는 이름을 가진 항목을 이동 <br />
  56. 56. Algorithm C (참조 점검)<br />C1. [초기화] <br />C2. [기본항목인가?] <br />C3. [이름 부합] <br />C4. [계속 진행] <br />C5. [끝인가?]<br />
  57. 57. 이렇게 구축한 자료표에는<br />중복된 정보가 많다.<br />일부를 삭제하면 어떨까?<br />PREV 링크 삭제<br />-검색의 효율이 중요한 COBOL 에서는 필수!<br />PARENT 링크 삭제<br /> -SIB 를 확장해서 스레드 링크를 포함시킨다면<br />삭제해도 될듯 ( TAG )<br />NAME 링크 삭제<br /> -적합여부판단하는이름비교시다른방법이 필요함<br />결론적으로 5개 링크들 모두 필수는 아니다<br />그러나 알고리즘 속도면으로 보면 확실히 유용하다<br />
  58. 58. 감사합니다<br />

×