정확하지만 정확하지 않은 알고리즘 및 증명의 예


15

프로그래밍 과정에 대한 소개에서 우리는 알고리즘이 우리가 기대하는 것을 수행한다는 것을 증명하는 Initialization-Maintenance-Termination 방법에 대해 배웁니다. 그러나 우리는 이미 올바른 것으로 알려진 알고리즘이 올바른지 증명해야했습니다. 우리는 알고리즘이 올바르지 않다는 것을 보여 달라는 요청을받은 적이 없습니다.

올바른 것처럼 보이지만 그렇지 않은 알고리즘의 전형적인 예가 있습니까? Initialization-Maintenance-Termination 접근 방식이 한 눈에 직감적이지 않은 것을 포착하는 경우를 찾고 있습니다.


5
DW

5
나는 이것이 매우 중요한 교육 학적 질문이라고 생각하기 때문에 공감. 그것은 cstheory의 범위를 약간 벗어 났지만 더 나은 플랫폼을 알지 못하며 cstheory 커뮤니티에는 많은 알고리즘 강사가 있습니다. 대부분의 알고리즘 설계 과정은 학생들에게 올바른 기존 알고리즘과 알려진 기술을 사용하여 쉽게 해결할 수있는 문제에만 노출시킵니다. 이것은 학생들에게 매우 매력적인 인상을 강화시켜 겉보기에 그럴듯한 알고리즘이 옳다는 직관적 인 느낌을 안전하게 신뢰할 수 있습니다. 좋은 알고리즘 디자인 과정은 반대로해야합니다!
닐 영

3
이런 컬렉션을 갖고 싶습니다.
찬드라 체 쿠리

답변:


20

2D 로컬 최대

입력 : 2 차원 배열 An×nA

출력 : 로컬 최대 - 쌍 되도록 [ I , J는 ] 엄밀히 큰 값을 포함하는 어레이 내에 이웃 셀이 없다. (i,j)A[i,j]

(인접한 셀은 어레이에 존재 사이 셀 이다.) 예를 들어 AA[i,j+1],A[i,j1],A[i1,j],A[i+1,j]A

0134323125014013

각 굵은 셀은 로컬 최대 값입니다. 비어 있지 않은 모든 배열에는 하나 이상의 로컬 최대 값이 있습니다.

연산. 단, 각 셀을 확인 : - 시간 알고리즘. 더 빠르고 재귀적인 알고리즘에 대한 아이디어가 있습니다.O(n2)

주어지면 중간 열의 셀과 가운데 행의 셀로 구성되도록 교차 X 를 정의 하십시오. 먼저 X의 각 셀을 확인 하여 셀이 A 의 로컬 최대 값인지 확인하십시오 . 그렇다면 해당 셀을 반환하십시오. 그렇지 않으면 ( i , j )X의 최대 값 셀로 설정하십시오 . 이후 ( , j는 ) 로컬 최대가 아닌, 그 인접 셀이 있어야 ( I ' , J ' ) 보다 큰 값.AXXA(i,j)X(i,j)(i,j)

AXAX(i,j)A

AA

(i,j)AA(i,j)

알고리즘은 재귀 적으로 호출됩니다.n2×n2A(i,j)

T(n)n×nT(n)=T(n/2)+O(n)T(n)=O(n)

따라서 우리는 다음 정리를 증명했습니다.

O(n)n×n

아니면 우리가?


처음 읽을 때, 내가 발견 한 유일한 실수는 재발 솔루션이었습니다. 그게 유일한 실수입니까?
Radu GRIGore

1
재발이 맞습니다. 알고리즘은 아닙니다!
닐 영

1
아, 그렇습니다. 재발로 멍청한 실수를했습니다. 나는 문제를 본다 : 당신이 존재하는 최대 값은 (필수적으로) 당신이 찾는 것이 아닙니다. 그리고 당신이 찾은 것은 X를 무시합니다.
Radu GRIGore

3
(2143300101230001023002222222333233300323000032300)

2
AA
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.