알고리즘 : O (n)과 O (nlog (n))을 어떻게 합합니까?


22

중복을 찾아서 제거하는 다음 알고리즘이 있습니다.

public static int numDuplicatesB(int[] arr) {
    Sort.mergesort(arr);
    int numDups = 0;
    for (int i = 1; i < arr.length; i++) {
        if (arr[i] == arr[i - 1]) {
            numDups++;
} }
    return numDups;
}

최악의 경우 시간 복잡성을 찾으려고합니다. 나는 mergesort가라는 것을 알고 nlog(n)있으며 내 for 루프에서 전체 데이터 세트를 반복하여로 계산합니다 n. 그래도이 숫자로 무엇을해야할지 잘 모르겠습니다. 같이 정리하면 되나요? 그렇게하려면 어떻게해야합니까?


1
참고 사항 : 메모리 요구 사항에 따라 해시 테이블을 사용하여 O (n) 에서이 작업을 수행 할 수 있습니다.
corsiKa

답변:


67
O(n) + O(n log(n)) = O(n log(n))

Big O의 복잡성에 대해 관심이있는 것은 지배적 인 용어입니다. n log(n)지배 n그게 당신이 걱정하는 유일한 용어가 그래서.


4
이것을 생각하는 또 다른 방법은 O (n) 처리가 두 개의 독립적 인 정렬을 한 것처럼 실제로 O (n log n)라고 상상하는 것입니다. 그러면 2 * O (n log n)이됩니다. 그러나 상수가 느슨해 졌으므로 다시 O (n log n)으로 돌아갑니다.
Jonathan Eunice

4
@Jonathan 실제로 작동하지만 O (n)이 O (n log (n))과 같지 않다는 것은 매우 사실 이므로 정기적으로 사용하지 않는 것이 좋습니다.
Aza

17
@Emrakul 사실 이론적으로는 이론적으로도 건전하고 실용적이라고 생각합니다. O (n)은 O (n log (n))의 올바른 하위 집합입니다. 따라서 f (n)이 O (n)에 속하면 O (n log (n))에도 속합니다.
emory

17
우리가 말할 때 주목해야한다 f(n) is O(g(n))우리가 정말 말을하는지하는 기능이다 f is a member of the set of functions that grows at the rate of at most g(n) over the long term. 이것은 모든 구성원이 의미 O(n)도의 구성원입니다 O(n*log(n)). +표현식에서이 좋아 O(f(n)) + O(g(n))실제로 세트 조합 (당신이 정말로 현학적있어, 당신이 정말로 사용해야하는 ∪)을 참조하십시오.
Lie Ryan

3
@LieRyan 원래는 공용체로 설정되지 않고 합계를 설정 A + B = { a + b | a in A, b in B }합니다. 형식 집합의 경우 O(g(n))집합 중 하나가 항상 다른 집합의 하위 집합이므로 둘 다 합에 불변하므로 (즉, A + A = A) 집합 집합과 동일합니다. 네이트는 본질적으로 똑같이 썼다.
Paŭlo Ebermann

56

그것을 통해 우리의 길을 추론하고의 정의를 기억합시다 O. 내가 사용할 것은 무한대의 한계입니다.

당신은 당신의 점근 경계를 해당하는 두 개의 작업을 수행 할 것을 주장에 정확 O(n)하고 O(nlog(n))있지만, 하나의 경계로 결합하면 두 가지 기능을 추가하는 등 간단하지 않다. 당신은 당신의 기능이 적어도 O(n)시간 이 걸리고 또한 적어도 시간 이 걸린다는 것을 알고 있습니다 O(nlog(n)). 그래서 정말 기능의 복잡성 클래스의 조합입니다 O(n)O(nlog(n))O(nlog(n))의 상위 집합입니다 O(n)그냥 그래서 정말 O(nlog(n)).


12
+1 이것이 답이되어야합니다. compsci 용어를 사용하여 답변을보다 정확하게 설명합니다.

5

당신이 그것을 길게 설정하려고한다면 대략 다음과 같이 보일 것입니다 :

총 시간이 다음과 같다고 가정하자 : a + bbn log (n), 여기서 a와 b는 상수입니다 (낮은 순서는 무시).

n이 무한대로 가면 (an + bn log (n)) / n log (n)-> a / log (n) + b-> b

따라서 총 시간은 O (bn log (n)) = O (n log (n))입니다.


2

O ()의 정의로 시작하십시오.

O (n log n)는 "n이 큰 경우 C n log n 미만"을 의미합니다.

O (n)은 "n이 큰 경우 Dn 미만"을 의미한다.

둘 다 추가하면 결과는 C n log n + D n <C n log n + D n log n <(C + D) n log n = O (n log n)보다 작습니다.

일반적으로 큰 n에 대해 f (n)> C g (n)이고 일부 C> 0이면 O (f (n)) + O (g (n)) = O (f (n))입니다. 그리고 O ()의 정의를 사용하여 몇 가지 사례를 수행 한 후에는 할 수있는 것과 할 수없는 것을 알 수 있습니다.


1

큰 O 표기법은 세트로 정의됩니다.

여기에 이미지 설명을 입력하십시오

따라서 여기에 이미지 설명을 입력하십시오임의의 큰 지점에서 시작하여 여기에 이미지 설명을 입력하십시오항상 g보다 작은 모든 함수가 포함됩니다 .

이제 함수가 여기에 이미지 설명을 입력하십시오있고 g보다 느리게 증가하는 다른 함수 를 실행하면 확실히 2g보다 느리게 증가합니다. 따라서 g보다 느린 것을 실행하면 복잡도 클래스가 변경되지 않습니다.

더 공식적으로 :

f, h \ in \ mathcal {O} (g) \ 오른쪽 화살표 (f + h) \ in \ mathcal {O} (g)

쉽게 증명할 수 있습니다.

TL; DR

여전히 n 로그 (n)

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