선형 시간의 정수 "거의 정렬"


16

선형 시간 으로 양의 정수 값 을 정렬하는 데 관심이 있습니다 (균일 한 비용 측정을 가진 RAM 모델에서, 즉 정수는 최대 로그 크기를 가질 수 있지만 그에 대한 산술 연산은 가정합니다) 단위 시간). 물론 이것은 비교 기반 정렬 알고리즘으로는 불가능하므로 "근사"정렬, 즉 일부 순열 의 은 실제로 정렬되지 않지만 의 정렬 된 버전의 "좋은 근사치"입니다 . 나는 우리가 속편을 좀 더 기분 좋게 만들기 때문에 정수를 내림차순으로 정렬한다고 가정 할 것입니다.L=v1,,vnvσ(1),,vσ(n)LL

근사 정렬 방법에 대한 하나 개의 가능한 기준은 다음 (*) :시키는 될 마다 대해 , 우리가 필요 (즉, "가 분류 된"리스트는 감소 함수 의해 위에서부터 제한됩니다 ). 실제 정렬이이를 충족한다는 것을 쉽게 알 수 있습니다. 는 보다 크지 않아야합니다. 따라서 최대 인 이며 일반적으로 는 보다 크지 않아야합니다. 어떤Nivi1invσ(i)N/iiN/ivσ(2)vσ(1)(vσ(1)+vσ(2))/2N/2vσ(i)(jivσ(i))/iN/i.

예를 들어, 요구 사항 (*)은 아래 알고리즘 (@Louis에서 제안)을 통해 달성 할 수 있습니다. 내 질문은 : 실제 정렬이 만족 해야하는 (*)와 같은 요구 사항을 부과하여 선형 시간에 정수를 "거의 정렬"하는이 작업에 대한 기존 작업이 있습니까? 아래의 알고리즘 또는 그 변형이 기존 이름을 가지고 있습니까?

편집 : 알고리즘을 수정하고 더 많은 설명을 추가했습니다.


연산:

INPUT: V an array of size n containing positive integers
OUTPUT: T

N = Σ_{i<n} V[i]
Create n buckets indexed by 1..n
For i in 1..n
| Add V[i] into the bucket min(floor(N/V[i]),n)
+

For bucket 1 to bucket n
| For each element in the bucket
| | Append element to T
| +
+

이 알고리즘은 다음과 같은 이유로 의도 된대로 작동합니다.

  1. 소자 경우 버킷에 다음 . vjvN/j

    v 는 버킷 에 들어가 므로 j ≤ \ lfloor N / v \ rfloor ≤ N / vj=min(N/v,n)jN/vN/v

  2. 소자 경우 버킷에 다음 중 또는 . vjN/(j+1)<vj=n

    vJ = ( N / V , N ) J = N / V J = N J = N / V J N / V < J + 1 N / ( J + 1 ) < V 는 버킷 에 들어가 므로 또는 입니다. 첫 번째 경우 는 을 의미하므로 입니다.j=min(N/v,n)j=N/vj=nj=N/vjN/v<j+1N/(j+1)<v

  3. 용 있다 기껏 버킷 요소 1 내지 .j<njj

    하자 및하자 버킷의 1..j 하나의 원소의 총 개수가 될. 함으로써 2 우리는 모든 요소가 있는지 버킷 (와 )되도록이고 . 따라서 에서 까지의 버킷에있는 모든 요소 의 합 는 보다 큽니다 . 그러나 합 또한보다 작 따라서 따라서 우리에게 제공 또는 .j<nkviijN/(j+1)N/(i+1)<vK1jk×N/(J+1)KNk×N/(j+1)<KNk/(j+1)<1k<j+1kj

  4. T 만족하는 (*), 즉 의 번째 원소 그러한하다jTT[j]N/j

    함으로써 3. 우리는이 상기 의 번째 원소 , 버킷에서 유래 와 따라서 .T[j]jTiijT[j]N/iN/j

  5. 이 알고리즘은 선형 시간이 걸립니다.

    의 계산 에는 선형 시간이 걸립니다. 버킷은 삽입 및 반복 이있는 연결 목록으로 구현할 수 있습니다 . 중첩 루프는 요소가있는 횟수만큼 (즉, 회) 실행됩니다.NO(1)n


1
질문을 무시하지 말고 (+1, 좋은 질문입니다) 기수 정렬이 필요한 것 이상을 수행하지 않습니까?
user541686

@Mehrdad : 의견 주셔서 감사합니다! 기수 정렬은 정수를 정렬하지만 시간 가 소요됩니다 . O(nlog(maxivi))
a3nm

그 시간 복잡성에 대해 바람직하지 않은 것이 무엇인지 언급 할 수 있습니까? 당신은 일이 개 있습니까 매우 큰 정수를 다른 모든 것들, 예를 들어, 작은?
user541686 April

1
@ a3nm 기수 정렬은 O (n log n)가 아니며 O (n)이므로 정수의 크기가 고정 된 경우 선형입니다 (예 : 32 비트 숫자 또는 64 비트 숫자). 정렬 한 숫자의 크기가 다양합니까?
Xavier Combelle

1
@ XavierCombelle : 예, RAM 모델에서 작업 중이며 입력 정수가 상수로 묶여 있다고 가정 할 수 없습니다.
a3nm

답변:


8

이것은 ASort 알고리즘과 매우 비슷합니다. Giesen 등의이 기사를 참조하십시오. 알. :

https://www.inf.ethz.ch/personal/smilos/asort3.pdf

불행히도, 실행 시간은 선형 적이 지 않습니다. 위의 기사는 n 2 / ν ( n ) 내의 항목을 비교하는 임의의 비교 기반 무작위 알고리즘 이 n * l o g ( ν ( n ) ) 의 하한을 가짐을 증명합니다 ( ν ( n ) < n으로 가정 ).nn2/ν(n)nlog(ν(n))ν(n)<n


질문의 설명에 대한 답변으로 EDIT :

당신이하고있는 일은 단순히 버킷 정렬 입니다. 그러나 버킷 정렬 알고리즘은이 경우 선형 적이 지 않습니다. 문제 : 자연수를 합한 다음 각각에 대해 나눗셈을 수행해야합니다. 숫자의 크기는 제한 이 없으므로 는 더 이상 일정한 시간 작업이 아닙니다. 더 많은 숫자를 합산하는 데 시간이 더 걸립니다.N/V[i]

얼마나 더? 나누기는 자릿수에 따라 다르므로 n 나누기 연산을 곱한 값 입니다. 아마 익숙한 것 같습니다. :)lg(n)n


1
이 기사를 알려 주셔서 감사합니다! 실제로 그것은 질문과 관련이 있습니다. 그러나 내 알고리즘 (원본 버전이나 약간 다른 개정 버전이 아님)은 ASort;와 유사하지 않습니다. 첫째, 내 알고리즘이 ASort와 같은 초 선형 시간이 아닌 에서 실행된다고 생각 합니다. 둘째, 기준 (*)은 스피어 맨의 발자국 거리와 거의 다릅니다. 예를 들어, 기준 (*)은 푸트 거리와 달리 정수 값에 따라 다소 엄격합니다. 셋째, 알고리즘과 ASort 모두 버킷 요소이지만 기준은 매우 다릅니다. O(n)
a3nm

@ a3nm 위에서 게시 한 내용을 명확하게하면 버킷 정렬을 사용하는 것이 좋습니다.이 분류 는 선형이며 비교 기준이 아니며 두 항목을 서로 테스트하는 것을 의미합니다. 문제는 모든 수학 정수에서 작동하지 않는다는 것입니다. 정수 크기가 제한된 경우에만 작동합니다.
Trixie Wolf

"정수 크기가 바인드 된 경우에만 작동합니다"라고 말하면 실제로 정수를 정렬하는 경우에만 해당됩니다. 그러나 일반적으로 게시 한 알고리즘은 실제로 정렬하지 않으며 약한 기준 (*) 만 시행합니다. 따라서 정수 크기가 제한되지 않은 경우에도 선형 시간으로 실행된다고 생각합니다.
a3nm

2
@ a3nm 선형이 아닙니다. 위의 확장 된 답변을 참조하십시오.
Trixie Wolf

답변 주셔서 감사합니다. 지연에 대해 죄송합니다. 모델에 대해 약간의 혼란이 있다고 생각합니다. 나는 균일 한 시간 측정을 가진 RAM 모델에서 일하고 있습니다 (van Emde Boas, 기계 모델 및 시뮬레이션, 핸드북 계산서에서와 같이). 내가 조작하는 숫자는 로그 크기를 가질 수 있지만이 숫자에 대한 산술 연산에는 단가가 있습니다. 그에 따라 내 질문을 편집했습니다. 이 모델에서 제안하는 알고리즘은 실제로 선형 시간으로 실행됩니다 (물론이 모델에서는 실제 비교 기반 정렬 의 하한이 여전히 적용됨). nlogn
a3nm

2

결과적으로, 내 질문은 결국 관련이 없습니다. 실제로, 나는 균일 한 비용 측정으로 RAM 기계에서 일하고 있습니다 (즉, 레지스터가 반드시 일정한 크기는 아니지만 레지스터에 정수 크기의 정수를 저장할 수있는 레지스터가 있으며 입력에 대한 연산은 일정한 시간이 걸립니다) 적어도 추가). 실제로이 모델에서 정수 정렬 (기본적으로 기수 정렬 수행)을 선형 시간으로 수행 할 수 있습니다. 1996 년 논문에서 정렬, 선형 시간 및 만족도 문제에 대해 설명 합니다.

(이것은 정수 세트를 "거의 정렬"한다는 잘 연구 된 개념이 있는지에 대한 나의 질문에 대답하지 않지만, 흥미롭게하기 위해서는 아마도 더 약한 개념을 적용하기 위해 더 약한 개념이 필요할 것입니다. 모델이나 어떻게 든 하위 선형 시간으로 실행되지만 현재는 이것이 어떤 의미인지 잘 모릅니다.)

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