퀵 정렬을 분석 할 때 사용할 장애 측정


9

Lomuto 파티션을 사용하는 quicksort와 고정 피벗이 무작위로 생성 된 입력에서 불규칙하게 수행되지만 전반적인 성능이 떨어지는 이유를 이해하려고합니다. 나는 입력이 무작위로 생성되었지만 시퀀스에 많은 순서가있을 수 있다고 생각하지만 시퀀스의 장애 수준을 측정하는 방법을 모르겠습니다. 나는 반전의 수를 사용하는 것에 대해 생각했지만 이 다른 질문 에서이 경우에는 이것이 실제로 좋은 척도가 아니라고 물었습니다 .

내 임의 시퀀스에 많은 "순서"가 있다고 생각하는 이유는 피벗을 임의 화하면 성능 문제가 해결되기 때문입니다. 그러나 이론적으로 이러한 "무작위"입력 시퀀스에는 성능 문제가 없어야합니다.


이러한 종류의 장애에 대한 하나의 좋은 척도는 Kolmogorov의 복잡성입니다. 그것은 기본적으로 가장 무질서한 줄은 압축 할 수없는 줄이라고 말합니다. 그것은 비압축성 방법으로 이어지며, 이는 알고리즘의 평균 사례 분석과 평균과 최악의 분석 사이의 관계를 찾는 데 사용됩니다.
피터



악의적 인 피봇 사례가 아닌 프로그래밍 오류가 의심됩니다. 알고리즘이 정렬되는지 확인하려면 1에서 N까지의 정수 순서로 정렬하십시오!
이브 다우 스트

@YvesDaoust 정말 중요하지 않다고 생각합니다. "비 음성"의 양은 실제로 길이 문자열의 Kolmogorov 복잡성입니다. logn!시퀀스에서 요소의 순서를 인코딩합니다. 물론, 그것은 계산할 수 없으며 의사 난수와 같은 깊은 줄에 대해 생각해야하지만 모든 장애 측정은 본질적으로 Kolmogorov 복잡성의 근사치라는 점에서 유용합니다. 또한이를 증명하기 위해 계산할 필요가 없습니다. 비압축성 방법으로 많은 복잡한 결과가 나타났습니다.
피터

답변:


1

Lomuto vs Hoare
Hoare 파티션은 그렇지 않은 반면 동일한 키를 정렬 할 때 Lomuto 파티션은 어려움을 겪습니다.
중앙에서 먼 피벗을 사용할 때 두 파티션 구성표 모두 동일하게 고생합니다.

장애
측정 퀵 정렬을 위해 선택할 장애 측정은 간단합니다.
A : 무작위 데이터와 비교하여 고정 피벗이 중앙값에서 얼마나 멀리 제거됩니까?
Lomuto 파티션 사용을 주장하고 중복 값이 ​​허용되는 경우 임의성에 대해 다음 테스트를 추가해야합니다.
B : 임의 요소에 비해 중복 요소 수는 몇 개입니까?

물론 데이터 세트에 중복 값이 ​​허용되고 Lomuto 파티션을 평가한다고 가정하는 것은 어리석은 일이므로 미리 중복을 제거하거나 Hoare 파티션으로 전환하거나 중복이 드물다고 가정해야합니다.

두 측정법 모두 통계를 사용하여 정량화하는 것은 쉽지 않습니다.

우리는 병리학 적 데이터를 배제 할 수있다.
무작위성으로부터의 다른 편차는 퀵 정렬을 분석 할 목적으로는 중요하지 않다. 피벗이 중앙값에 가까우면 병리학 적이 지 않은 모든 데이터에서 제대로 작동합니다.
무작위로부터의 거리는 실제로 빠른 병리학 적이어야하므로 우리는 그것을 배제 할 수 있습니다.

실제 코드에서 고정 피벗을 사용하지 마십시오. 고정 피벗으로 실제 코드
를 작성하는 경우 *) (피벗이 무엇이든간에) 공격자는 그 시점의 병리학 적 가치는 항상 임의의 요소를 피벗으로 선택해야합니다.

*) x 개의 피벗을 가장 많이 선택하는 경우 여러 피벗.

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