k 순서 연결 목록을 주문 하시겠습니까?

다니엘

나는 여기에서 해결책을 읽고 있었다 : https://leetcode.com/problems/merge-k-sorted-lists/solution/ k 정렬 된 연결 목록을 하나의 연결 목록으로 통합하는 방법에 대해.

사소한 해결책은 2 개의 연결 목록에 대한 작업을 수행하는 함수를 작성하고 처음 2 개 목록에서 호출 한 다음 이전 결과와 3 번째 연결 목록으로 다시 호출 한 다음 이전 결과와 4 번째 연결 목록 등으로 다시 호출하는 것입니다.

보다 효율적인 또 다른 솔루션은 다음을 수행하는 것입니다.

k목록을 페어링하고 각 쌍을 병합합니다.

첫 번째 페어링 후 목록은 평균 길이를 가진 k목록으로 병합 된 다음 , 으로 병합됩니다 .k/22N/kk/4k/8

최종 정렬 된 연결 목록을 얻을 때까지이 절차를 반복합니다.

제 질문은 두 번째가 더 효율적인 이유 입니다. 저는 우리가 다른 순서로 같은 일을하고 있다고 생각하기 때문에이 사실을 받아들이기를 거부합니다. 그 개선은 어디에서 왔습니까? 더 빨리 만들기 위해 어떤 사실을 사용 했습니까?

나는 마지막 코멘트에서 내 질문을 명확히했다.

리우 칭 위안

i 번째 연결 목록의 l[i]길이가이고 모든 연결 목록의 총 길이 가라고 가정 해 보겠습니다 L. 또한 두 개의 순서가 지정된 목록의 양방향 병합에는 O(a+b)시간이 복잡 하다는 것을 알고 있다고 가정합니다 . 여기서는 a첫 번째 목록의 길이이고 두 번째 목록 b의 길이입니다.

두 번째 솔루션 (솔루션 2)은 입력 데이터가 배열되는 방식에 관계없이 안정적인 시간 복잡도를 갖습니다. 연결 목록의 내용은 log k답변을 얻기 전에 여러 번 병합 되었으므로 O(L log k)모든 경우에 전체 시간 복잡성이 있습니다.

이제 첫 번째 솔루션 (솔루션 1)을 고려해 보겠습니다. 모두 l[i]가 같은 경우 (모든 연결 목록의 길이가 같음) 를 고려하면 총 시간 비용 T은 다음과 같습니다.

T = l[1] * k + l[2] * (k-1) + ... + l[k] * 1
  = l[1] * k(k+1) / 2
  = L * (k+1)/2

즉, 솔루션 1의 최악의 경우 시간 복잡성은 O(Lk)이며 이는 분명히 더 느립니다.

솔루션 1의 직접적인 개선은 길이에 따라 목록을 병합하는 것이지만 실제로는 도움이되지 않습니다. 길이에 따른 목록 정렬은 자유롭지 않으며, 앞서 언급 한 경우 분명히 도움이되지 않으므로 최악의 시간 복잡성이 개선되지 않습니다.

솔루션 2는 최악의 경우와 대부분의 경우에 더 좋습니다. 솔루션 1이 더 빠른 경우를 구성 할 수 있지만 솔루션 1이 전체적으로 더 나은 것은 아닙니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

CTE 문자열 연결을 단순화 하시겠습니까?

분류에서Dev

연결 목록에서 인덱스 항목을 제거 하시겠습니까?

분류에서Dev

연결 목록에서 삭제 하시겠습니까?

분류에서Dev

단일 연결 목록에서 특정 값을 삭제 하시겠습니까?

분류에서Dev

Azure CloudConfiguration 파일에서 연결 문자열을 선택하도록 Entity Framework를 구성 하시겠습니까?

분류에서Dev

성장 순서에 따라 어설 션을 주문 하시겠습니까?

분류에서Dev

C에서 연결 목록을 알파벳순으로 정렬하는 데 문제가 있습니다.

분류에서Dev

하위 문자열을 연결 하시겠습니까?

분류에서Dev

Azure 연결 문자열을 Django 웹앱과 연결 하시겠습니까?

분류에서Dev

Rust에서 양방향 연결 목록을 어떻게 구현 하시겠습니까?

분류에서Dev

ST 변환에서 값을 연결 하시겠습니까?

분류에서Dev

Java에서 배열을 연결 하시겠습니까?

분류에서Dev

데이터 클래스에서 Kotlin의 문자열 배열을 연결 하시겠습니까?

분류에서Dev

Moqui-SSL 연결을 통해 IMAP 서버에 연결 하시겠습니까?

분류에서Dev

Bash : 그룹 내에서 열을 주문 하시겠습니까?

분류에서Dev

JS : bool 목록을 간결한 문자열로 변환 하시겠습니까?

분류에서Dev

목록에서 문자열을 연결하는 데 문제가 있습니다.

분류에서Dev

목록에서 중복 된 연속 튜플을 제거 하시겠습니까?

분류에서Dev

연결된 목록 노드 내에서 문자 배열을 읽습니까?

분류에서Dev

주문 항목을 만들거나 간단한 전자 상거래 데이터베이스의 주문에 LineItem을 연결 하시겠습니까?

분류에서Dev

해결 / 실행 시간 순서로 약속을 해결 하시겠습니까?

분류에서Dev

여기서 어떻게 넘어갈 지 잘 모르겠습니다. 연결 목록을 사용하여 검색 하시겠습니까?

분류에서Dev

불변 연결 목록에서 순환을 만들 수 있습니까?

분류에서Dev

불변 연결 목록에서 순환을 만들 수 있습니까?

분류에서Dev

목록에서 중복 문자열을 제거 하시겠습니까?

분류에서Dev

R에서 여러 목록 열을 하나의 목록 열로 결합 하시겠습니까?

분류에서Dev

이중 연결 목록에서 항목 범위를 이동 하시겠습니까? [씨]

분류에서Dev

Android에서 Spotify 대기열을 다시 주문 하시겠습니까?

분류에서Dev

SignalR을 사용하여 WinForm 서버에 연결 하시겠습니까?

Related 관련 기사

  1. 1

    CTE 문자열 연결을 단순화 하시겠습니까?

  2. 2

    연결 목록에서 인덱스 항목을 제거 하시겠습니까?

  3. 3

    연결 목록에서 삭제 하시겠습니까?

  4. 4

    단일 연결 목록에서 특정 값을 삭제 하시겠습니까?

  5. 5

    Azure CloudConfiguration 파일에서 연결 문자열을 선택하도록 Entity Framework를 구성 하시겠습니까?

  6. 6

    성장 순서에 따라 어설 션을 주문 하시겠습니까?

  7. 7

    C에서 연결 목록을 알파벳순으로 정렬하는 데 문제가 있습니다.

  8. 8

    하위 문자열을 연결 하시겠습니까?

  9. 9

    Azure 연결 문자열을 Django 웹앱과 연결 하시겠습니까?

  10. 10

    Rust에서 양방향 연결 목록을 어떻게 구현 하시겠습니까?

  11. 11

    ST 변환에서 값을 연결 하시겠습니까?

  12. 12

    Java에서 배열을 연결 하시겠습니까?

  13. 13

    데이터 클래스에서 Kotlin의 문자열 배열을 연결 하시겠습니까?

  14. 14

    Moqui-SSL 연결을 통해 IMAP 서버에 연결 하시겠습니까?

  15. 15

    Bash : 그룹 내에서 열을 주문 하시겠습니까?

  16. 16

    JS : bool 목록을 간결한 문자열로 변환 하시겠습니까?

  17. 17

    목록에서 문자열을 연결하는 데 문제가 있습니다.

  18. 18

    목록에서 중복 된 연속 튜플을 제거 하시겠습니까?

  19. 19

    연결된 목록 노드 내에서 문자 배열을 읽습니까?

  20. 20

    주문 항목을 만들거나 간단한 전자 상거래 데이터베이스의 주문에 LineItem을 연결 하시겠습니까?

  21. 21

    해결 / 실행 시간 순서로 약속을 해결 하시겠습니까?

  22. 22

    여기서 어떻게 넘어갈 지 잘 모르겠습니다. 연결 목록을 사용하여 검색 하시겠습니까?

  23. 23

    불변 연결 목록에서 순환을 만들 수 있습니까?

  24. 24

    불변 연결 목록에서 순환을 만들 수 있습니까?

  25. 25

    목록에서 중복 문자열을 제거 하시겠습니까?

  26. 26

    R에서 여러 목록 열을 하나의 목록 열로 결합 하시겠습니까?

  27. 27

    이중 연결 목록에서 항목 범위를 이동 하시겠습니까? [씨]

  28. 28

    Android에서 Spotify 대기열을 다시 주문 하시겠습니까?

  29. 29

    SignalR을 사용하여 WinForm 서버에 연결 하시겠습니까?

뜨겁다태그

보관