게시판 인덱스

 
 FAQFAQ   검색검색   멤버리스트멤버리스트   사용자 그룹사용자 그룹   사용자 등록하기사용자 등록하기 
 개인 정보개인 정보   비공개 메시지를 확인하려면 로그인하십시오비공개 메시지를 확인하려면 로그인하십시오   로그인로그인 

HW#1, Ex3 질문

 
이 게시판은 잠겼으므로 글을 올리거나, 답변을 하거나 수정을 할 수 없습니다   이 주제는 잠겼으므로 답변을 하거나 수정을 할 수 없습니다     게시판 인덱스 -> 4190.310 Programming Languages (Fall 2005)
이전 주제 보기 :: 다음 주제 보기  
글쓴이 메시지
공순호
손님





올리기올려짐: 2005년9월22일 0:39    주제: HW#1, Ex3 질문 인용과 함께 답변

fun rank EMPTY = 0
| rank NODE(r, _, _, _) = r

로 되어있는데요.


rank EMPTY = 0이면

shake( anyinteger, EMPTY, EMPTY) 하면

NODE(1, anyinteger, EMPTY, EMPTY)가 되어서, 왼쏠힙의 정의에 부합하지 않고

이런 경우가 일어나지 않는 것을 merge를 통해서 하려면 함수가 복잡하게 될 것 같은데요.


fun rank EMPTY = -1 로 하면 shake에서 rank를 이용할 때 모든 경우에 대해

올바르게 작동하고 따라서 merge에서 생각해줘야할 부분이 상대적으로 줄어들게 되는 것으로 보이는데, 제가 옳게 생각하는 것인지 궁금합니다.
위로
김덕환



가입: 2005년 8월 29일
올린 글: 190

올리기올려짐: 2005년9월22일 12:55    주제: Re: HW#1, Ex3 질문 인용과 함께 답변

공순호 씀:
이런 경우가 일어나지 않는 것을 merge를 통해서 하려면 함수가 복잡하게 될 것 같은데요.

ML 계열 언어가 지원하는 매력적인 기능 중의 하나인 패턴 매칭 기능을 사용하여, 문제에 제시된 모든 조건을 만족하는 merge() 함수를 깔끔하게 작성할 수 있습니다.
위로
사용자 정보 보기 비밀 메시지 보내기
윤상필
손님





올리기올려짐: 2005년9월22일 21:25    주제: 인용과 함께 답변

저도 이부분 좀 이상하게 생각했었는데요.
스펙에 의하면 shake(1, EMPTY, EMPTY) 는 급수 1인 노드가 나오고 insert(1, EMPTY) 은 급수 0인 노드가 나옵니다.
보통 이 두개가 일치할 것을 기대하는 게 정상 아닌가요?
저 같은 경우는 EMPTY의 랭크를 -1로 하기 보다는 insert의 정의를
fun insert(x, h) = merge(h, NODE(1, x, EMPTY, EMPTY)) 이렇게 바꿔 가지고 해결했습니다.
상식적으로도 EMPTY 노드와 자식이 없는 노드의 급수가 같다면 왼쪽 자식이 EMPTY 이고 오른쪽 자식이 자식없는 노드인 경우에도 왼쏠힙의 정의를 만족한다고 볼 수 있으므로 모순이지 않나요? EMPTY와 자식없는 NODE는 급수의 차이가 1이어야 할 것 같습니다.
위로
김덕환



가입: 2005년 8월 29일
올린 글: 190

올리기올려짐: 2005년9월23일 0:53    주제: 인용과 함께 답변

윤상필 씀:
스펙에 의하면 shake(1, EMPTY, EMPTY) 는 급수 1인 노드가 나오고 insert(1, EMPTY) 은 급수 0인 노드가 나옵니다.
보통 이 두개가 일치할 것을 기대하는 게 정상 아닌가요?


특정 인자값들에 대해 shake()와 insert() 두 함수의 리턴값이 일치해야할 이유가 없습니다. shake()는 왼쏠힘 자료구조에 대한 인터페이스에 포함되지 않습니다. 그저 효율적인 merge() 내부 구현을 위해 사용하는 함수일 뿐입니다. 따라서, 우리가 merge() 내부에서 shake()에게 넘겨주는 인자 값들에 대해서만(즉, shake()의 의도된 정의역에 대해서만) 잘 작동하면 그만입니다.

인용:
저 같은 경우는 EMPTY의 랭크를 -1로 하기 보다는 insert의 정의를
fun insert(x, h) = merge(h, NODE(1, x, EMPTY, EMPTY)) 이렇게 바꿔 가지고 해결했습니다.


문제에 제공된 타입이나 함수의 정의에 의견을 제시하는 것은 좋지만, 일단 따로 공지가 나가지 않는 이상 제시한 그대로 사용하시기 바랍니다.

인용:
상식적으로도 EMPTY 노드와 자식이 없는 노드의 급수가 같다면 왼쪽 자식이 EMPTY 이고 오른쪽 자식이 자식없는 노드인 경우에도 왼쏠힙의 정의를 만족한다고 볼 수 있으므로 모순이지 않나요?


말씀하신 형태가 NODE (1, _, EMPTY, NODE (0, _, EMPTY, EMPTY))라면, 왼쏠힙이 맞습니다. 어떤 점에서 왼쏠힙이 아니어야한다고 생각하시는지요? Rolling Eyes

EMPTY의 급수를 0으로 정하는 것이 -1로 정하는 것보다 올바르다거나 정확하다는 얘기가 아닙니다. 아무 노드도 가지고 있지 않는 것을 트리로 볼 것인가, 아니면 적어도 노드가 하나라도 존재해서 루트 노드가 존재하는 것부터 트리로 볼 것인가 하는 문제처럼 그저 정의하기 나름입니다. 문제에서 이미 0으로 정의하였으며, 그로 인해 어떤 논리적인 문제점이 발생한 것도 아니므로 그 정의를 그대로 따라주시기 바랍니다.
위로
사용자 정보 보기 비밀 메시지 보내기
손님






올리기올려짐: 2005년9월23일 10:57    주제: 인용과 함께 답변

김덕환 씀:
윤상필 씀:
스펙에 의하면 shake(1, EMPTY, EMPTY) 는 급수 1인 노드가 나오고 insert(1, EMPTY) 은 급수 0인 노드가 나옵니다.
보통 이 두개가 일치할 것을 기대하는 게 정상 아닌가요?


특정 인자값들에 대해 shake()와 insert() 두 함수의 리턴값이 일치해야할 이유가 없습니다. shake()는 왼쏠힘 자료구조에 대한 인터페이스에 포함되지 않습니다. 그저 효율적인 merge() 내부 구현을 위해 사용하는 함수일 뿐입니다. 따라서, 우리가 merge() 내부에서 shake()에게 넘겨주는 인자 값들에 대해서만(즉, shake()의 의도된 정의역에 대해서만) 잘 작동하면 그만입니다.


rank 함수의 정의가 좀 애매한데 저는 왼쏠힙에서 "부모의 급수 = 오른쪽 자식의 급수 + 1" 라고 생각합니다. shake도 그런 식으로 정의되어 있고요. 이거 맞나요? 그렇다면 자식없는 노드 NODE(x, 1, EMPTY, EMPTY)의 경우 (rank EMPTY) = 0 이므로 이 경우 x는 (rank EMPTY) + 1 = 1 이 되어야 하지 않을까요? 그리고 제가 잘 몰라서 그런 걸지도 모르겠지만 NODE (1, _, EMPTY, NODE (0, _, EMPTY, EMPTY)) 의 경우는 왼쪽 자식은 없고 오른쪽 자식이 있는 경우이므로 <상식적으로> 왼쪽이 아니라 오른쪽으로 쏠려 있는 경우니까 왼쏠힙이 아닌 것 같습니다만 제가 틀린 건가요?
위로
김덕환



가입: 2005년 8월 29일
올린 글: 190

올리기올려짐: 2005년9월24일 17:47    주제: 인용과 함께 답변

Anonymous 씀:

rank 함수의 정의가 좀 애매한데 저는 왼쏠힙에서 "부모의 급수 = 오른쪽 자식의 급수 + 1" 라고 생각합니다. shake도 그런 식으로 정의되어 있고요. 이거 맞나요? 그렇다면 자식없는 노드 NODE(x, 1, EMPTY, EMPTY)의 경우 (rank EMPTY) = 0 이므로 이 경우 x는 (rank EMPTY) + 1 = 1 이 되어야 하지 않을까요?

rank()는 노드의 급수를 구해주는 함수로, 급수에 대한 정의는 문제에 다음처럼 나와있습니다.
인용:

노드의 급수: 그 노드에서 오른쪽으로만 타고 내려가서 끝날 때까지 내려선 횟수. 즉, 오른편 척추의 길이.

따라서, NODE (1, _, EMPTY, EMPTY)가 아니라 NODE (0, _, EMPTY, EMPTY)가 맞습니다.

Anonymous 씀:

그리고 제가 잘 몰라서 그런 걸지도 모르겠지만 NODE (1, _, EMPTY, NODE (0, _, EMPTY, EMPTY)) 의 경우는 왼쪽 자식은 없고 오른쪽 자식이 있는 경우이므로 <상식적으로> 왼쪽이 아니라 오른쪽으로 쏠려 있는 경우니까 왼쏠힙이 아닌 것 같습니다만 제가 틀린 건가요?


수업이나 숙제 모두 수학처럼 굉장히 엄밀한 접근 방식을 취합니다. 저희 세계에서 절대반지를 가진 자는 정의(definition)랍니다. Smile

따라서, 정의를 만족하는 모든 대상은 왼쏠힙이랍니다. 왼쏠힙이라는 이름은 정의를 만족하는 대상들이 일반적으로 왼쪽으로 쏠린 모양을 가지게 때문에 그렇게 붙여졌을 뿐입니다. 이름은 이름일 뿐, 본질적인 것은 아닙니다.

그래도 꺼림직하시다면, 왼쏠힙 조건을 만족시키면서 NODE (1, _, EMPTY, NODE (0, _, EMPTY, EMPTY))에 값들을 추가해나갈 때 어떤 일들이 일어나는 지를 추적해보시면 쉽게 납득하실 수 있을 거라고 봅니다.

@ 모든 글에는 실명을 달아주시기 바랍니다. 조교들은 수강생들의 이름을 알고 싶답니다. Smile
_________________
TheyAreAsSmartAsYouAre
위로
사용자 정보 보기 비밀 메시지 보내기
윤상필
손님





올리기올려짐: 2005년9월25일 16:07    주제: 인용과 함께 답변

인용:

rank()는 노드의 급수를 구해주는 함수로, 급수에 대한 정의는 문제에 다음처럼 나와있습니다.
인용:

노드의 급수: 그 노드에서 오른쪽으로만 타고 내려가서 끝날 때까지 내려선 횟수. 즉, 오른편 척추의 길이.

따라서, NODE (1, _, EMPTY, EMPTY)가 아니라 NODE (0, _, EMPTY, EMPTY)가 맞습니다.


EMPTY를 leaf node(또는 external node)로 본다면 NODE(1, _, EMPTY, EMPTY)가 맞을 수도 있겠군요. NODE라는 건 한 identifier일 뿐이지 저 왼쏠힙의 정의에서 말하는 "노드"가 아닐 수도 있으니까요.
그리고 만약 NODE(1, _, EMPTY, NODE(0, _, EMPTY, EMPTY)) 가 올바른 왼쏠힙이라면 숙제 스펙에서
인용:
(참고: 왼쏠힙에서 오른쪽 척추에 붙어있는 노드수는 많아야 floor(log(n+1))이다.)

라고 되어 있는 부분이 있는데 NODE만이 "노드"라고 본다면 저기서 오른쪽 척추의 노드수는 2이고 n은 2이므로 floor(log(2+1)) = floor(log 3) = 1 < 2 이므로 모순이 되는군요. EMPTY까지 "노드"라고 본다면 오른쪽 척추의 노드수는 3이고 n은 5이므로 floor(log(5+1)) = 2 < 3 이므로 이래저래 모순이군요.

인용:
@ 모든 글에는 실명을 달아주시기 바랍니다. 조교들은 수강생들의 이름을 알고 싶답니다. Smile

저 위에 익명으로 글 단 사람도 접니다. 깜빡 잊고 사용자 이름을 안 넣었군요. Embarassed
위로
김덕환



가입: 2005년 8월 29일
올린 글: 190

올리기올려짐: 2005년9월25일 19:55    주제: 인용과 함께 답변

윤상필 씀:

EMPTY를 leaf node(또는 external node)로 본다면 NODE(1, _, EMPTY, EMPTY)가 맞을 수도 있겠군요. NODE라는 건 한 identifier일 뿐이지 저 왼쏠힙의 정의에서 말하는 "노드"가 아닐 수도 있으니까요.

EMPTY는 어떤 노드도 존재하지 않는 말 그대로 트리를 의미합니다. NODE(0, _, EMPTY, EMPTY)가 단말노드입니다.

윤상필 씀:

그리고 만약 NODE(1, _, EMPTY, NODE(0, _, EMPTY, EMPTY)) 가 올바른 왼쏠힙이라면 숙제 스펙에서
인용:

(참고: 왼쏠힙에서 오른쪽 척추에 붙어있는 노드수는 많아야 floor(log(n+1))이다.)

라고 되어 있는 부분이 있는데 NODE만이 "노드"라고 본다면 저기서 오른쪽 척추의 노드수는 2이고 n은 2이므로 floor(log(2+1)) = floor(log 3) = 1 < 2 이므로 모순이 되는군요. EMPTY까지 "노드"라고 본다면 오른쪽 척추의 노드수는 3이고 n은 5이므로 floor(log(5+1)) = 2 < 3 이므로 이래저래 모순이군요.

인용하신 부분의 문맥의 의미를 분명하게 전달하기 위해 좀더 길게 인용합니다.
인용:

이 때, 왼쏠힙의 장점을 살려서 여러분이 정의한 merge는 O(log n)으로 끝나도록 해야한다(n은 힙의 노드 수). (참고: 왼쏠힙에서 오른쪽 척추에 붙어있는 노드수는 많아야 floor(log(n + 1)이다.)

"참고" 부분은 자기가 구현한 merge() 알고리즘의 복잡도를 분석할 때 사용할 힌트로서 주어진 것입니다. 일반적으로 알고리즘의 복잡도는 입력의 크기 n이 충분히 클 때를 다룹니다. 또한, 여기서 중요한 것은 오른쪽 척추에 붙어있는 노드의 정확한 수가 아니라 그 수가 O(log n)에 한정된다는 사실입니다. 그 사실을 이용하여 merge()가 O(log n)으로 끝나도록 구현하실 수 있습니다. 정확한 수가 floor(log(n + 1))이든지, ceiling(log(n + 1))이든지, floor(log(n + 1)) + 1이든지는 논리적으로 중요하지 않습니다.

@ 일요일에도 숙제하시느라 열심이시네요. 열정이 와닿습니다. Embarassed
_________________
TheyAreAsSmartAsYouAre


김덕환 가 2005년9월26일 10:53에 수정함, 총 1 번 수정됨
위로
사용자 정보 보기 비밀 메시지 보내기
이기석
손님





올리기올려짐: 2005년9월26일 2:07    주제: 인용과 함께 답변

저도 같은 문제로 고민하다가 이곳의 질문과 답변들을 보게됐습니다.

제 생각이지만 위의 문제를 merge 함수에서 패턴매칭 시키기 보다는

shake 함수에서 패턴매칭시키는 편이 훨씬 깔끔하게 해결 될것 같은데

shake 함수에 EMPTY가 인자로 들어올 경우를 처리할 수 있도록 패턴매칭을

추가시켜도 됩니까?



EMPTY 의 경우 NODE가 아니므로 rank의 정의에 의해 EMPTY에 대한 rank

를 따지는 것은 의미가 없다고 봅니다. 그래서 (rank EMPTY)의 값이 0이든 -1이

든 상관없다는 데에는 동의합니다. 하지만 shake 함수에서는 EMPTY를 rank가

0인 NODE와 동일시 하기때문에 NODE와 EMPTY의 rank를 비교하는 정의되지

않는 행동을 합니다.
(EMPTY의 rank를 정의할 수 없다면 NODE와 EMPTY의

rank를 비교하는것도 정의할 수 없다고 생각합니다
) 그렇기 떄문에 shake

함수에 인자로 EMPTY를 받아들일 경우의 패턴매칭을 추가시켜도 된다고 생각

하는데 어떨지 조교님께 여쭙습니다 ^^;
위로
손님






올리기올려짐: 2005년9월26일 11:09    주제: 인용과 함께 답변

김덕환 씀:
윤상필 씀:

EMPTY를 leaf node(또는 external node)로 본다면 NODE(1, _, EMPTY, EMPTY)가 맞을 수도 있겠군요. NODE라는 건 한 identifier일 뿐이지 저 왼쏠힙의 정의에서 말하는 "노드"가 아닐 수도 있으니까요.

EMPTY는 어떤 노드도 존재하지 않는 말 그대로 트리를 의미합니다. NODE(0, _, EMPTY, EMPTY)가 단말노드입니다.

하아.. 알겠습니다. 출제자께서 그렇게 말씀하시는데 까라면 까야지 어쩌겠습니까 Crying or Very sad 다만 말씀하신 스펙으로도 뭐 할 수는 있겠지만 EMPTY를 leaf node로 보면 모든 게 깔끔해진다는 것을 알아 주셨으면 합니다.

확인차 예제를 제시해 보자면 insert(3, insert(4, insert(5, EMPTY))) 의 결과가 NODE (0, 3, NODE (0, 4, NODE (0, 5, EMPTY, EMPTY), EMPTY), EMPTY) 가 되는 것이 맞습니까?
위로
김덕환



가입: 2005년 8월 29일
올린 글: 190

올리기올려짐: 2005년9월26일 12:53    주제: 인용과 함께 답변

Anonymous 씀:
하아.. 알겠습니다. 출제자께서 그렇게 말씀하시는데 까라면 까야지 어쩌겠습니까 Crying or Very sad 다만 말씀하신 스펙으로도 뭐 할 수는 있겠지만 EMPTY를 leaf node로 보면 모든 게 깔끔해진다는 것을 알아 주셨으면 합니다.

문제를 출제하신 분은 교수님이십니다. Wink

교수님께서 이 문제를 출제하셨을 때 학생들이 익숙해졌으면 하는 것은 nML의 패턴 매칭과 재귀적인 사고였을 거라고 생각합니다. 경계 조건인 EMPTY의 급수 처리가 크게 중요한 사항은 아닌데 학생들이 지나치게 많은 부담을 느끼고, 특정 구현을 강요한다는 측면도 있으므로 교수님께 fun rank EMPTY = -1나 NODE (1, _, EMPTY, EMPTY)를 허용해도 될 지 여쭈어는 보겠습니다.

@ 실수라도 익명 글쓰기 빈번해지면 글쓸 때 반드시 로그인하도록 바꿔버릴 지도 모릅니다. Twisted Evil
_________________
TheyAreAsSmartAsYouAre
위로
사용자 정보 보기 비밀 메시지 보내기
김덕환



가입: 2005년 8월 29일
올린 글: 190

올리기올려짐: 2005년9월26일 13:48    주제: 인용과 함께 답변

김덕환 씀:

교수님께서 이 문제를 출제하셨을 때 학생들이 익숙해졌으면 하는 것은 nML의 패턴 매칭과 재귀적인 사고였을 거라고 생각합니다. 경계 조건인 EMPTY의 급수 처리가 크게 중요한 사항은 아닌데 학생들이 지나치게 많은 부담을 느끼고, 특정 구현을 강요한다는 측면도 있으므로 교수님께 fun rank EMPTY = -1나 NODE (1, _, EMPTY, EMPTY)를 허용해도 될 지 여쭈어는 보겠습니다.


교수님과 협의한 결과, 세 가지 다 허용하기로 하였습니다. 지금 그대로의 정의를 따르는 것, fun rank EMPTY = -1로 한 것, NODE (1, _, EMPTY, EMPTY)로 한 것 다 허용합니다. 좀 더 자세한 사항은 따로 공지사항으로 올리도록 하겠습니다.
_________________
TheyAreAsSmartAsYouAre
위로
사용자 정보 보기 비밀 메시지 보내기
김덕환



가입: 2005년 8월 29일
올린 글: 190

올리기올려짐: 2005년9월29일 11:05    주제: EMPTY를 어떻게 해석할 것인가? 인용과 함께 답변

등교 버스가 늦게 오는 바람에 세 가지 정의가 다 개념 상 문제가 없는지 검토해보는 시간을 가졌습니다.

NODE (_, x, EMPTY, EMPTY)에 대해 deleteMin 함수를 호출했을 경우 아래처럼 될 겁니다.
코드:

deleteMin NODE (_, x, EMPTY, EMPTY) = merge (EMPTY, EMPTY) = EMPTY

여기서 EMPTY를 빈 트리로 해석하면, 빈 트리 두 개를 merge했을 때 빈 트리가 나오는 것이므로 자연스럽습니다. 반면, EMPTY를 단말노드로 해석하면, 단말노드를 하나씩 가진 트리 두 개를 merge했는데 단말노드를 하나 가진 트리고 나옵니다. 노드 하나가 갑자기 사라져버립니다.

따라서, 빈 트리라는 개념을 도입하는 것이 논리적으로 자연스러운 해석에 이른다고 생각됩니다.

단, 이것은 버스가 늦게 왔기 때문에 생각해본 것으로 문제가 묻고자 하는 바는 아닙니다. 숙제는 공지한 대로 세 가지 정의를 다 허용합니다.
_________________
TheyAreAsSmartAsYouAre
위로
사용자 정보 보기 비밀 메시지 보내기
이전 글 표시:   
이 게시판은 잠겼으므로 글을 올리거나, 답변을 하거나 수정을 할 수 없습니다   이 주제는 잠겼으므로 답변을 하거나 수정을 할 수 없습니다     게시판 인덱스 -> 4190.310 Programming Languages (Fall 2005) 시간대: GMT + 9 시간(한국)
페이지 11

 
건너뛰기:  
새로운 주제를 올릴 수 없습니다
답글을 올릴 수 없습니다
주제를 수정할 수 없습니다
올린 글을 삭제할 수 없습니다
투표를 할 수 없습니다


Powered by phpBB 2.0.21-7 (Debian) © 2001, 2005 phpBB Group
Translated by kss & drssay