BK 트리

BK-tree

BK 트리는 월터 오스틴 버크하드와 로버트 M. 켈러[1] 의해 제안된 미터법 트리다.단순성을 위해 정수 이산형 메트릭 , y) 을(를) 고려하십시오 그러면 BK-tree는 다음과 같은 방법으로 정의된다.임의 요소 a가 루트 노드로 선택된다.루트 노드는 0개 이상의 하위 트리를 가질 수 있다.k-th 하위 트리는 ( , b)= 과 같은 모든 요소 b로 재귀적으로 구축된다 BK-tree는 사전에서 대략적인 문자열 일치를 위해 사용될 수 있다.[2][example needed]

BK-트리의 예

이 그림은 레벤스테인 거리를 이용하여 얻은 단어 {"책", "책", "케이크", "부", "분", "쿡", "케이크", "케이프", "케이프", "카트"의 W 셋트의 BK 트리를 묘사하고 있다.

  • 각 노드 (는) ;
  • , v) 은(는) d = d ,) 로 레이블이 지정되며, w는 에 할당된 단어를 나타낸다

BK 트리는 다음과 같이 제작된다.

  • BK 트리의 모든 노드 에 대해 송신 호에 할당된 중량은 구별된다.
  • 모든 호 = ( , ) 대해 각 하위 v v, u) {\') k}:
    • 예 1: "책"에서 "책"까지의 호를 고려한다.{"book", "boo", "boon", "cook"}의 "book"과 "cook" 사이의 거리는 1과 같다.
    • 예 2: "책"에서 "부"까지의 호를 고려한다.{"boo", "bun", "쿡"}의 "책"과 임의의 단어 사이의 거리는 2와 같다.

삽입

삽입 원시 값은 개별 메트릭 에 따라 BK 트리 을(를) 채우는 데 사용된다

입력:

  • : BK-트리;
    • v , v)
    • 은(는) 노드 에 할당된 단어를 의미한다.
  • : t 에서 사용하는 이산형 메트릭(예: Levenshtein 거리);
  • : 에 삽입할 요소

출력:

  • 에 해당하는 의 노드

알고리즘:

  • 이(가) 비어 있는 경우:
    • 루트 노드 생성
    • 반품
  • 을(를) t 의 루트로 설정하십시오.
  • 이(가) 있는 동안:
    • = 인 경우
      • 반품
    • v= (와) 같은 의 자식 을(를) 찾으십시오.
    • (를) 찾을 수 없는 경우:
      • v 생성
      • , ) 생성
      • 반품

찾다

검색 요소 w를) 지정하면 조회 원시 요소는 BK-트리를 통과하여 w 의 가장 가까운 요소를 찾는다핵심 아이디어는 BK 트리 조직과 삼각불평등(컷오프 기준)을 활용해 지금까지 발견된 최고의 후보만을 개선할 수 있는 노드들로 스타일 탐사를 제한하자는 것이다.

입력:

  • : BK-트리;
  • : 해당 이산 측정지표(예: 레벤슈테인 거리);
  • : 검색된 요소;
  • : 의 일치와 w 사이에 허용되는 최대 거리는 + 로 기본 설정됨

출력:

  • b s : 저장되고 또는or 따라 저장된 에 가장 가까운 요소;

알고리즘:

  • (가) 비어 있는 경우:
    • 반품
  • 할 노드 집합의 을(를) 생성하고 의 루트를 S 삽입하십시오
  • 동안
    • 에서 임의 노드 을(를) 팝업
    • d < :
    • 송신u , )대해
      • v- d < : (차단 기준)
        • 을(를) 삽입하십시오
  • 반품

조회 알고리즘 예제

위에 표시된 8-노드 B-K 트리의 예를 들어 = w"cool"을 설정하십시오.트리의 루트를 포함하도록 이(가) 초기화되며, 이후 ="book"과 함께 의 첫 번째 값으로 펑크가 발생한다.추가 = ""에서 ""까지의 거리가 2이므로 2 {\displaystyle 이고, d = 2 (가) 지금까지 발견된 가장 좋은(즉, 가장 작은) 거리인 것이다.다음으로 루트로부터 나가는 각 호를 차례대로 고려한다: "책"에서 "책"까지의 호는 무게가 이며, - = 1 이(가) b t= 보다 작기 때문에 "책"을 포함하는 를 S S}에 삽입하여 추가 처리를 한다.The next arc, from "book" to "cake," has weight 4, and since is not less than , the node containing "cake" is not inserted into . Therefore the subtree rooted at "cake" will be pruned from the search, as the word closest to "cool"은 해당 하위 트리에 나타날 수 없다.이 가지치기 작업이 올바른 이유를 보려면, "케이크" 하위 트리에 나타나는 후보 단어 이(가) 2 - "쿨"을 나타내는 삼각형 불평등을 위반한다는 것을 주목하십시오. 삼각형 불평등은 이 세 개의 숫자 집합에 대해 (삼각형의 측면으로), 두 개의 숫자를 세 번째 숫자 이하로 합칠 수 없지만, 여기서는 디스플레잉을 참조하십시오."cool"에서 "book"(이 2인)까지의 탠스와 "cool"에서 ""까지의 거리이 2인 미만는 "book"에서 "cake"(이 4인)까지의 거리에 도달하거나 초과할 수 없다.그러므로 "케이크"에 뿌리를 둔 하위 트리 전체를 무시해도 무방하다.

다음으로 "책"을 포함하는 노드가 에서 펑크 났으며, 이제 = "쿨"에서 "책"까지의 거리. > e {\는 2로 설정된 상태로 유지되며, "책"을 포함하는 노드의 단일 송신 호를 고려한다.다음으로, "boo"를 포함하는 노드는 "cool"에서 "boo"까지의 S = 에서 펑크가 난다.이것은 또 다시 dbes 있어=2{\displaystyle d_{최고의}=2에}."야유"에서 각각의 외향적이고 아크 지금으로 간주되면이고,"야유""요긴한 것"에 이르는 아크 무게 1 가지고 있으며, 이후 2− 1=1<>개선되지 않는다;dbes 있어=2{\displaystyle 2=1<, d_{최고의}=2},"요긴한 것"포함에 S{S\displaystyle}. 마찬가지로부터. 2−= < "쿡"도 S 에 추가된다

마지막으로 의 마지막 두 요소를 임의의 순서로 고려한다. "쿡"을 포함하는 노드를 먼저 펑크하여 t{\를 거리 1로 개선한 다음, "분"을 포함하는 노드가 마지막으로 펑크(boon)을 터뜨려 "쿨"과 거리가 2이므로 최상의 r이 개선되지 않는다고 가정한다.esult. 마지막으로, "쿡"은 t w_{과(와 b e s = 1 {\d_}로 반환된다

참고 항목

참조

외부 링크

  • 테스트 결과 및 성능 그래프를 포함한 Common Lisp의 BK 트리 구현.
  • BK-Tree 및 미터법 공간과의 관계에 대한 설명 [3]
  • C# [4]에서 구현된 BK-Tree에 대한 설명
  • Lua에서 BK-트리 구현 [5]
  • Python의 BK 트리 구현 [6]