2017-11-07 11 views
2

현재 TCRC Introduction to Algorithms 제 3 판 교과서 2 장을 읽고 있는데이 알고리즘의 루프 불변성에 대한 저자의 해석을 읽었습니다. 초기화와 유지 보수에 대한 저자의 논리를 이해합니다. 그러나, 종결은 내가 꽁꽁 얼어 붙은 것입니다. 저자는 종료시에 j = n + 1이라고 주장합니다. 그러나 알고리즘의 의사 코드에서 j는 2에서 n으로 반복됩니다. 그러니 j = n - 1일까요?삽입 정렬 알고리즘의 종결 루프에서 j = n + 1이 왜 불규칙합니까?

편집 : 일종의 삽입이 책의 의사 코드 :

for j = 2 to A.length 
    key = A[j] 
    // Insert A[j] into sorted sequence A[1...j - 1] 
    i = j - 1 
    while i > 0 and A[i] > key 
     A[i + 1] = A[i] 
     i = i - 1 
    A[i + 1] = key 

편집 :주의 깊게 읽은 후, 나는 마침내 종료하는 동안 왜 J = N + 1을 이해했다. for 루프가 2에서 n (포괄적으로)이기 때문에 j가 n을 초과하면 루프가 종료되므로 종료시 j = n + 1이됩니다. 도움에 감사드립니다.

+1

당신이 의사를 제공 할 수

그리고이 C의 예에서

, c는 종료 후 A.length의 값을 가지고? – BlackBear

+0

문제의 텍스트를 제공해야합니다. 게시 한 내용을 알 수있는 방법이 없습니다. – Prune

+0

StackOverflow에 오신 것을 환영합니다.도움말 설명서의 게시 지침을 읽고 따르십시오. [주제] (http://stackoverflow.com/help/on-topic) 및 [묻는 방법] (http://stackoverflow.com/help/how-to-ask) 여기를 참조하십시오. – Prune

답변

1

면책 조항 : 이것은 완전히 잘못된 것일 수 있습니다. 단지 뇌가 침을 뱉을뿐입니다.

사이드 노트 :이 루프 중에 j이 증가하므로 시작 지점은 종료 조건과 관련이 없습니다.

for j = 2 to A.length //A.length = n in your question 

이 의사 코드에는 약간의 모호성이 있습니다.

우선 j은이 for 루프 외부에 정의되어 있으며 루프가 종료 될 때 최종 값을 갖습니다. 그것은 포함 또는 A.length 제외됩니다 A[j]

모호성이 for j = 2 to A.length에 단어 to로 존재합니다는 코드가 인덱서로 j를 사용하여 배열을 목표로, Dukeling의 코멘트 @

둘째를 참조? 및 A[j]에서 인덱서이 인덱서 일반적인 경우 A[j]

,가, j의 유효 범위는

일부 언어 [0...A.length -1] 즉, 다른 범위를 사용합니다 : [1...A.length] 나는이가 A[0]을 때문에 저자가 의도 한 생각 전혀 맞지 않습니다.

그럴 경우 ... for 조건은 루프를 끊기 전에 (조건을 테스트하고 거짓임을 확인하기 위해) j을 증가 시키면 ... j = A.length + 1이됩니다. 보조 노트로

: 언어 같은 일반적인 C에서

는, 배열 [0...A.length -1]의 유효한 범위가 있습니다.

int c = 0; 
for (c = 3; c < A.length; c++) 
{ 

} 
//c = A.length after the loop is completed. 
+1

'j'가 루프 밖에서 정의되었다고 가정 할 필요가 없습니다.'j'는 정의 된 위치에 관계없이 마지막 시간을 증가시킵니다. – Dukeling

+0

@Dukeling : 첫 번째 부분은 옳았 습니다만, 두 번째 부분은 0 색인에 초점을 두었습니다. 이것이 OP의 혼란을 초래 한 원인입니다. 확실하지. – Stefan

+0

의사 코드 규칙을 읽은 후에 저자는 OP의 의사 코드와 같은 섹션을 사용합니다. 저자는 인덱스 j가 인덱스 n을 초과하면 루프가 끝나는 것을 고려한 위치 n + 1에 있다고 생각합니다. 배열의 마지막 요소 – JoeyCentral