2014-12-27 2 views
2

카운팅 정렬은 O (n + K)의 평균 시간 복잡도를 갖는 정렬 알고리즘이며 카운팅 정렬은 각 입력 요소가 0에서 K 사이의 정수임을 전제로합니다.대용량 입력에 계산 형을 사용하지 않는 이유는 무엇입니까?

왜 ' 우리는 정렬되지 않은 배열에서 최대 값을 선형 검색하고, K와 같으므로 그 위에 계수 형을 적용합니까?

+1

대부분의 경우 정수를 정렬 할 필요가 없습니다. 수반되는 데이터와 함께 정수를 정렬합니다. 간단한 계산 정렬은 그렇게하지 않습니다. – liori

+0

공간의 복잡성은 하나의 문제입니다. 그러나 일반적으로 할 수 있습니다. 적당히 큰 범위의 경우에는 [느리게] (http://stackoverflow.com/a/25001922/645270) 될 것입니다. – keyser

+0

실제로 "메모리 쓰기는 무료"란 무엇을 의미합니까? 복잡한 객체와 구조를 비교하는 것이 또한 계산 비용의 일부임을 기억하십시오. –

답변

3

입력 값이 maximum - minimum = O(n log n) 인 배열 (값의 범위가 합리적으로 제한됨) 인 경우 실제로 적용됩니다. 그렇지 않은 경우 표준 비교 기반 정렬 알고리즘 또는 기수 정렬과 같은 정수 정렬 알고리즘이 점근 적으로 좋습니다.

당신에게 예를하려면, 다음과 같은 알고리즘은 계산 정렬 런타임 복잡성 Θ(n^2)을 가지고있는 입력의 가족을 생성

def generate_input(n): 
    array = [] 
    for i := 1 to n: 
     array.append(i*i); 
    shuffle(array) 
    return array 
+0

K = O (n log n)의 의미를 설명해 주시겠습니까? K는 상수입니다. 상수는 어떻게 시간 복잡성을 가질 수 있습니까? – shauryachats

+0

아니요, K는 상수가 아닙니다. K는 입력 함수입니다. 랜다 우의 O 표기법은 명령어 카운트/실행 시간을 나타내는 함수가 아닌 임의의 수학 함수에 사용될 수 있음을 염두에 두십시오 –

+1

@ 조오 :'f (n)'을 주어진 입력 계열에 대한 계산 방식의 런타임이라고합시다. 우리는'f (n) = Θ (n + k) = Θ (n^2)'를 가지므로, 나의 주장은 정확하다. –

1

질문 귀하의 제목은 왜 일종의 카운트 큰 입력에 사용되지 ?

소트 카운팅에서는 무엇을합니까? 다른 배열 (b []를 가정)을 취하고 모든 원소를 0으로 초기화합니다. 그런 다음 해당 인덱스가 지정된 배열의 요소이면 인덱스를 증가시킵니다. 그런 다음 주어진 배열의 하한선에서 상한선까지 루프를 실행하고 가져온 배열 (b [])의 index 요소가 0인지 아닌지 확인하십시오. 0이 아니면 인덱스는 지정된 배열의 요소입니다.

자,이 두 (상한 & 하한)의 차이가 (10^9 이상과 같이) 매우 높으면 단일 루프로 PC를 죽일 수 있습니다. :) 우리 f(n) ∈ O(g(n)) 말할 경우

+0

나는 그 질문이 올 것이라고 기대하고있었습니다. 우리가'std :: map'을 사용하여 그 배열의 요소를 색인 할 수 있다면 생각했습니다. 유일한 문제는 존재하는 요소를 추적하기 위해서 또 다른'std :: set'이있을 것이라는 것이 었습니다. 당신이 저에게 더 나은 것을 말할 수 있다면 이것은 순진한 접근법입니다. – shauryachats

+0

@ShauryaChats'std :: set'과'std :: map' 에의 삽입은 O (log n)입니다. 그래서 count sort가 우선적으로 가지는 이점을 망칠 수 있습니다. 기존 요소를 정렬 된 순서로 반복해야하기 때문에 해시 테이블을 대신 사용할 수는 없습니다. 하지만 후자를 할 수 있다면 더 이상 정렬 할 필요가 없습니다. –

0

Big-O notation definition에 따르면, 그 값과 C > 0n = N 같은 CN 및가 상수 f(n) < C*g(n) 것을 존재한다는 것을 의미한다. C 값에 대해서는 아무 것도 언급되지 않았으며 그 중 부등호가 참인 n = N에 해당하지 않습니다.

모든 알고리즘 분석에서 튜링 기계의 각 작업 비용을 고려해야합니다 (비교, 이동, 합계 등). 이러한 비용의 값은 부등식을 true 또는 false로 바꾸기 위해 CN의 값이 얼마나 크거나 작은지를 정의하는 요소입니다. 이 비용을 제거하는 것은 내가 알고리즘 분석 과정에서했던 익숙한 가정입니다.

문 "종류의 계산이다 O(n+k)"실제로 정렬이 C, NK 상수 곳, n > K, n > N, C 주어진 다항식 및 선형 있음을 의미합니다. 따라서 주어진 조건이 참인 경우에만 부등식이 참이기 때문에 다른 알고리즘은 더 작은 입력에 대해 더 나은 성능을 가질 수 있습니다.