B 데이터 구조의 TREE: 검색, 삽입, 삭제 Opera예시

B 트리란 무엇입니까?

B 트리 데이터를 더 빠르고 메모리 효율적인 방식으로 검색, 삽입 및 삭제하기 위한 특정 규칙 집합을 기반으로 하는 셀프 밸런싱 데이터 구조입니다. 이를 달성하기 위해 다음 규칙을 따라 B 트리를 만듭니다.

B-트리는 데이터 구조에서 특별한 종류의 트리입니다. 이 방법은 1972년 맥크레이트가 처음 도입했고, 바이어는 이를 높이 균형 m-방향 검색 트리라고 명명했습니다. 정렬된 데이터를 보존하고 삽입, 검색, 삭제와 같은 다양한 작업을 더 짧은 시간 내에 수행할 수 있도록 도와줍니다.

B-트리에 대한 규칙

B_Tree 생성에 있어서 중요한 규칙은 다음과 같습니다.

  • 모든 리프는 동일한 레벨에서 생성됩니다.
  • B-Tree는 "순서"(프로그래머와 같은 외부 행위자에 의해 지정됨)라고도 불리는 정도에 따라 결정됩니다.
    m

    앞으로. 의 가치

    m

    데이터가 주로 저장된 디스크의 블록 크기에 따라 달라집니다.

  • 노드의 왼쪽 하위 트리는 하위 트리의 오른쪽보다 작은 값을 갖습니다. 즉, 노드도 왼쪽에서 오른쪽으로 오름차순으로 정렬됩니다.
  • 하위 노드, 루트 노드 및 해당 하위 노드가 포함할 수 있는 최대 하위 노드 수는 다음 공식으로 계산됩니다.
    m – 1

    예 :

    m = 4
    max keys: 4 – 1 = 3
    

B-트리에 대한 규칙

  • 루트를 제외한 모든 노드에는 다음의 최소 키가 포함되어야 합니다.
    [m/2]-1

    예 :

    m = 4
    min keys: 4/2-1 = 1
    
  • 노드가 가질 수 있는 최대 자식 노드 수는 해당 차수와 같습니다.
    m
  • 노드가 가질 수 있는 최소 자식 수는 차수의 절반, 즉 m/2입니다(상한 값이 사용됨).
  • 노드의 모든 키는 오름차순으로 정렬됩니다.

B-Tree를 사용하는 이유

B-Tree를 사용하는 이유는 다음과 같습니다.

  • 디스크에 대한 읽기 수를 줄입니다.
  • B 트리는 디스크 크기에 따라 크기(즉, 하위 노드 수)를 조정하여 쉽게 최적화할 수 있습니다.
  • 대용량 데이터를 처리하기 위해 특별히 고안된 기술입니다.
  • 데이터베이스와 파일 시스템에 유용한 알고리즘입니다.
  • 대규모 데이터 블록을 읽고 쓸 때 선택하는 좋은 선택

B트리의 역사

  • 데이터는 블록 단위로 디스크에 저장되며, 이 데이터를 메인 메모리(또는 RAM)로 가져올 때 데이터 구조라고 합니다.
  • 방대한 데이터의 경우, 디스크에서 하나의 레코드를 검색하려면 전체 디스크를 읽어야 합니다. 이렇게 하면 디스크 접근 빈도가 높아지고 데이터 크기 때문에 시간이 늘어나고 주 메모리 사용량도 늘어납니다.
  • 이를 극복하기 위해 레코드가 상주하는 블록을 기반으로 레코드의 레코드 참조를 저장하는 인덱스 테이블이 생성됩니다. 이를 통해 시간과 메모리 소비가 대폭 줄어듭니다.
  • 방대한 데이터를 보유하고 있으므로 다단계 인덱스 테이블을 생성할 수 있습니다.
  • 다단계 인덱스는 데이터를 자체 균형 방식으로 정렬하기 위해 B 트리를 사용하여 설계할 수 있습니다.

검색 Opera기

검색 작업은 B 트리에서 가장 간단한 작업입니다.

다음 알고리즘이 적용됩니다:

  • 키(값)를 "k"로 검색하도록 합니다.
  • 루트부터 검색을 시작하여 재귀적으로 아래로 탐색합니다.
  • k가 루트 값보다 작으면 왼쪽 하위 트리를 검색하고, k가 루트 값보다 크면 오른쪽 하위 트리를 검색합니다.
  • 노드에 k가 발견되면 간단히 노드를 반환합니다.
  • k가 노드에서 발견되지 않으면 더 큰 키를 가진 하위 항목으로 이동합니다.
  • k가 트리에서 발견되지 않으면 NULL을 반환합니다.

끼워 넣다 Opera기

B 트리는 자체 균형 트리이므로 임의의 노드에 키를 강제로 삽입할 수 없습니다.

다음 알고리즘이 적용됩니다:

  • 검색 작업을 실행하여 적절한 삽입 위치를 찾으세요.
  • 적절한 위치에 새 키를 삽입합니다. 단, 노드에 이미 최대 키 수가 있는 경우 다음을 수행하세요.
  • 노드는 새로 삽입된 키와 함께 중간 요소에서 분할됩니다.
  • 중간 요소는 다른 두 하위 노드의 상위 요소가 됩니다.
  • 노드는 키를 오름차순으로 다시 정렬해야 합니다.
TIP 삽입 알고리즘에 대한 설명으로 틀린 것은 다음과 같습니다.

노드가 가득 차서 분할되고 새 값이 삽입됩니다.

끼워 넣다 Opera기

위의 예에서:

  • 노드에서 키에 대한 적절한 위치를 검색합니다.
  • 대상 노드에 키를 삽입하고 규칙을 확인합니다.
  • 삽입 후 노드에 최소 키 수인 1보다 많은 키가 있습니까? 이 경우에는 그렇습니다. 다음 규칙을 확인하세요.
  • 삽입 후 노드에 최대 키 수인 3개보다 많은 키가 있습니까? 이 경우에는 그렇지 않습니다. 이는 B Tree가 어떤 규칙도 위반하지 않고 삽입이 완료되었음을 의미합니다.

끼워 넣다 Opera기

위의 예에서:

  • 노드가 최대 키 수에 도달했습니다.
  • 노드가 분할되고 가운데 키가 나머지 두 노드의 루트 노드가 됩니다.
  • 키 개수가 짝수인 경우 왼쪽 바이어스 또는 오른쪽 바이어스에 의해 중간 노드가 선택됩니다.

끼워 넣다 Opera기

위의 예에서:

  • 노드에 최대 키 미만이 있습니다.
  • 1 옆에 3이 삽입되었으나 오름차순 규칙을 위반했습니다.
  • 이 문제를 해결하기 위해 키가 정렬됩니다.

마찬가지로 13과 2는 노드에 대한 최대 키 규칙보다 적게 충족되므로 노드에 쉽게 삽입될 수 있습니다.

끼워 넣다 Opera기

위의 예에서:

  • 노드에는 최대 키와 동일한 키가 있습니다.
  • 키가 대상 노드에 삽입되었지만 최대 키 규칙을 위반합니다.
  • 대상 노드가 분할되고 왼쪽 바이어스에 의한 가운데 키가 이제 새 하위 노드의 상위가 됩니다.
  • 새 노드는 오름차순으로 정렬됩니다.

마찬가지로 위의 규칙과 사례를 바탕으로 나머지 값도 B Tree에 쉽게 삽입할 수 있습니다.

끼워 넣다 Opera기

. Opera기

삭제 작업은 삽입 및 검색 작업보다 규칙이 더 많습니다.

다음 알고리즘이 적용됩니다:

  • 검색 작업을 실행하고 노드에서 대상 키를 찾습니다.
  • 다음 섹션에서 설명한 대로 대상 키의 위치를 ​​기준으로 세 가지 조건이 적용됩니다.

대상 키가 리프 노드에 있는 경우

  • Target 최소 키보다 더 많은 리프 노드에 있습니다.
  • 이를 삭제해도 B Tree의 속성을 침해하지 않습니다.
  • Target 리프 노드에 있고 최소 키 노드가 있습니다.
  • 이를 삭제하면 B Tree의 속성에 위배됩니다.
  • Target 노드는 바로 왼쪽 노드 또는 바로 오른쪽 노드(형제)에서 키를 빌릴 수 있습니다.
  • 동생이 말하겠지 최소 키 개수보다 많은 경우
  • 키는 상위 노드에서 빌려오고, 최대값은 상위 노드로 전송되며, 상위 노드의 최대값은 대상 노드로 전송되고, 대상 값은 제거됩니다.
  • Target 리프 노드에 있지만 형제 중 최소 키 수보다 많은 키가 없습니다.
  • 키 검색
  • 형제 및 최소 상위 노드와 병합
  • 이제 총 키가 최소보다 많아집니다.
  • 대상 키는 상위 노드의 최소값으로 대체됩니다.

대상 키가 내부 노드에 있는 경우

  • 순서대로 선행자 또는 순서대로 후임자를 선택합니다.
  • 순서대로 전임자의 경우 왼쪽 하위 트리에서 최대 키가 선택됩니다.
  • 순차 후속 항목의 경우 오른쪽 하위 트리의 최소 키가 선택됩니다.
  • 대상 키의 순차 선행 키가 최소 키보다 많은 경우에만 대상 키를 순차 선행 키의 최대값으로 대체할 수 있습니다.
  • 대상 키의 순서대로 선행 키가 최소 키보다 많지 않은 경우 순서대로 후속 작업의 최소 키를 찾습니다.
  • 대상 키의 순서대로 선행 키와 후속 키가 모두 최소 키보다 작은 경우 선행 키와 후속 키를 병합합니다.

대상 키가 루트 노드에 있는 경우

  • 순서대로의 선행 하위 트리의 최대 요소로 교체
  • 삭제 후 대상의 최소 키 미만인 경우 대상 노드는 형제의 부모를 통해 형제로부터 최대 값을 빌립니다.
  • 부모의 최대값은 대상에 의해 사용되지만 노드는 형제의 최대값을 사용합니다.

이제 예를 들어 삭제 작업을 알아보겠습니다.

. Opera기

위의 다이어그램은 B-트리에서 삭제 작업의 다양한 사례를 보여줍니다. 이 B-트리는 5차이며, 이는 모든 노드가 가질 수 있는 최소 자식 노드 수가 3이고 모든 노드가 가질 수 있는 최대 자식 노드 수가 5임을 의미합니다. 반면 모든 노드가 가질 수 있는 최소 및 최대 키 수는 각각 2와 4입니다.

. Opera기

위의 예에서:

  • 대상 노드에 삭제할 대상 키가 있습니다.
  • 대상 노드에 최소 키보다 많은 키가 있습니다.
  • 키를 삭제하면 됩니다.

. Opera기

위의 예에서:

  • 대상 노드에는 최소 키와 동일한 키가 있으므로 조건을 위반하므로 직접 삭제할 수 없습니다.

다음 다이어그램은 이 키를 삭제하는 방법을 설명합니다.

. Opera기

  • 대상 노드는 직계 형제(이 경우에는 순서대로의 후속 노드(오른쪽 형제)가 없기 때문에 순서대로의 전임자(왼쪽 형제))로부터 키를 빌립니다.
  • 중위 선행 노드의 최대값은 상위 노드로 전송되고, 상위 노드는 최대값을 대상 노드로 전송합니다(아래 다이어그램 참조).

다음 예제는 값이 필요한 키를 순서대로 나열된 후속 키에서 삭제하는 방법을 보여줍니다.

. Opera기

  • 대상 노드는 직계 형제, 이 경우 순서대로의 후속 노드(오른쪽 형제)로부터 키를 빌립니다. 왜냐하면 순서대로의 전임자(왼쪽 형제)가 최소 키와 동일한 키를 갖기 때문입니다.
  • 순서대로 계승되는 노드의 최소값은 상위 노드로 전달되고, 상위 노드는 최대값을 대상 노드로 전달합니다.

아래 예에서 대상 노드에는 대상 노드에 키를 제공할 수 있는 형제가 없습니다. 그러므로 병합이 필요합니다.

해당 키를 삭제하는 절차를 참조하세요.

. Opera기

  • 부모 키와 함께 직계 형제 노드와 대상 노드를 병합합니다.
  • 두 병합 노드 사이에 있는 형제 노드의 키가 선택됩니다.
  • 병합된 노드에서 대상 키 삭제

. Opera의사 코드

private int removeBiggestElement()
{
    if (root has no child)
        remove and return the last element
    else {
        answer = subset[childCount-1].removeBiggestElement()
        if (subset[childCount-1].dataCount < MINIMUM)
            fixShort (childCount-1)
        return answer
    }
}

산출:

B-Tree에서 가장 큰 요소가 삭제됩니다.

요약

  • B 트리는 디스크에서 데이터를 더 효과적으로 검색, 삽입 및 삭제하기 위한 자체 균형형 데이터 구조입니다.
  • B 트리는 지정된 정도에 따라 규제됩니다.
  • B 트리 키와 노드는 오름차순으로 정렬됩니다.
  • B 트리의 검색 작업은 가장 간단한 작업으로, 항상 루트에서 시작하여 대상 키가 노드 값보다 크거나 작은지 확인합니다.
  • B 트리의 삽입 작업은 다소 세부적입니다. 먼저 대상 키에 대한 적절한 삽입 위치를 찾고, 이를 삽입하고, 다양한 경우에 대해 B 트리의 유효성을 평가한 다음, 이에 따라 B 트리 노드를 재구성합니다.
  • B 트리의 삭제 연산은 먼저 삭제할 대상 키를 검색하여 삭제한 후, 대상 노드의 최소, 최대 키, 형제 노드, 부모 노드 등 여러 가지 사례를 기반으로 유효성을 평가합니다.