알고리즘에서 "가장자리"사례를 어떻게 식별합니까?


25

기본적으로 최악의 사례 나 최상의 사례 및 다른 "가장자리"사례를 파악하기 전에 어떻게해야하는지 알아 내려면 코드를 어떻게 준비해야합니까?


2
대안 : 가능하면 퍼지 테스트를 좋아합니다. 엄청나게 무작위로 생성 된 입력이 엄청나게 정밀한 조사 / 가장자리 테스트를하지 않은 함수 내에서 버그를 발견 할 수 있다는 것은 놀라운 일입니다. 이 두 가지는 정말 잘 작동합니다. "true"입력에서 실행할 때 오류를 정확하게 기록함으로써 분명히 보완됩니다. :)
Matthieu M.

답변:


28

알고리즘의 내용에 따라 사용되는 데이터 구조 / 유형 / 구성을 식별 할 수 있습니다. 그런 다음, (가능한) 약점을 이해하려고 시도하고 그러한 경우에 실행 계획을 세워보십시오.

예를 들어, 알고리즘은 문자열과 정수를 입력으로 사용하고 문자열의 문자를 정렬합니다.

여기에 우리가 있습니다 :

알려진 특수한 경우가있는 문자열 :

  • 빈 문자열
  • 긴 줄
  • 유니 코드 문자열 (특수 문자)
  • 특정 문자 집합으로 제한되는 경우 일부 문자가 범위에 속하지 않으면 어떻게됩니까?
  • 홀수 / 짝수 문자열
  • 널 (인수)
  • 널이 아닌 종료

알려진 특별한 경우를 가진 정수 :

  • 0
  • 최소 / MaxInt
  • 부정적 / 긍정적

다음 경계 경우에 실패 할 수있는 정렬 알고리즘 :

  • 빈 입력
  • 1 요소 입력
  • 매우 긴 입력 (길이 max (인덱스에 사용 된 데이터 유형) 일 수 있음)
  • 컬렉션 내 쓰레기 분류
  • 널 입력
  • 중복 요소
  • 모든 요소가 동일한 컬렉션
  • 홀수 / 짝수 길이 입력

그런 다음,이 모든 경우를 고려하여 겹치는 방식을 이해하려고 긴 목록을 작성하십시오. 전의:

  • 빈 문자열 케이스는 빈 컬렉션 케이스를 덮습니다.
  • 널 문자열 == 널 콜렉션
  • 기타

이제 테스트 케이스를 만드십시오 :)

간단한 요약 : 경계 사례를 알고있는 기본 블록에서 알고리즘을 중단 한 다음 다시 조립하여 전역 경계 사례를 만듭니다.


5
추가 할 것이 하나 더 있습니다. . . 코드를 분석하고 코드에서 특별한 경우를 찾으십시오. 개발자가 14 이상과 다르게 0에서 13까지를 처리하는 경우 (개발자가 성능상의 이유로 작고 큰 값에 대해 다른 알고리즘을 사용하고있는 경우) 13과 14에 엣지 사례가 있습니다. +1.
Ethel Evans

2

가장자리 조건을 결정하는 알고리즘이 없다고 생각합니다.

예 : 바이트 매개 변수의 경우 0, 127, 128, 255, 256, -1과 같은 숫자를 테스트하여 문제를 일으킬 수있는 모든 것을 테스트하려고합니다.


2

"가장자리 (edge)"는 두 가지 의미를 지니 며, 두 가지 경우 모두에 해당합니다. 에지는 입력의 작은 변화가 출력의 큰 변화를 초래하는 영역이거나 범위의 끝입니다.

알고리즘의 가장 중요한 경우를 식별하기 위해 먼저 입력 도메인을 살펴 봅니다. 그 에지 값은 알고리즘의 에지 사례로 이어질 수 있습니다.

둘째, 출력 도메인을 살펴보고이를 생성 할 수있는 입력 값을 다시 살펴 봅니다. 이는 일반적으로 알고리즘의 문제는 아니지만 주어진 출력 도메인에 걸쳐있는 출력을 생성하도록 설계된 알고리즘에서 문제를 찾는 데 도움이됩니다. 예를 들어 난수 생성기는 모든 의도 된 출력 값을 생성 할 수 있어야합니다.

마지막으로 알고리즘을 검사하여 비슷한 입력 사례가 있지만 다른 결과를 초래하는지 확인합니다. 도메인과 입력 쌍을 모두 포함하므로 이러한 에지 사례를 찾는 것이 가장 어렵습니다.


0

이것은 매우 일반적인 질문이므로 내가 할 수있는 것은 일반적인 모호한 아이디어를 버리는 것입니다. :)

경계 사례를 조사합니다. 전의. 문자열을 구문 분석하는 경우 문자열이 비어 있거나 null 인 경우 어떻게됩니까? x에서 y까지 세는 경우 x와 y에서 어떤 일이 발생합니까?
단순화되거나 건조 될 수있는 코드. 불필요한 복잡성으로 인해 문제가 발생할 수 있습니다.


0

알고리즘 사용 기술의 일부는 약점과 병리 적 사례를 아는 것입니다. Victor의 답변은 유용한 팁을 제공하지만 일반적으로이 주제에 대해 더 깊이 이해하기 위해 주제를 더 깊이 연구해야한다고 조언합니다.이 규칙에 따라이 질문에 완전히 대답 할 수는 없다고 생각합니다. 예를 들어 Cormen 또는 Skiena를 참조하십시오 (특히 스키 나 에는 알고리즘을 사용하는 위치와 특정 경우에 잘 작동하는 부분에 대한 훌륭한 섹션이 있습니다. Cormen은 더 많은 이론을 씁니다).

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