2013-05-10 8 views
16

코드가 실행되는 대상 구현이 무엇인지 알지 못하는 JavaScript (일부 적용 가능)에서는 기본 정렬 알고리즘 (Array.sort)이 안정적인지 여부를 감지하는 기능이 있습니다. 다음은 the specification입니다.정렬 알고리즘이 안정적인지 감지하는 블랙 박스 방법이 있습니까?

나는 웹킷 (1)(2) 2 개 테스트를 찾을 수 있지만, 이러한 테스트는 어떻게 믿을 수 있습니까? (이 검사는 PCP으로 끝날 수 있습니까?) 나는 수학적으로 소리가 나올 해결책을 찾고 있습니다.

고급 정렬 알고리즘은 소스 배열의 길이 (예 : Timsort)에 따라 부분 알고리즘을 변경할 수 있으므로 까다로운 문제입니다. 나는 실행 한 모든 테스트가 Google 크롬의 종류를 안정적으로 보여 주었기 때문에 혼란 스러웠지만, 필자가 본 모든 문서에서 불안정하다고 말했습니다 (the source).

(일반적으로, 나는 안정적인 나의 종류를 만들기 위해 this strategy를 사용, 그것은 작은 그러나 때때로 눈에 띄는 성능에 미치는 영향가) 다양한 구현에 정렬

소스 코드 :
+0

이러한 결정은 확률 론적으로 만 가능합니다. 예를 들어 입력 'I'을 사용하는 정렬 알고리즘 'S'를 정의 할 수 있습니다. 보통'S'는 실제 sorting 작업을 안정된 sortalgorithm'T' *로 바꾸지 만,'I'는 특별한 값'I'와 같을 때 비 안정 정렬'U'를 대신 사용합니다.당신은 운이 좋으면'S'가 비 안정적이라는 것을 결코 증명할 수 없을 것입니다. 좀 더 현실적으로,'S'는'I'가 아주 길지 않으면 안정된 정렬을 사용합니다. 다시 말하지만, 적절한 긴 입력을 테스트 할 경우 비 안정적인 정렬 만 관찰하게됩니다. – apsillers

+2

사양에서 안정적이지 않다고 말하면 어레이를 정렬 할 때 항목을 바꿀 수 있다고 생각할 수는 없지만 그다지 신뢰할 수는 없습니다. 약속이 없습니다. (현재) 구현이 안정적이라고해도 그것이 항상 존재할 것이라는 의미는 아니며 크롬이 실행되는 모든 플랫폼에 적용된다는 의미는 아닙니다. – frozenkoi

+0

@MarZab에 동의합니다.이 문제는 중단 문제입니다. '[computer-science]'및/또는'[computer-science-theory]'태그를 붙이면 좀 더주의를 기울일 수 있습니다. – apsillers

답변

0

작은 내부 테스트를 실행하여 확인 하시겠습니까? 위키 피 디아 (Wikipedia)의 "순위에 따라 카드 한 벌씩"카드를 사용하여 안정성을 확인할 수 있습니다.

은 참조 : https://en.wikipedia.org/wiki/Sorting_algorithm#Stability

당신이 안정성을 점검 할 필요가 얼마나 많은 카드 모른다 - 아마 5 정도?

1

수학적으로 들리겠습니까? 알고리즘의 모든 경로를 안정적으로 증명해야합니다. 가능한 모든 데이터.

그런 확실한 알고리즘이 있지만 그 요구 사항에 가장 적합했을 것입니다. 그래서 그것이 있다면, 어딘가에 있다고 말할 것입니다.

이와 비슷한 것을 증명하는 테스트에서 Halting 문제와 비슷한 문제가 발생할 수 있습니다.

http://en.wikipedia.org/wiki/Halting_problem

+0

Halting problem을 호출 할 필요가 있는지 확신 할 수 없지만 주어진 입력 크기에 대한 * 모든 * 가능성을 커버하기 위해서는 초 지향성 검색이 필요하다는 것이 분명해야합니다 –

5

블랙 박스 테스트는 당신이 기준에 관련된 모든 가능한 입력을 테스트 할 수 있습니다하지 않는 프로그램이 어떤 기준을 만족하는 것을 확인하는 데 사용할 수 없습니다. 블랙 박스는 입력을 출력으로 매핑하는 룩업 테이블을 가지고 있기 때문에 (실제 룩업 테이블 버그는 Pentium FDIV bug을 참조하십시오) 테스트를 통해 다른 입력이 위반을 유발할 가능성을 배제 할 수는 없습니다.

1

왜 위험합니까? 가장 합리적인 데이터 세트의 경우 병합 정렬의 자바 스크립트 구현이 충분히 빠릅니다. 한 쌍을 데리러 벤치 마크하고 가장 좋은 것을 사용하십시오.