정렬 알고리즘에 전이성이 필요합니까?


14

전이가 아닌 비교와 함께 정렬 알고리즘을 사용할 수 있습니까? 그렇다면 전이성이 정렬 비교기의 요구 사항으로 나열되는 이유는 무엇입니까?

배경:

  • 정렬 알고리즘은 일반적으로 비교기 함수 C (x, y)에 따라 목록의 요소를 정렬합니다.

    (엑스,와이)={1만약 엑스와이0만약 엑스와이+1만약 엑스와이

    이 비교기의 요구 사항은 내가 이해하는 한 다음과 같습니다.

    • 재귀 : 엑스:(엑스,엑스)=0
    • 비대칭 : 엑스,와이:(엑스,와이)=(와이,엑스)
    • 전이 : 엑스,와이,,:(엑스,와이)=(와이,)=(엑스,)=
    • C (x, y)는 모든 x와 y에 대해 정의되며 결과는 x와 y에만 의존합니다.

    (이러한 요구 사항은 구현마다 다르게 다르게 나열되므로 모든 요구 사항이 확실하지 않습니다)

지금 나는 경우 번호가 유사한로, Y를 X 받아들이는 "허용"비교 기능에 대해 궁금 : C ( X , Y ) = { - 1 의 경우 , X < Y - 1 0 의 경우 | x y | 1 + 1 의 경우 , X > Y + 1|엑스와이|1

(엑스,와이)={1만약 엑스<와이10만약 |엑스와이|1+1만약 엑스>와이+1

예 : 둘 [ 1, 2, 3, 4, 5][1, 4, 3, 2, 5]정확하게 허용 비교기에 따라 오름차순으로 정렬 ( x는리스트 Y 앞에 오는 경우) 뿐만 아닌 C (4,2) = 1 보낸(엑스,와이)0
[1, 4, 2, 3, 5]

이 관용 비교기는 반사적이고 비대칭이지만 전이는 아닙니다.

즉, C (1,2) = 0, c (2,3) = 0이지만 C (1,3) = -1이며, 과도 성을 위반합니다.

그러나이 비교기와 임의의 목록을 제공했을 때 "정확하게 정렬 된"출력을 생성하지 못하는 정렬 알고리즘을 생각할 수 없습니다.

따라서이 경우에는 전이성이 필요하지 않습니까? 그리고 이행 성 덜 엄격한 버전이 되는 일에 정렬에 필요한가?

관련 질문 :


[3, 2, 1]에서이 비교기를 사용하면 피벗에 대해 "항상 중간 선택"을 사용하는 퀵 정렬이 실패한다고 생각합니다.
G. Bach

2
정렬 알고리즘에 사용되는 전이가 아닌 비교기가 무한 루프를 일으킬 수 있다고 생각합니다.
Karolis Juodelė

1
나는나는+1나는제이나는제이

@ G.Bach 배열에 n x 3, 1 x 2, n x 1이 있고 중간 2가 이후에 어떤 일이 있어도 첫 번째 피벗으로 사용되는 경우 quicksort가 실제로 완전히 실패한다고 생각합니다.
gnasher729 2016

답변:


11

질문 : 정렬 알고리즘을 실행하여 전이가 아닌 비교기를 공급할 수 있습니까?

답은 물론입니다. 모든 입력으로 모든 알고리즘을 실행할 수 있습니다.

그러나 쓰레기 수거통, 쓰레기 수거통 규칙을 알고 있습니다. 전이가 아닌 비교기를 사용하여 정렬 알고리즘을 실행하면 넌센스 출력이 발생할 수 있습니다. 특히, 비교기에 따라 출력이 "정렬"될 것이라는 보장은 없습니다. 따라서 전이가 아닌 비교기를 사용하여 정렬 알고리즘을 실행하는 것은 기대했던 방식으로 유용하지 않을 수 있습니다.

[,2,1]


1
내 첫번째 생각은 목록 [3,2,1]을이었다 이다 그래서 물론 종류의 변경을 떠나야한다, 내 콤퍼레이터에 따라 정렬 된 순서로; 그러나 정렬의 잘못된 정의를 사용했을 수도 있습니다. 난 그냥 각 요소를 직접 이웃과 비교하지만, 목록을 정렬하는 것을 고려하기에는 너무 약한 제한이 될 수 있습니다
HugoRune

4
@ HugoRune 글쎄, 그것은 흥미로운 포인트입니다. 정렬 이란 무엇 의미 합니까? 비 전이 비교기를 사용하여 정렬 알고리즘이 종료되고 알고리즘이 종료 될 때마다 일부 조건이 true이고 해당 조건이 정렬을 수행하는 것을 보여줄 수 있다면 물론 해당 알고리즘이 목록 을 정렬 합니다. 정렬의 정의에 대해 매번 . 비교기가 전 이적이지 않으면 정렬 목록의 모든 요소를 ​​쌍으로 비교해야하는 정렬 의 정의를 취하는 것이 이치에 맞지 않을 수 있습니다 .
Patrick87

3
@HugoRune, "이웃 만 비교"와 함께 사용자 정의 정렬이 필요할 것입니다. 표준 알고리즘은 중복 비교를 피하기 위해 전이성을 가정합니다. 또는 전이가 아닌 순서를 전이 순서에 포함시킬 수 있습니다. 아니면 토폴로지 정렬 라인을 따라 무언가를 찾고 있습니까?
vonbrand

나는이 문제를 잠시 만났고 버블 정렬은 실제로 인접한 요소 만 비교하기 때문에 실제로 잘 작동한다는 것을 알았습니다.
Mooing Duck

4

요소 집합과 이진 순서 관계가 주어지면 요소를 완전히 정렬하려면 전이성이 필요합니다. 실제로, 요소들에 대한 부분적 순서를 정의하기 위해서는 전이성이 요구된다. http://en.m.wikipedia.org/wiki/Total_order

과도 성없이 요소를 정렬하려면 "정렬 된"의 의미에 대한 훨씬 광범위한 정의가 필요합니다. 자기 일관성을 유지하는 것은 어렵습니다. 또 다른 답변은 "특히, 비교기에 따라 출력이 '분류'될 것이라는 보장은 없습니다." 그러나 우리는 실제로 훨씬 더 강한 것을 말할 수 있습니다. 당신이하는 보장 출력이되는 것을 정렬되지 귀하의 콤퍼레이터에 따라.

<<<


1
나는 부분적인 순서를 사용하여 정렬에 관해 묻는 질문을 해석했다. 부분 순서를 기준으로 정렬하는 것이 때로는 유용하지만 최악의 경우 N (N-1) / 2 비교가 필요합니다. 최악의 경우 N (N-1) / 2보다 작은 정렬 알고리즘은 내 대답에 설명 된 이유로 부분적으로 정렬 된 항목의 순위를 올바르게 지정할 수 없습니다.
supercat

2

당신이 원하는 것은 모든 식별 가능한 순위가 정확하도록 항목을 정렬하는 것처럼 들리지만 가까운 항목은 "인식 할 수없는"것으로 간주 될 수 있습니다. 이러한 비교와 함께 작동하는 정렬 알고리즘을 설계 할 수 있지만 사물을 구별 할 수 없다고보고 할 수있는 비교 횟수에 제한이 없다면 N (N-1) / 2 비교를 요구하지 않는 방법은 없습니다. 이유를 이해하려면 N (N-1) / 2보다 적은 수의 N과 정렬 알고리즘을 선택하십시오. 그런 다음 목록 L [0..N-1]을 채우고 각 요소 L [I]를 I / N으로 설정하고 비교기를 사용하여 "정렬"합니다 (최소값은 0, 최대 값 (N-1) / N). 따라서 차이는 (N-1) / N이며 1보다 작습니다.

비교할 수있는 N (N-1) / 2 쌍의 항목이 있고 정렬에서 많은 비교를 수행하지 않았기 때문에 서로 직접 비교되지 않은 항목 쌍이 있어야합니다. 이 중 하나를 먼저 1로 정렬하고 다른 하나를 -1 / N으로 바꾸고 모든 항목을 초기 위치로 되돌리고 정렬 작업을 반복하십시오. 모든 단일 비교 작업은 처음과 마찬가지로 0을 생성하므로 동일한 비교가 수행되고 항목이 동일한 순서로 종료됩니다. 목록이 올바르게 정렬 되려면 "1"이 "-1 / N"다음에 정렬되어야하지만 (하나 이상 차이가 있기 때문에) 정렬 알고리즘은이 두 항목을 서로 직접 비교하지 않기 때문에 그것을 알 방법이 없습니다.


0

값 n, n-1, n-2, ..., 2, 1로 n 개의 요소 배열을 채운 다음 "직선 삽입"알고리즘을 사용하여 정렬 해보십시오. 각 요소는 그 직전의 요소와 동일한 것으로 간주되므로 이동되지 않습니다. "정렬"의 결과는 동일한 배열입니다.

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