어떻게 하는거임
Introduction to Algorithms 연습문제 2.1-3 인데 -_- 증명에서 gg
다음의 검색문제를 생각해보자.
입력 : n개 수들의 수열 A=<a1,a2,...,an>과 어떤 값v
출력 : v=A[i]를 만족하는 인덱스 i. 만약, v가 배열 A에 존재하지 않을 경우에는 특수한 값 NIL
수열을 읽어보고 v의 값을 찾아보는 선형검색 의사코드를 작성하고, 루프 불변성을 이용해서 그 알고리즘이 타당함을 증명하라. 루프불변성의 세가지 필요조건을 충족하는지 반드시 확인해야 한다.
해서 아래 코드는 생각해냈거든요.
LINEAR_SEARCH(A,v)
for i <- 1 to length[A] do
if A[i]=v then
return i
end if
end for
return NIL
end
그런데 루프불변성 증명은 못하겠네요.
루프불변 : A[1..i-1] 안에는 v와 일치하는 값이 없다.
초기조건 : i=1일때, A[1..i-1]=A[1..0]안에는 아무것도 없으니 v와 값이 일치하지 않는다.
유지조건 : i=2,3,...,n일때, A[1..i-1] 안에는 v와 일치하는 값이 없으니까 A[i]까지 넘어왔다.
종료조건 : 종료되면서 i를 내뱉을때에는, A[1..i-1]안에 v랑 일치하는게 없다가 A[i]에서 일치하니 i를 내뱉고
종료되며 NIL을 내뱉을땐 i가 n+1이니까 A[1..n]안에 v랑 일치하는게 없으니 NIL을 뱉은거다.
이렇게 하면 몇점? 30점?
초기조건은 루프가 시작되기 전의 상태를 말해. i=1인 경우가 아니라.
디-//오호. 아. 그런데 책에 삽입정렬 알고리즘 설명하면서는, <j=2일때 루프불변성이 성립되는지 살펴본다. 이때 부분수열 A[1..j-1]=A[1]은 한개의 원소로 구성되어 정렬되어 있으므로 루프 시작전에 불변성이 참이다.> 하고 밑에 <루프가 for루프일경우 조사 시점은 초기화가 이루어진 직후, 루프헤더에서 첫 테스트를 하기 직전 시점이다>
이래갖고 헷갈리네요...
음;; 내가 틀렸나보네;;
for를 i=1; <초기> while(i<=length[A]) { <유지> ... ++i; } <종료> 이렇게 보나 보네.
디-//저렇게 보는게 맞는것 같은듯!