[binary-tree] 이진 트리의 응용 프로그램은 무엇입니까?

이진 트리의 특정 응용 프로그램이 무엇인지 궁금합니다. 실제 사례를 제시해 주시겠습니까?



답변

이진 트리 의 성능에 대한 논쟁 은 의미가 없습니다. 데이터 구조가 아니라 성능 특성이 다른 데이터 구조 패밀리입니다. 이 것은 사실이지만 불균형 이진 나무 보다 훨씬 더 수행 자체 균형 이진 트리 검색을위한 많은 이진 트리가 있습니다 (예 : 바이너리 시도 등) 하는 “균형” 아무 의미가 없습니다.

이진 트리의 응용

  • 이진 검색 트리 – 여러 언어 라이브러리의 객체 및 객체 와 같이 데이터가 지속적으로 들어오고 나가는 많은 검색 응용 프로그램에서 사용됩니다 .mapset
  • 이진 공간 파티션 -거의 모든 3D 비디오 게임에서 렌더링 할 객체를 결정하는 데 사용됩니다.
  • 이진 시도 -라우터 테이블을 저장하기 위해 거의 모든 고 대역폭 라우터에서 사용됩니다.
  • 해시 트리 -해시를 확인해야하지만 전체 파일을 사용할 수없는 p2p 프로그램 및 특수 이미지 서명에 사용됩니다.
  • -효율적인 우선 순위 큐를 구현하는 데 사용되며, 여러 운영 체제의 프로세스 스케줄링, 라우터의 서비스 품질 및 A * (로봇 및 비디오 게임을 포함한 AI 애플리케이션에 사용되는 경로 찾기 알고리즘)에 사용됩니다. . 힙 정렬에서도 사용됩니다.
  • 허프만 코딩 트리 ( Chip Uni )-.jpeg 및 .mp3 파일 형식에서 사용하는 것과 같은 압축 알고리즘에 사용됩니다.
  • GGM 트리 -의사 난수 트리를 생성하기 위해 암호화 응용 프로그램에서 사용됩니다.
  • 구문 트리 -표현식을 구문 분석하기 위해 컴파일러 및 (암시 적으로) 계산기로 구성됩니다.
  • Treap- 무선 네트워킹 및 메모리 할당에 사용되는 무작위 데이터 구조.
  • T- 트리 -대부분의 데이터베이스는 드라이브에 데이터를 저장하기 위해 특정 형태의 B- 트리를 사용하지만, 대부분의 데이터를 메모리에 유지하는 데이터베이스는 종종 T- 트리를 사용합니다.

이진 트리가 검색을 위해 n-ary 트리보다 자주 사용되는 이유는 n-ary 트리가 더 복잡하지만 일반적으로 실제 속도 이점이 없기 때문입니다.

m노드가 있는 (균형) 이진 트리 에서 한 레벨에서 다음 레벨로 이동하려면 한 번의 비교가 필요 log_2(m)하며 총 log_2(m)비교를 위해 레벨 이 있습니다 .

반대로, n-ary 트리는 이진 검색 을 사용하여 다음 레벨로 이동하기 위해 log_2(n)비교 가 필요 합니다. 이 때문에 총 수준의 검색이 필요합니다 = 비교는 총. 따라서 n-ary 트리는 더 복잡하지만 필요한 총 비교 측면에서 이점이 없습니다.log_n(m)log_2(n)*log_n(m)log_2(m)

(단, n-ary 트리는 여전히 틈새 상황에 유용합니다. 즉시 떠오르는 예는 쿼드 트리 및 다른 공간 분할 트리입니다. 여기서 레벨 당 두 개의 노드 만 사용하여 공간을 분할하면 논리가 불필요하게 복잡해집니다. 제한 수준이 각 수준에서 수행되는 비교 횟수가 아니라 하드 드라이브에서 한 번에로드 할 수있는 노드 수인 많은 데이터베이스에서 사용되는 B- 트리 )


답변

대부분의 사람들이 이진 트리에 대해 이야기 할 때, 이진 검색 트리 에 대해 생각하지 않는 것보다 더 흔하기 때문에 먼저 다룰 것입니다.

불균형 이진 검색 트리는 실제로 학생들에게 데이터 구조에 대한 교육 이상을 제공하는 데 유용합니다. 데이터가 비교적 임의의 순서로 나오지 않는 한 단순한 이진 트리의 균형 이 맞지 않기 때문에 트리가 최악의 형태로 쉽게 변질 될 수 있기 때문 입니다.

좋은 사례 : 한 번은 조작 및 검색을 위해 데이터를 이진 트리에로드 한 일부 소프트웨어를 수정해야했습니다. 데이터를 정렬 된 형식으로 작성했습니다.

Alice
Bob
Chloe
David
Edwina
Frank

다시 읽을 때 다음 트리로 끝났습니다.

  Alice
 /     \
=       Bob
       /   \
      =     Chloe
           /     \
          =       David
                 /     \
                =       Edwina
                       /      \
                      =        Frank
                              /     \
                             =       =

이것은 퇴화 형태입니다. 해당 트리에서 Frank를 찾으면 6 개의 노드를 모두 검색해야 찾을 수 있습니다.

이진 트리는 균형을 잡을 때 검색에 정말 유용합니다. 여기에는 루트 노드를 통해 하위 트리를 회전하여 두 하위 트리 사이의 높이 차이가 1 이하가되도록합니다. 한 번에 하나씩 위의 이름을 균형 트리에 추가하면 다음과 같은 시퀀스가 ​​제공됩니다.

1.   Alice
    /     \
   =       =

 

2.   Alice
    /     \
   =       Bob
          /   \
         =     =

 

3.        Bob
        _/   \_
   Alice       Chloe
  /     \     /     \
 =       =   =       =

 

4.        Bob
        _/   \_
   Alice       Chloe
  /     \     /     \
 =       =   =       David
                    /     \
                   =       =

 

5.           Bob
        ____/   \____
   Alice             David
  /     \           /     \
 =       =     Chloe       Edwina
              /     \     /      \
             =       =   =        =

 

6.              Chloe
            ___/     \___
         Bob             Edwina
        /   \           /      \
   Alice     =      David        Frank
  /     \          /     \      /     \
 =       =        =       =    =       =

항목이 추가됨에 따라 전체 하위 트리가 왼쪽으로 회전하는 것을 볼 수 있습니다 (3 단계와 6 단계 O(log N)에서 O(N). 어느 시점에서도 가장 높은 NULL ( =)은 둘 이상의 레벨만큼 가장 낮은 것과 다릅니다. 그리고, 위의 최종 트리에, 당신은 (세 개의 노드를보고 프랭크을 찾을 수 있습니다 Chloe, Edwina마지막으로하고 Frank).

물론 이진 트레스가 아닌 균형 잡힌 멀티 웨이 트리 를 만들 때 더 유용 할 수 있습니다 . 이는 각 노드가 하나 이상의 항목을 보유 함을 의미합니다 (기술적으로 N 항목과 N + 1 포인터를 보유합니다. 이진 트리는 1 항목과 2 포인터가있는 단방향 다중 경로 트리의 특수한 경우입니다).

3 방향 트리를 사용하면 다음과 같이 끝납니다.

  Alice Bob Chloe
 /     |   |     \
=      =   =      David Edwina Frank
                 /     |      |     \
                =      =      =      =

일반적으로 항목 인덱스의 키를 유지 관리하는 데 사용됩니다. 노드가 정확히 디스크 블록 크기 (예 : 512 바이트) 인 하드웨어에 최적화 된 데이터베이스 소프트웨어를 작성했으며 단일 노드에 가능한 많은 키를 넣었습니다. 포인터 이 경우 실제로 인덱스 파일에서 별도의 고정 길이 레코드 직접 액세스 파일에 기록 수 있었다 (그래서 레코드 번호는 X단지에 추구로 볼 수 있습니다 X * record_length).

예를 들어 포인터가 4 바이트이고 키 크기가 10 인 경우 512 바이트 노드의 키 수는 36입니다. 총 36 개의 키 (360 바이트)와 37 개의 포인터 (148 바이트)는 총 508 바이트입니다. 노드 당 4 바이트가 낭비됩니다.

다 방향 키를 사용하면 2 단계 검색 (노드에서 올바른 키를 찾기 위해 작은 순차적 (또는 선형 이진) 검색과 결합 된 올바른 노드를 찾기위한 다 방향 검색)의 복잡성이 발생하지만 장점은 다음과 같습니다. 이보다 더 적은 디스크 I / O를 수행합니다.

메모리 내 구조 에서이 작업을 수행 할 이유가 없습니다. 균형 이진 트리를 고수하고 코드를 간단하게 유지하는 것이 좋습니다.

또한 데이터 세트가 작을 때 O(log N)오버 의 장점이 O(N)실제로 나타나지는 않습니다. 주소록에 15 명을 저장하기 위해 다 방향 트리를 사용하는 경우 아마 과잉 일 수 있습니다. 지난 10 년 동안 수십만 고객의 모든 주문과 같은 것을 저장할 때 장점이 있습니다.

big-O 표기법의 요점은 N무한대 에 접근 할 때 발생하는 상황을 나타내는 것 입니다. 어떤 사람들은 동의하지 않을 수도 있지만 데이터 세트가 특정 크기 이하로 유지되는 것이 확실하다면 다른 방법으로 거품 정렬을 사용하는 것이 좋습니다. 🙂


이진 트리의 다른 용도와 관련하여 다음과 같은 많은 것들이 있습니다.

  • 높은 키가 왼쪽 (또는 아래 또는 오른쪽 및 오른쪽)이 아닌 낮은 키보다 높 거나 같은 이진 힙 .
  • 해시 테이블과 유사한 해시 트리;
  • 컴퓨터 언어 컴파일을위한 추상 구문 트리;
  • 데이터 압축을위한 허프만 트리;
  • 네트워크 트래픽을위한 라우팅 트리.

검색 트리에 대해 생성 한 설명이 많으면 다른 것에 대해 자세하게 설명하고 싶지만 원하는 경우 조사하기에 충분해야합니다.


답변

의 조직 모스 부호는 이진 트리입니다.

이진 트리

모스 식 부호


답변

이진 트리는 각 노드에 최대 두 개의 자식 노드가 있으며 일반적으로 “왼쪽”과 “오른쪽”으로 구분되는 트리 데이터 구조입니다. 자식이있는 노드는 부모 노드이며 자식 노드는 부모에 대한 참조를 포함 할 수 있습니다. 트리 외부에는 “루트”노드 (모든 노드의 조상)가있는 경우 종종 참조가 있습니다. 데이터 구조의 모든 노드는 루트 노드에서 시작하여 왼쪽 또는 오른쪽 자식에 대한 참조를 반복하여 도달 할 수 있습니다. 이진 트리에서 모든 노드의 정도는 최대 2입니다.

이진 트리

이진 트리는 그림에서 볼 수 있듯이 트리에서 노드를 찾으려면 최대 6 회만 보이기 때문에 유용합니다. 예를 들어 노드 24를 검색하려면 루트에서 시작합니다.

  • 루트의 값은 31이며 24보다 큽니다. 따라서 왼쪽 노드로 이동합니다.
  • 왼쪽 노드의 값은 15이며 24보다 작으므로 오른쪽 노드로 이동합니다.
  • 오른쪽 노드의 값은 23이며 24보다 작으므로 오른쪽 노드로 이동합니다.
  • 오른쪽 노드의 값은 27이며 24보다 큽니다. 따라서 왼쪽 노드로 이동합니다.
  • 왼쪽 노드의 값은 25보다 큰 24이므로 왼쪽 노드로 이동합니다.
  • 노드의 값은 24이며 이는 우리가 찾고있는 핵심입니다.

이 검색은 다음과 같습니다.
트리 검색

첫 번째 패스에서 전체 트리 노드의 절반을 제외 할 수 있음을 알 수 있습니다. 왼쪽 하위 트리의 절반은 두 번째입니다. 이것은 매우 효과적인 검색을 가능하게합니다. 이 작업이 40 억 개의 요소에서 수행 된 경우 최대 32 회만 검색하면됩니다. 따라서 트리에 포함 된 요소가 많을수록 검색 효율이 높아집니다.

삭제가 복잡해질 수 있습니다. 노드에 0 또는 1 개의 자식이있는 경우 삭제하려는 포인터를 제외하기 위해 일부 포인터를 이동하면됩니다. 그러나 자식이 2 개인 노드는 쉽게 삭제할 수 없습니다. 그래서 우리는 지름길을 취합니다. 노드 19를 삭제하려고한다고 가정하겠습니다.

삭제 1

왼쪽 및 오른쪽 포인터를 어디로 옮길 지 결정하기가 쉽지 않기 때문에 대체 포인터를 찾습니다. 왼쪽 하위 트리로 가서 가능한 한 오른쪽으로갑니다. 이것은 우리가 삭제할 노드의 다음으로 큰 값을 제공합니다.

삭제 3

이제 왼쪽 및 오른쪽 포인터를 제외한 18 개의 내용을 모두 복사하고 원래 18 개의 노드를 삭제합니다.

삭제 4


이러한 이미지를 만들기 위해 자체 균형 트리 인 AVL 트리를 구현하여 언제든지 트리가 리프 노드 (자식이없는 노드)간에 최대 한 수준의 차이를 갖도록합니다. 이렇게하면 O(log n)삽입 및 삭제에 약간의 시간이 소요 되므로 트리가 기울어지지 않고 최대 검색 시간이 유지 됩니다.

다음은 내 AVL 트리가 가능한 작고 균형을 유지 한 방법을 보여주는 샘플입니다.

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

정렬 된 배열에서 조회는 여전히 O(log(n))나무처럼 걸리지 만 무작위 삽입 및 제거에는 나무 대신 O (n)이 필요합니다 O(log(n)). 일부 STL 컨테이너는 이러한 성능 특성을 활용하여 삽입 및 제거 시간이 최대로 걸리므로 O(log n)매우 빠릅니다. 이러한 컨테이너 중 일부는 map, multimap, set, 및 multiset.

AVL 트리의 예제 코드는 http://ideone.com/MheW8 에서 찾을 수 있습니다.


답변

주요 응용 프로그램은 이진 검색 트리 입니다. 검색, 삽입 및 제거가 모두 매우 빠른 데이터 구조입니다 ( log(n)작업 에 대해 ).


답변

  • 이진 트리는 허프만 코딩 에 사용되며 압축 코드로 사용됩니다.
  • 이진 트리는 이진 검색 트리 에서 사용되며 추가 공간없이 데이터 레코드를 유지 관리하는 데 유용합니다.

답변

언급되지 않은 이진 트리의 한 가지 흥미로운 예는 재귀 적으로 평가 된 수학적 표현입니다. 기본적으로 실용적인 관점에서 쓸모는 없지만 그러한 표현을 생각하는 흥미로운 방법입니다.

기본적으로 트리의 각 노드는 고유 한 값을 갖거나 하위 값을 조작하여 재귀 적으로 평가됩니다.

예를 들어, 표현식 (1+3)*2은 다음과 같이 표현 될 수 있습니다.

    *
   / \
  +   2
 / \
1   3

표현을 평가하기 위해 부모의 가치를 요구합니다. 이 노드는 자식, 플러스 연산자 및 단순히 ‘2’를 포함하는 노드에서 값을 가져옵니다. 더하기 연산자는 값이 ‘1’과 ‘3’인 하위 항목에서 값을 가져 와서 더한 다음 4를 곱셈 노드로 반환하여 8을 반환합니다.

이진 트리의 사용은 동작이 수행되는 순서가 동일하다는 의미에서 광택 표기법을 역전시키는 것과 유사하다. 또한 주목할 점은 반드시 이진 트리 일 필요는 없으며, 가장 일반적으로 사용되는 연산자는 이진일뿐입니다. 가장 기본적인 수준에서 이진 트리는 실제로 매우 단순한 순전히 기능적인 프로그래밍 언어입니다.