SlideShare ist ein Scribd-Unternehmen logo
1 von 48
Downloaden Sie, um offline zu lesen
[ The Art of Computer Programming ] 2.2.6 배열과 직교 목록연습문제 풀이 아.꿈.사 Study 2011. 04. 30 김한솔 itsfitsol@gmail.com
풀이할 연습문제 2. [21] 6. [M24] 9. [22] 12. [20] 13. [22] 15. [29] 24. [25]
풀이할 연습문제 2. [21] 6. [M24] 9. [22] 12. [20] 13. [22] 15. [29] 24. [25] 커누스 할아버지가중요 하다고 한 문제
풀이할 연습문제 2. [21] 6. [M24] 9. [22] 12. [20] 13. [22] 15. [29] 24. [25] 재미 있을것 같아서 건드렸다가  후회 한 문제
2. [21] 공식 (5)와 (6)은 1 ≤ r ≤ k 에 대해 0 ≤ I r ≤ d r이라는  가정하에서 유도한 것이다. l r과 u r이 해당 차원의 하계, 상계라고 할 때, l r≤ I r ≤ u r 인 경우에 적용되는 일반적인 공식을 제시하라.
공식(5), (6) 을 이용해서 I r 위치에서하계인 l r위치를  빼주면 되지 않을까?
공식(5), (6) 을 이용해서 I r 위치에서하계인 l r위치를  빼주면 되지 않을까? 즉, 공식(5), (6) 에서 LOC(A[I1, I2, … , Ik])- LOC(A[l1, l2, … , lk]) … LOC(A[0, 0, … , 0]) LOC(A[l1, l2, … , lk]) LOC(A[I1, I2, … , Ik]) LOC(A[u1, u2, … , uk]) …
2. [21] 공식 (5)와 (6)은 1 ≤ r ≤ k에 대해 0 ≤ I r ≤ d r 이라는  가정하에서 유도한 것이다. l r과 u r이 해당 차원의 하계, 상계라고 할 때, l r≤ I r ≤ u r인 경우에 적용되는 일반적인 공식을 제시하라. LOC(A[I1, I2, … , Ik]) = LOC(A[0, 0, … , 0]) + - LOC(A[l1, l2, … , lk]) = LOC(A[0, 0, … , 0]) + LOC(A[I1, I2, … , Ik]) - LOC(A[l1, l2, … , lk])  =                   -   ∴  LOC(A[I1, I2, … , Ik]) = LOC(A[l1, l2, … , lk]) +                   -   여기서,
6. [M24] “4면체 배열” A[i, j, k]와 B[i, j, k]가 있다. A의 경우 에는 0 ≤ k ≤ j ≤ i≤ n 이고 B 경우에는 0 ≤i≤ j ≤ k ≤ n 이다. 두 배열 모두 색인의 사전식 순서에 따라 연속적인 메모리 장소에 저장되어 있다고 가정한다. 이 때, 어떠한 함수 f1, f2, f3에 대해 LOC(A[i, j, k])=a0+f1(I)+f2(J)+f3(K)임을 보여라. LOC(B[i, j, k]) 도 그와 비슷한 방식으로 표현할 수 있을까?
6. [M24] “4면체 배열” A[i, j, k]와 B[i, j, k]가 있다. A의 경우 에는 0 ≤ k ≤ j ≤ i≤ n 이고 B 경우에는 0 ≤i≤ j ≤ k ≤ n 이다. 두 배열 모두 색인의 사전식 순서에 따라 연속적인 메모리 장소에 저장되어 있다고 가정한다. 이 때, 어떠한 함수 f1, f2, f3에 대해 LOC(A[i, j, k])=a0+f1(I)+f2(J)+f3(K)임을 보여라. LOC(B[i, j, k]) 도 그와 비슷한 방식으로 표현할 수 있을까? 풀이) (a) LOC(A[I, J, K]) = LOC(A[0, 0, 0]) + (b) LOC(B[I, J, K]) = LOC(B[0, 0, 0])
6. [M24] “4면체 배열” A[i, j, k]와 B[i, j, k]가 있다. A의 경우 에는 0 ≤ k ≤ j ≤ i≤ n 이고 B 경우에는 0 ≤i≤ j ≤ k ≤ n 이다. 두 배열 모두 색인의 사전식 순서에 따라 연속적인 메모리 장소에 저장되어 있다고 가정한다. 이 때, 어떠한 함수 f1, f2, f3에 대해 LOC(A[i, j, k])=a0+f1(I)+f2(J)+f3(K)임을 보여라. LOC(B[i, j, k]) 도 그와 비슷한 방식으로 표현할 수 있을까? GG 우리..함께해요…!! 풀이) (a) LOC(A[I, J, K]) = LOC(A[0, 0, 0]) + (b) LOC(A[I, J, K]) = LOC(A[0, 0, 0])
9. [22] 그림 13에 나온 것과 비슷하지만 그보다는 훨씬 큰 어떤 표가 있으며, 그것의 모든 링크들이 그 그림에 나온 것과 같은 방향으로 설정되어 있다고 하자. (즉, 모든 노드 들과 링크들에서 LINK(X) < X 이다.) 여러 링크 필드들을  훑으면서 21세에서 23세 사이의 파란 눈 금발 여성을 모두 찾는 알고리즘을 설계하라. 단, 목록 FEMALE, A21, A22, A23, BLOND, BLUE 각각을 최대 한 번만 훑어서 모든 답을 찾아야 한다.
BROWN FEMALE BLOND GREEN HAZEL MALE DARK BLUE RED A21 A24 A23 A28 A22 PERSON[6] P1 P2 PERSON[5] G1. P1←FEMALE(HEAD)      P2←A21(HEAD)      P3←A22(HEAD)      P4←A23(HEAD)      P5←BLUE(HEAD)      P6←BLOND(HEAD) goto G2 PERSON[4] P3 P6 PERSON[3] PERSON[2] P5 PERSON[1] P4 =NULL
BROWN FEMALE BLOND GREEN HAZEL MALE DARK BLUE RED A21 A24 A23 A28 A22 PERSON[6] P1 P2 PERSON[5] G2. while ( P5 >P6 ) 	P5←EYES(P5)      if P5 < P6 then goto G5      else if P5 == P6 then goto G3     PERSON[4] P3 P6 PERSON[3] PERSON[2] P5 PERSON[1] P4 =NULL
BROWN FEMALE BLOND GREEN HAZEL MALE DARK BLUE RED A21 A24 A23 A28 A22 PERSON[6] P1 P2 PERSON[5] G5. P6←HAIR(P6)      if P6 == ∧ then 	return FALSE      else goto G2 PERSON[4] P3 PERSON[3] P6 PERSON[2] P5 PERSON[1] P4 =NULL
BROWN FEMALE BLOND GREEN HAZEL MALE DARK BLUE RED A21 A24 A23 A28 A22 PERSON[6] P1 P2 PERSON[5] G2. while ( P5 >P6 ) 	P5←EYES(P5)      if P5 < P6 then goto G5      else if P5 == P6 then goto G3     PERSON[4] P3 PERSON[3] P6 PERSON[2] P5 PERSON[1] P4 =NULL
BROWN FEMALE BLOND GREEN HAZEL MALE DARK BLUE RED A21 A24 A23 A28 A22 PERSON[6] P1 P2 PERSON[5] G5. P6←HAIR(P6)      if P6 == ∧ then 	return FALSE      else goto G2 PERSON[4] P3 PERSON[3] PERSON[2] P5 PERSON[1] P6 P4 =NULL
BROWN FEMALE BLOND GREEN HAZEL MALE DARK BLUE RED A21 A24 A23 A28 A22 PERSON[6] P1 P2 PERSON[5] G2. while ( P5 >P6 ) P5←EYES(P5)      if P5 < P6 then goto G5      else if P5 == P6 then goto G3 PERSON[4] P3 PERSON[3] PERSON[2] PERSON[1] P5 P6 P4 =NULL
BROWN FEMALE BLOND GREEN HAZEL MALE DARK BLUE RED A21 A24 A23 A28 A22 PERSON[6] P1 P2 G3. while ( P4 > P6 ) 	P4←A23(P4)      while ( P3 > P6 ) P3←A22(P3)      while ( P2 > P6 ) 	P2←A21(P2)      if P4 < P6 && P3 < P6      && P2 < P6 then goto G5      else  goto G4 PERSON[5] PERSON[4] PERSON[3] PERSON[2] P3 PERSON[1] P5 P6 P4 =NULL
BROWN FEMALE BLOND GREEN HAZEL MALE DARK BLUE RED A21 A24 A23 A28 A22 PERSON[6] P1 P2 G3. while ( P4 > P6 ) 	P4←A23(P4)      while ( P3 > P6 ) P3←A22(P3)      while ( P2 > P6 ) 	P2←A21(P2)      if P4 < P6 && P3 < P6      && P2 < P6 then goto G5      else  goto G4 PERSON[5] PERSON[4] PERSON[3] PERSON[2] PERSON[1] P5 P6     P3   P4     =NULL
BROWN FEMALE BLOND GREEN HAZEL MALE DARK BLUE RED A21 A24 A23 A28 A22 PERSON[6] P1 G3. while ( P4 > P6 ) 	P4←A23(P4)      while ( P3 > P6 ) 	P3←A22(P3)      while ( P2 > P6 ) P2←A21(P2)      if P4 < P6 && P3 < P6      && P2 < P6 then goto G5      else  goto G4 PERSON[5] PERSON[4] PERSON[3] PERSON[2] PERSON[1] P2 P5 P6     P3   P4     =NULL
BROWN FEMALE BLOND GREEN HAZEL MALE DARK BLUE RED A21 A24 A23 A28 A22 PERSON[6] PERSON[5] G4. while ( P1 > P6 ) P1←SEX(P1)      if P1 == P6 then 	print *P6 	return TRUE PERSON[4] P1 PERSON[3] PERSON[2] PERSON[1] P2 P5 P6     P3   P4     =NULL
BROWN FEMALE BLOND GREEN HAZEL MALE DARK BLUE RED A21 A24 A23 A28 A22 PERSON[6] PERSON[5] G4. while ( P1 > P6 ) P1←SEX(P1)      if P1 == P6 then 	print *P6 	return TRUE PERSON[4] PERSON[3] PERSON[2] P1 PERSON[1] P2 P5 P6     P3   P4     =NULL
BROWN FEMALE BLOND GREEN HAZEL MALE DARK BLUE RED A21 A24 A23 A28 A22 PERSON[6] PERSON[5] G4. while ( P1 > P6 ) P1←SEX(P1)      if P1 == P6 then print *P6 	return TRUE PERSON[4] PERSON[3] PERSON[2] PERSON[1] P2 P5 P6 P1     P3   P4     =NULL
결국 P6 기준으로 모든 포인터가 같을 때값을 반환 이 알고리즘은 최적화 방법은 아니다. 모든 노드를 선형 탐색을 하기 때문에…? 최적화 방법은 TAOCP 3권 6.5절 2차키에 의한 조회 참고.
12. [20] 단계 S7의 시작에서 VAL(Q0), VAL(P0), VAL(P1) 값들을 (13)에 쓰인 a, b, c 로 표현하라.
12. [20] 단계 S7의 시작에서 VAL(Q0), VAL(P0), VAL(P1) 값들을 (13)에 쓰인 a, b, c 로 표현하라. VAL(Q0) = c VAL(P0) = b/a VAL(P1) = d 알고리즘 비교해보시면 간단하게 알 수 있습니다.
13. [22] 그림 14에서 직선적인 선형 목록 대신 순환 목록을 사용한 이유는 무엇일까? 순환 연결을 사용하지 않도록 알고리즘 S를 재작성하는 게 가능할까?
13. [22] 그림 14에서 직선적인 선형 목록 대신 순환 목록을 사용한 이유는 무엇일까? 순환 연결을 사용하지 않도록 알고리즘 S를 재작성하는 게 가능할까? 순환 목록 사용 이유 “경계값” (Tail Node) 를 설정. Tail Node 의 링크(리스트의 처음) 시작. => 편리하게 Tail Node 검사 가능 Ex) 그림 14 에서 Tail Node 의 row,col필드의 값은 모두 -1 알고리즘S 에서 행, 열 리스트의 마지막 검사는  ROW(I) < 0 또는 COL(J) < 0
13. [22] 그림 14에서 직선적인 선형 목록 대신 순환 목록을 사용한 이유는 무엇일까? 순환 연결을 사용하지 않도록 알고리즘 S를 재작성하는 게 가능할까? 알고리즘S 재작성 가능여부 단방향 리스트를 사용할 수는 있지만 알고리즘이 더욱 복잡해지며 메모리를 절약할 수도 없다. 비효율적
15. [29] 알고리즘 S를 위한 MIXAL 프로그램을 작성하라. VAL 필드는 부동소수점이고, 그 필드들의 연산을 위해 MIX의 부동소수점 산술 연산자 FADD, FSUB, FMUL, FDIV를 사용할 수 있다고 가정할 것. 단순함을 위해, 피연산자들의 덧셈 또는 뺄셈에 의해 대부분의 유효숫자들이 취소된다면 FADD나 FSUB가 0을 돌려준다고 가정한다. 즉, 단계 S7의 “VAL(P1)=0” 판정을 그대로 사용해도 안전하다고 가정하는 것이다. 부동소수점 연산들은 rA만 사용한다(rX는 사용하지 않는다).
24. [25] (희소 배열 요령.) 커다란 배열을 임의 접근으로 사용해야 하지만, 그 행렬의 아주 많은 성분들을 실제로 참조하지 않을 것이라고 가정하자. 임의의 성분 A[k]에 처음 접근했을 때 그것을 0으로 설정하되, 모든 장소들을 미리 0으로 초기화 하는데 시간을 소비하지는 않고자 한다. 임의의 k가 주어졌을 때, 실제 초기 메모리 내용들에 대해 어떠한 것도 가정하지 않고, 배열 접근 당 오직 고정된 적은 수의 추가적인 연산들만 사용해서 해당 성분 A[k]를 신뢰성 있게 읽고 쓰는 것이 어떻게 가능할지 설명하라.
질문이 너무 길다. 무슨 소리지………?
24. [25] (희소 배열 요령.) 커다란 배열을 임의 접근으로 사용해야 하지만, 그 행렬의 아주 많은 성분들을 실제로 참조하지 않을 것이라고 가정하자. 임의의 성분 A[k]에 처음 접근했을 때 그것을 0으로 설정하되, 모든 장소들을 미리 0으로 초기화 하는데 시간을 소비하지는 않고자 한다. 임의의 k가 주어졌을 때, 실제 초기 메모리 내용들에 대해 어떠한 것도 가정하지 않고, 배열 접근 당 오직 고정된 적은 수의 추가적인 연산들만 사용해서 해당 성분 A[k]를 신뢰성 있게 읽고 쓰는 것이 어떻게 가능할지 설명하라. 이것은 희소 배열이다.
24. [25] (희소 배열 요령.) 커다란 배열을 임의 접근으로 사용해야 하지만, 그 행렬의 아주 많은 성분들을 실제로 참조하지 않을 것이라고 가정하자. 임의의 성분 A[k]에 처음 접근했을 때 그것을 0으로 설정하되, 모든 장소들을 미리 0으로 초기화 하는데 시간을 소비하지는 않고자 한다. 임의의 k가 주어졌을 때, 실제 초기 메모리 내용들에 대해 어떠한 것도 가정하지 않고, 배열 접근 당 오직 고정된 적은 수의 추가적인 연산들만 사용해서 해당 성분 A[k]를 신뢰성 있게 읽고 쓰는 것이 어떻게 가능할지 설명하라. A[k]에 처음 접근하면  0으로 초기화하고
24. [25] (희소 배열 요령.) 커다란 배열을 임의 접근으로 사용해야 하지만, 그 행렬의 아주 많은 성분들을 실제로 참조하지 않을 것이라고 가정하자. 임의의 성분 A[k]에 처음 접근했을 때 그것을 0으로 설정하되,모든 장소들을 미리 0으로 초기화 하는데 시간을 소비하지는 않고자 한다. 임의의 k가 주어졌을 때, 실제 초기 메모리 내용들에 대해 어떠한 것도 가정하지 않고, 배열 접근 당 오직 고정된 적은 수의 추가적인 연산들만 사용해서 해당 성분 A[k]를 신뢰성 있게 읽고 쓰는 것이 어떻게 가능할지 설명하라. 시간은 상관 X
24. [25] (희소 배열 요령.) 커다란 배열을 임의 접근으로 사용해야 하지만, 그 행렬의 아주 많은 성분들을 실제로 참조하지 않을 것이라고 가정하자. 임의의 성분 A[k]에 처음 접근했을 때 그것을 0으로 설정하되, 모든 장소들을 미리 0으로 초기화 하는데 시간을 소비하지는 않고자 한다. 임의의 k가 주어졌을 때, 실제 초기 메모리 내용들에 대해 어떠한 것도 가정하지 않고,배열 접근 당 오직 고정된 적은 수의 추가적인 연산들만 사용해서 해당 성분 A[k]를 신뢰성 있게 읽고 쓰는 것이 어떻게 가능할지 설명하라. A[k]미리 초기화 X 쓰레기 일수도 있다.
24. [25] (희소 배열 요령.) 커다란 배열을 임의 접근으로 사용해야 하지만, 그 행렬의 아주 많은 성분들을 실제로 참조하지 않을 것이라고 가정하자. 임의의 성분 A[k]에 처음 접근했을 때 그것을 0으로 설정하되, 모든 장소들을 미리 0으로 초기화 하는데 시간을 소비하지는 않고자 한다. 임의의 k가 주어졌을 때, 실제 초기 메모리 내용들에 대해 어떠한 것도 가정하지 않고, 배열 접근 당 오직 고정된 적은 수의 추가적인 연산들만 사용해서 해당 성분 A[k]를 신뢰성 있게 읽고 쓰는 것이 어떻게 가능할지 설명하라. A[k]값이 유효할 수 있는 방법을 설명하시오.
임의의 희소 배열 A알수 없는 값 같은 크기의 검증용 배열 V알수없는 값 사용된 장소들의 목록L알수없는 값 목록 L 의 요소 개수n	0 임의의 값 k에 대해 A[k]접근시 if 0 ≤ V[k] ≤ n && L[V[k]] == k then 	return TRUE else V[k] ← n L[n]← k A[k]← 0 n ← n+1 return FALSE
 k1 …                                        … A …                                        … V … L n             0  임의의 값 k1에 대해 A[k1]접근시 if 0 ≤ V[k1] ≤ n && L[V[k1]] == k1then 	return TRUE else V[k1] ← n L[n]← k1 A[k1] ← 0 n ← n+1 return FALSE
 k1 …                                        … A 0 …                                        … V 0 … L k1 n             1 임의의 값 k1에 대해 A[k1]접근시 if 0 ≤ V[k1] ≤ n && L[V[k1]] == k1then 	return TRUE else V[k1] ← n L[n]← k1 A[k1] ← 0 n ← n+1 return FALSE
 k1  k2 …                                        … A 0 …                                        … V 0 … L k1 n             1  임의의 값 k2에 대해 A[k2]접근시 if 0 ≤ V[k2] ≤ n&& L[V[k2]] == k2then 	return TRUE else V[k2] ← n L[n]← k2 A[k2] ← 0 n ← n+1 return FALSE
 k1  k2 …                                        … A 0 0 …                                        … V 0 1 … L k1 k2 n             2 임의의 값 k2에 대해 A[k2]접근시 if 0 ≤ V[k2] ≤ n && L[V[k2]] == k2then 	return TRUE else V[k2] ← n L[n]← k2 A[k2] ← 0 n ← n+1 return FALSE
k1  k2 …                                        … A 0 0 …                                        … V 0 1 … L k1 k2 n             2  임의의 값 k1에 대해 A[k1]접근시 if 0 ≤ V[k1] ≤ n&& L[V[k1]] == k1then 	return TRUE else V[k1] ← n L[n]← k2 A[k1] ← 0 n ← n+1 return FALSE
k1  k2 …                                        … A 0 0 …                                        … V 0 1 … L k1 k2 n             2  임의의 값 k1에 대해 A[k1]접근시 if 0 ≤ V[k1] ≤ n && L[V[k1]] == k1then return TRUE else V[k1] ← n L[n]← k2 A[k1] ← 0 n ← n+1 return FALSE
 k1  k2 …                                        … A 0 0 …                                        … V 0 1 … L k1 k2 n             2  임의의 값 k2에 대해 A[k2]접근시 if 0 ≤ V[k2] ≤ n&& L[V[k2]] == k2then 	return TRUE else V[k2] ← n L[n]← k2 A[k2] ← 0 n ← n+1 return FALSE
 k1  k2 …                                        … A 0 0 …                                        … V 0 1 … L k1 k2 n             2  임의의 값 k2에 대해 A[k2]접근시 if 0 ≤ V[k2] ≤ n && L[V[k2]] == k2then return TRUE else V[k2] ← n L[n]← k2 A[k2] ← 0 n ← n+1 return FALSE
끝

Weitere ähnliche Inhalte

TAOCP 2.2.6

  • 1. [ The Art of Computer Programming ] 2.2.6 배열과 직교 목록연습문제 풀이 아.꿈.사 Study 2011. 04. 30 김한솔 itsfitsol@gmail.com
  • 2. 풀이할 연습문제 2. [21] 6. [M24] 9. [22] 12. [20] 13. [22] 15. [29] 24. [25]
  • 3. 풀이할 연습문제 2. [21] 6. [M24] 9. [22] 12. [20] 13. [22] 15. [29] 24. [25] 커누스 할아버지가중요 하다고 한 문제
  • 4. 풀이할 연습문제 2. [21] 6. [M24] 9. [22] 12. [20] 13. [22] 15. [29] 24. [25] 재미 있을것 같아서 건드렸다가 후회 한 문제
  • 5. 2. [21] 공식 (5)와 (6)은 1 ≤ r ≤ k 에 대해 0 ≤ I r ≤ d r이라는 가정하에서 유도한 것이다. l r과 u r이 해당 차원의 하계, 상계라고 할 때, l r≤ I r ≤ u r 인 경우에 적용되는 일반적인 공식을 제시하라.
  • 6. 공식(5), (6) 을 이용해서 I r 위치에서하계인 l r위치를 빼주면 되지 않을까?
  • 7. 공식(5), (6) 을 이용해서 I r 위치에서하계인 l r위치를 빼주면 되지 않을까? 즉, 공식(5), (6) 에서 LOC(A[I1, I2, … , Ik])- LOC(A[l1, l2, … , lk]) … LOC(A[0, 0, … , 0]) LOC(A[l1, l2, … , lk]) LOC(A[I1, I2, … , Ik]) LOC(A[u1, u2, … , uk]) …
  • 8. 2. [21] 공식 (5)와 (6)은 1 ≤ r ≤ k에 대해 0 ≤ I r ≤ d r 이라는 가정하에서 유도한 것이다. l r과 u r이 해당 차원의 하계, 상계라고 할 때, l r≤ I r ≤ u r인 경우에 적용되는 일반적인 공식을 제시하라. LOC(A[I1, I2, … , Ik]) = LOC(A[0, 0, … , 0]) + - LOC(A[l1, l2, … , lk]) = LOC(A[0, 0, … , 0]) + LOC(A[I1, I2, … , Ik]) - LOC(A[l1, l2, … , lk]) = - ∴ LOC(A[I1, I2, … , Ik]) = LOC(A[l1, l2, … , lk]) + - 여기서,
  • 9. 6. [M24] “4면체 배열” A[i, j, k]와 B[i, j, k]가 있다. A의 경우 에는 0 ≤ k ≤ j ≤ i≤ n 이고 B 경우에는 0 ≤i≤ j ≤ k ≤ n 이다. 두 배열 모두 색인의 사전식 순서에 따라 연속적인 메모리 장소에 저장되어 있다고 가정한다. 이 때, 어떠한 함수 f1, f2, f3에 대해 LOC(A[i, j, k])=a0+f1(I)+f2(J)+f3(K)임을 보여라. LOC(B[i, j, k]) 도 그와 비슷한 방식으로 표현할 수 있을까?
  • 10. 6. [M24] “4면체 배열” A[i, j, k]와 B[i, j, k]가 있다. A의 경우 에는 0 ≤ k ≤ j ≤ i≤ n 이고 B 경우에는 0 ≤i≤ j ≤ k ≤ n 이다. 두 배열 모두 색인의 사전식 순서에 따라 연속적인 메모리 장소에 저장되어 있다고 가정한다. 이 때, 어떠한 함수 f1, f2, f3에 대해 LOC(A[i, j, k])=a0+f1(I)+f2(J)+f3(K)임을 보여라. LOC(B[i, j, k]) 도 그와 비슷한 방식으로 표현할 수 있을까? 풀이) (a) LOC(A[I, J, K]) = LOC(A[0, 0, 0]) + (b) LOC(B[I, J, K]) = LOC(B[0, 0, 0])
  • 11. 6. [M24] “4면체 배열” A[i, j, k]와 B[i, j, k]가 있다. A의 경우 에는 0 ≤ k ≤ j ≤ i≤ n 이고 B 경우에는 0 ≤i≤ j ≤ k ≤ n 이다. 두 배열 모두 색인의 사전식 순서에 따라 연속적인 메모리 장소에 저장되어 있다고 가정한다. 이 때, 어떠한 함수 f1, f2, f3에 대해 LOC(A[i, j, k])=a0+f1(I)+f2(J)+f3(K)임을 보여라. LOC(B[i, j, k]) 도 그와 비슷한 방식으로 표현할 수 있을까? GG 우리..함께해요…!! 풀이) (a) LOC(A[I, J, K]) = LOC(A[0, 0, 0]) + (b) LOC(A[I, J, K]) = LOC(A[0, 0, 0])
  • 12. 9. [22] 그림 13에 나온 것과 비슷하지만 그보다는 훨씬 큰 어떤 표가 있으며, 그것의 모든 링크들이 그 그림에 나온 것과 같은 방향으로 설정되어 있다고 하자. (즉, 모든 노드 들과 링크들에서 LINK(X) < X 이다.) 여러 링크 필드들을 훑으면서 21세에서 23세 사이의 파란 눈 금발 여성을 모두 찾는 알고리즘을 설계하라. 단, 목록 FEMALE, A21, A22, A23, BLOND, BLUE 각각을 최대 한 번만 훑어서 모든 답을 찾아야 한다.
  • 13. BROWN FEMALE BLOND GREEN HAZEL MALE DARK BLUE RED A21 A24 A23 A28 A22 PERSON[6] P1 P2 PERSON[5] G1. P1←FEMALE(HEAD) P2←A21(HEAD) P3←A22(HEAD) P4←A23(HEAD) P5←BLUE(HEAD) P6←BLOND(HEAD) goto G2 PERSON[4] P3 P6 PERSON[3] PERSON[2] P5 PERSON[1] P4 =NULL
  • 14. BROWN FEMALE BLOND GREEN HAZEL MALE DARK BLUE RED A21 A24 A23 A28 A22 PERSON[6] P1 P2 PERSON[5] G2. while ( P5 >P6 ) P5←EYES(P5) if P5 < P6 then goto G5 else if P5 == P6 then goto G3 PERSON[4] P3 P6 PERSON[3] PERSON[2] P5 PERSON[1] P4 =NULL
  • 15. BROWN FEMALE BLOND GREEN HAZEL MALE DARK BLUE RED A21 A24 A23 A28 A22 PERSON[6] P1 P2 PERSON[5] G5. P6←HAIR(P6) if P6 == ∧ then return FALSE else goto G2 PERSON[4] P3 PERSON[3] P6 PERSON[2] P5 PERSON[1] P4 =NULL
  • 16. BROWN FEMALE BLOND GREEN HAZEL MALE DARK BLUE RED A21 A24 A23 A28 A22 PERSON[6] P1 P2 PERSON[5] G2. while ( P5 >P6 ) P5←EYES(P5) if P5 < P6 then goto G5 else if P5 == P6 then goto G3 PERSON[4] P3 PERSON[3] P6 PERSON[2] P5 PERSON[1] P4 =NULL
  • 17. BROWN FEMALE BLOND GREEN HAZEL MALE DARK BLUE RED A21 A24 A23 A28 A22 PERSON[6] P1 P2 PERSON[5] G5. P6←HAIR(P6) if P6 == ∧ then return FALSE else goto G2 PERSON[4] P3 PERSON[3] PERSON[2] P5 PERSON[1] P6 P4 =NULL
  • 18. BROWN FEMALE BLOND GREEN HAZEL MALE DARK BLUE RED A21 A24 A23 A28 A22 PERSON[6] P1 P2 PERSON[5] G2. while ( P5 >P6 ) P5←EYES(P5) if P5 < P6 then goto G5 else if P5 == P6 then goto G3 PERSON[4] P3 PERSON[3] PERSON[2] PERSON[1] P5 P6 P4 =NULL
  • 19. BROWN FEMALE BLOND GREEN HAZEL MALE DARK BLUE RED A21 A24 A23 A28 A22 PERSON[6] P1 P2 G3. while ( P4 > P6 ) P4←A23(P4) while ( P3 > P6 ) P3←A22(P3) while ( P2 > P6 ) P2←A21(P2) if P4 < P6 && P3 < P6 && P2 < P6 then goto G5 else goto G4 PERSON[5] PERSON[4] PERSON[3] PERSON[2] P3 PERSON[1] P5 P6 P4 =NULL
  • 20. BROWN FEMALE BLOND GREEN HAZEL MALE DARK BLUE RED A21 A24 A23 A28 A22 PERSON[6] P1 P2 G3. while ( P4 > P6 ) P4←A23(P4) while ( P3 > P6 ) P3←A22(P3) while ( P2 > P6 ) P2←A21(P2) if P4 < P6 && P3 < P6 && P2 < P6 then goto G5 else goto G4 PERSON[5] PERSON[4] PERSON[3] PERSON[2] PERSON[1] P5 P6 P3 P4 =NULL
  • 21. BROWN FEMALE BLOND GREEN HAZEL MALE DARK BLUE RED A21 A24 A23 A28 A22 PERSON[6] P1 G3. while ( P4 > P6 ) P4←A23(P4) while ( P3 > P6 ) P3←A22(P3) while ( P2 > P6 ) P2←A21(P2) if P4 < P6 && P3 < P6 && P2 < P6 then goto G5 else goto G4 PERSON[5] PERSON[4] PERSON[3] PERSON[2] PERSON[1] P2 P5 P6 P3 P4 =NULL
  • 22. BROWN FEMALE BLOND GREEN HAZEL MALE DARK BLUE RED A21 A24 A23 A28 A22 PERSON[6] PERSON[5] G4. while ( P1 > P6 ) P1←SEX(P1) if P1 == P6 then print *P6 return TRUE PERSON[4] P1 PERSON[3] PERSON[2] PERSON[1] P2 P5 P6 P3 P4 =NULL
  • 23. BROWN FEMALE BLOND GREEN HAZEL MALE DARK BLUE RED A21 A24 A23 A28 A22 PERSON[6] PERSON[5] G4. while ( P1 > P6 ) P1←SEX(P1) if P1 == P6 then print *P6 return TRUE PERSON[4] PERSON[3] PERSON[2] P1 PERSON[1] P2 P5 P6 P3 P4 =NULL
  • 24. BROWN FEMALE BLOND GREEN HAZEL MALE DARK BLUE RED A21 A24 A23 A28 A22 PERSON[6] PERSON[5] G4. while ( P1 > P6 ) P1←SEX(P1) if P1 == P6 then print *P6 return TRUE PERSON[4] PERSON[3] PERSON[2] PERSON[1] P2 P5 P6 P1 P3 P4 =NULL
  • 25. 결국 P6 기준으로 모든 포인터가 같을 때값을 반환 이 알고리즘은 최적화 방법은 아니다. 모든 노드를 선형 탐색을 하기 때문에…? 최적화 방법은 TAOCP 3권 6.5절 2차키에 의한 조회 참고.
  • 26. 12. [20] 단계 S7의 시작에서 VAL(Q0), VAL(P0), VAL(P1) 값들을 (13)에 쓰인 a, b, c 로 표현하라.
  • 27. 12. [20] 단계 S7의 시작에서 VAL(Q0), VAL(P0), VAL(P1) 값들을 (13)에 쓰인 a, b, c 로 표현하라. VAL(Q0) = c VAL(P0) = b/a VAL(P1) = d 알고리즘 비교해보시면 간단하게 알 수 있습니다.
  • 28. 13. [22] 그림 14에서 직선적인 선형 목록 대신 순환 목록을 사용한 이유는 무엇일까? 순환 연결을 사용하지 않도록 알고리즘 S를 재작성하는 게 가능할까?
  • 29. 13. [22] 그림 14에서 직선적인 선형 목록 대신 순환 목록을 사용한 이유는 무엇일까? 순환 연결을 사용하지 않도록 알고리즘 S를 재작성하는 게 가능할까? 순환 목록 사용 이유 “경계값” (Tail Node) 를 설정. Tail Node 의 링크(리스트의 처음) 시작. => 편리하게 Tail Node 검사 가능 Ex) 그림 14 에서 Tail Node 의 row,col필드의 값은 모두 -1 알고리즘S 에서 행, 열 리스트의 마지막 검사는 ROW(I) < 0 또는 COL(J) < 0
  • 30. 13. [22] 그림 14에서 직선적인 선형 목록 대신 순환 목록을 사용한 이유는 무엇일까? 순환 연결을 사용하지 않도록 알고리즘 S를 재작성하는 게 가능할까? 알고리즘S 재작성 가능여부 단방향 리스트를 사용할 수는 있지만 알고리즘이 더욱 복잡해지며 메모리를 절약할 수도 없다. 비효율적
  • 31. 15. [29] 알고리즘 S를 위한 MIXAL 프로그램을 작성하라. VAL 필드는 부동소수점이고, 그 필드들의 연산을 위해 MIX의 부동소수점 산술 연산자 FADD, FSUB, FMUL, FDIV를 사용할 수 있다고 가정할 것. 단순함을 위해, 피연산자들의 덧셈 또는 뺄셈에 의해 대부분의 유효숫자들이 취소된다면 FADD나 FSUB가 0을 돌려준다고 가정한다. 즉, 단계 S7의 “VAL(P1)=0” 판정을 그대로 사용해도 안전하다고 가정하는 것이다. 부동소수점 연산들은 rA만 사용한다(rX는 사용하지 않는다).
  • 32. 24. [25] (희소 배열 요령.) 커다란 배열을 임의 접근으로 사용해야 하지만, 그 행렬의 아주 많은 성분들을 실제로 참조하지 않을 것이라고 가정하자. 임의의 성분 A[k]에 처음 접근했을 때 그것을 0으로 설정하되, 모든 장소들을 미리 0으로 초기화 하는데 시간을 소비하지는 않고자 한다. 임의의 k가 주어졌을 때, 실제 초기 메모리 내용들에 대해 어떠한 것도 가정하지 않고, 배열 접근 당 오직 고정된 적은 수의 추가적인 연산들만 사용해서 해당 성분 A[k]를 신뢰성 있게 읽고 쓰는 것이 어떻게 가능할지 설명하라.
  • 33. 질문이 너무 길다. 무슨 소리지………?
  • 34. 24. [25] (희소 배열 요령.) 커다란 배열을 임의 접근으로 사용해야 하지만, 그 행렬의 아주 많은 성분들을 실제로 참조하지 않을 것이라고 가정하자. 임의의 성분 A[k]에 처음 접근했을 때 그것을 0으로 설정하되, 모든 장소들을 미리 0으로 초기화 하는데 시간을 소비하지는 않고자 한다. 임의의 k가 주어졌을 때, 실제 초기 메모리 내용들에 대해 어떠한 것도 가정하지 않고, 배열 접근 당 오직 고정된 적은 수의 추가적인 연산들만 사용해서 해당 성분 A[k]를 신뢰성 있게 읽고 쓰는 것이 어떻게 가능할지 설명하라. 이것은 희소 배열이다.
  • 35. 24. [25] (희소 배열 요령.) 커다란 배열을 임의 접근으로 사용해야 하지만, 그 행렬의 아주 많은 성분들을 실제로 참조하지 않을 것이라고 가정하자. 임의의 성분 A[k]에 처음 접근했을 때 그것을 0으로 설정하되, 모든 장소들을 미리 0으로 초기화 하는데 시간을 소비하지는 않고자 한다. 임의의 k가 주어졌을 때, 실제 초기 메모리 내용들에 대해 어떠한 것도 가정하지 않고, 배열 접근 당 오직 고정된 적은 수의 추가적인 연산들만 사용해서 해당 성분 A[k]를 신뢰성 있게 읽고 쓰는 것이 어떻게 가능할지 설명하라. A[k]에 처음 접근하면 0으로 초기화하고
  • 36. 24. [25] (희소 배열 요령.) 커다란 배열을 임의 접근으로 사용해야 하지만, 그 행렬의 아주 많은 성분들을 실제로 참조하지 않을 것이라고 가정하자. 임의의 성분 A[k]에 처음 접근했을 때 그것을 0으로 설정하되,모든 장소들을 미리 0으로 초기화 하는데 시간을 소비하지는 않고자 한다. 임의의 k가 주어졌을 때, 실제 초기 메모리 내용들에 대해 어떠한 것도 가정하지 않고, 배열 접근 당 오직 고정된 적은 수의 추가적인 연산들만 사용해서 해당 성분 A[k]를 신뢰성 있게 읽고 쓰는 것이 어떻게 가능할지 설명하라. 시간은 상관 X
  • 37. 24. [25] (희소 배열 요령.) 커다란 배열을 임의 접근으로 사용해야 하지만, 그 행렬의 아주 많은 성분들을 실제로 참조하지 않을 것이라고 가정하자. 임의의 성분 A[k]에 처음 접근했을 때 그것을 0으로 설정하되, 모든 장소들을 미리 0으로 초기화 하는데 시간을 소비하지는 않고자 한다. 임의의 k가 주어졌을 때, 실제 초기 메모리 내용들에 대해 어떠한 것도 가정하지 않고,배열 접근 당 오직 고정된 적은 수의 추가적인 연산들만 사용해서 해당 성분 A[k]를 신뢰성 있게 읽고 쓰는 것이 어떻게 가능할지 설명하라. A[k]미리 초기화 X 쓰레기 일수도 있다.
  • 38. 24. [25] (희소 배열 요령.) 커다란 배열을 임의 접근으로 사용해야 하지만, 그 행렬의 아주 많은 성분들을 실제로 참조하지 않을 것이라고 가정하자. 임의의 성분 A[k]에 처음 접근했을 때 그것을 0으로 설정하되, 모든 장소들을 미리 0으로 초기화 하는데 시간을 소비하지는 않고자 한다. 임의의 k가 주어졌을 때, 실제 초기 메모리 내용들에 대해 어떠한 것도 가정하지 않고, 배열 접근 당 오직 고정된 적은 수의 추가적인 연산들만 사용해서 해당 성분 A[k]를 신뢰성 있게 읽고 쓰는 것이 어떻게 가능할지 설명하라. A[k]값이 유효할 수 있는 방법을 설명하시오.
  • 39. 임의의 희소 배열 A알수 없는 값 같은 크기의 검증용 배열 V알수없는 값 사용된 장소들의 목록L알수없는 값 목록 L 의 요소 개수n 0 임의의 값 k에 대해 A[k]접근시 if 0 ≤ V[k] ≤ n && L[V[k]] == k then return TRUE else V[k] ← n L[n]← k A[k]← 0 n ← n+1 return FALSE
  • 40. k1 … … A … … V … L n 0 임의의 값 k1에 대해 A[k1]접근시 if 0 ≤ V[k1] ≤ n && L[V[k1]] == k1then return TRUE else V[k1] ← n L[n]← k1 A[k1] ← 0 n ← n+1 return FALSE
  • 41. k1 … … A 0 … … V 0 … L k1 n 1 임의의 값 k1에 대해 A[k1]접근시 if 0 ≤ V[k1] ≤ n && L[V[k1]] == k1then return TRUE else V[k1] ← n L[n]← k1 A[k1] ← 0 n ← n+1 return FALSE
  • 42. k1 k2 … … A 0 … … V 0 … L k1 n 1 임의의 값 k2에 대해 A[k2]접근시 if 0 ≤ V[k2] ≤ n&& L[V[k2]] == k2then return TRUE else V[k2] ← n L[n]← k2 A[k2] ← 0 n ← n+1 return FALSE
  • 43. k1 k2 … … A 0 0 … … V 0 1 … L k1 k2 n 2 임의의 값 k2에 대해 A[k2]접근시 if 0 ≤ V[k2] ≤ n && L[V[k2]] == k2then return TRUE else V[k2] ← n L[n]← k2 A[k2] ← 0 n ← n+1 return FALSE
  • 44. k1 k2 … … A 0 0 … … V 0 1 … L k1 k2 n 2 임의의 값 k1에 대해 A[k1]접근시 if 0 ≤ V[k1] ≤ n&& L[V[k1]] == k1then return TRUE else V[k1] ← n L[n]← k2 A[k1] ← 0 n ← n+1 return FALSE
  • 45. k1 k2 … … A 0 0 … … V 0 1 … L k1 k2 n 2 임의의 값 k1에 대해 A[k1]접근시 if 0 ≤ V[k1] ≤ n && L[V[k1]] == k1then return TRUE else V[k1] ← n L[n]← k2 A[k1] ← 0 n ← n+1 return FALSE
  • 46. k1 k2 … … A 0 0 … … V 0 1 … L k1 k2 n 2 임의의 값 k2에 대해 A[k2]접근시 if 0 ≤ V[k2] ≤ n&& L[V[k2]] == k2then return TRUE else V[k2] ← n L[n]← k2 A[k2] ← 0 n ← n+1 return FALSE
  • 47. k1 k2 … … A 0 0 … … V 0 1 … L k1 k2 n 2 임의의 값 k2에 대해 A[k2]접근시 if 0 ≤ V[k2] ≤ n && L[V[k2]] == k2then return TRUE else V[k2] ← n L[n]← k2 A[k2] ← 0 n ← n+1 return FALSE
  • 48.