문제

사과 사과이 질문이 솔루션 검증과 같지 않지만이 질문은 대학원 입학 시험에 묻는 질문이 있으며이 질문이 많이 있습니다 :

$ n $ 요소를 빈 링크 된 목록으로 삽입하는 최악의 시간 복잡성은 링크 된 목록을 정렬 된 순서로 유지 해야하는 경우

내 의견으로는 $ o (n ^ 2) $ 이어야합니다. 모든 삽입에서는 원격을 올바른 위치에 삽입해야합니다. 모든 요소가 마지막 위치에 삽입되어야 할 수 있으므로 $ 1 + 2 + ... (n-1) + n= o (n ^ 2) $

그러나 $ o (n \ log n) $ 에서 요소를 먼저 정렬 할 수 있다고 말하면서 우리는 하나를 삽입 할 수 있습니다 $ o (n) $ 에서 $ o (n \ log n) $ < / span>.

주어진 질문의 표현에서 어떤 솔루션이 더 적절합니까? 내 의견으로는 "링크 된 목록이 정렬 된 순서로 유지되어야합니다"라는 질문이 언급하기 때문에, 나는 사전에 요소를 정렬 한 다음 정렬 된 순서로 삽입 할 수 없다고 말하는 경향이 있습니다.

도움이 되었습니까?

해결책

질문은 대상 목록이 정렬 된 순서로 유지되어야한다고합니다. 사용할 수있는 다른 데이터 구조에 대해서는 아무 말도하지 않습니다. 제안 된 솔루션은 먼저 삽입 할 인수의 일부 전처리를 수행하고 삽입을 적절하게 수행합니다. 이것은 문제 문에서 허용됩니다.

요소를 삽입하는 대신이 작업을 수행 할 수있는 실용적인 이유는 링크 된 목록 개체가 항상 정렬 해야하는 다른 스레드와 공유하는 경우에도 정렬 할 수 있습니다. (이러한 시나리오에서는 하나의 요소를 삽입하는 것이 원자형인지 확인해야합니다. 따라서이 질문은 이상한 요구 사항에 대해 이상한 요구 사항을 만드는 것이 아닙니다. 그것은 진짜 프로그래밍 세계에서 자주 발생하는 요구 사항의 일종의 요구 사항입니다.

동일한 복잡성을 갖는 다른 솔루션은 요소를 대상 목록에 삽입하고 대상 목록의 노드 포인터에 요소 값을 매핑하는 병렬 데이터 구조를 유지하는 것입니다. 각 요소를 삽입하려면 맵핑에서 앞의 요소를 찾아 본 노드 뒤에 새 요소를 삽입하십시오. 이는 삽입 프로세스가 실행되는 것처럼 목록 노드를 생성한다고 가정합니다 (기존 공백 노드를 채우는 것과는 반대로).

이 질문은 알고리즘보다 독해력에 대한 자세한 것입니다. 그것이 단어가되는 방식, 그것은 약간의 트릭 질문입니다. 정확한 읽기에 의존하기 때문에 다소 좋지는 않지만 $ o (n) $ 을 삽입 할 요소를 얻는 요소를 얻는 것과 같은 몇 가지 주요 가정을 진행하지 못합니다. $ o (1) $ 에서 두 개의 요소를 비교할 수 있으며 입력 도메인은 효과적으로 무한증이 없습니다 (운동 : $ o (n) $ 알고리즘은 입력이 $ [1,42] $ 의 정수 인 경우. 그러나 주어진 대답은 정확합니다.

보조 데이터 구조를 사용할 방법이 없음을 가정하게 만들었습니다. 보조 데이터 구조를 사용하여 문제가되는 문제가되는 것은 아무것도 없습니다. 보조 데이터 구조를 금지하는 간단한 방법은 $ o (1) $ 메모리 오버 헤드를 요구하는 것입니다.

이 가정 하에서도 당신의 추론이 잘못되었거나 적어도 부정확합니다. 요소가 올바른 순서로 주어진 것을 알고 있으면 목록의 꼬리에 대한 포인터를 유지하고 $ O (n)을 삽입 할 수 있습니다. $ . 최악의 경우는 모든 요소가 대상 목록의 마지막 위치에 삽입되어야하지만 목록을 횡단 할 때 마지막 위치에 도달 한 경우가 아닙니다. 최악의 경우는 실제로 $ \ theta (n ^ 2) $ 을 증명하기 위해서는 목록에서 삽입 지점을 찾는 것이 $ \ theta (n) $ 시간, 포인터가 목록에있는 의 거리가 $ \ omega (n) $ . 이것은 일정한 숫자 $ a $ (암시 적으로 $ a= 1 $ ) $ k / a $ 노드를 트래버스해야합니다. -container "> $ k $ 최악의 경우 삽입

다른 팁

Fibonacci 힙을 알고있는 최상의 구조는 $ o (1) $ 에 요소를 삽입하고 $ o (\ log (n)) $ 이는 $ o (n \ log)를 사용하는 모든 요소의 정렬 된 순서가 필요합니다.(n) $ 새 요소를 삽입하는 동안 $ o (1) $ 은 이것을 따라갈 수있는 다른 구조를 알고 있습니다.

정말 까다로운 질문입니다.우선 O (NLOgn)의 복잡성은 요소 (비교 알고리즘) 간의 비교를 사용하는 알고리즘에만 적용됩니다.또한 숫자가 숫자를 메모리에 저장 해야하는 비트의 크기에 의존하는 radix 정렬과 같은 비교 비교가 아닌 알고리즘이 있습니다.따라서 알고리즘을 미리 숫자를 정렬 할 수 있다고 가정하면 숫자가 Naturals이고 최대 요소가 m <10이므로 Radix 정렬이 최악의 경우 O (10N)= O (엔).우리가 가정을 할 수 없다면 당신은 옳습니다.링크 된 목록을 사용할 수 있고 더 이상 (어떤 종류의 인덱싱 없음)을 사용할 수있는 경우 복잡성은 O (n ^ 2) (버블 정렬)입니다.

O (n)이어야합니다. 알고리즘을 따라 -

1) 연결된 목록이 비어 있으면 노드를 머리를 반환하십시오.

2) 삽입 할 노드 값이 더 작 으면 헤드 노드의 값보다 다음 노드를 삽입하십시오. 처음에는 머리를 만듭니다.

3) 루프에서 적절한 노드를 찾아서 입력 노드가 삽입 될 것입니다.

헤드에서 적절한 노드를 찾으려면, 가치가있는 노드에 도달 할 때까지 계속 이동하십시오. 입력 노드.그 직전의 노드는 적절한 노드

4) 해당 노드 뒤에 노드를 삽입하십시오. 3 단계

에서 발견되었습니다

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 cs.stackexchange
scroll top