접두사 트리(Trie)는 문자열 저장 및 일치에 주로 사용되는 데이터 구조입니다. 이번 글에서는 Golang을 이용하여 Prefix Tree를 구현하는 방법을 소개하겠습니다.
사전 트리라고도 불리는 접두사 트리는 문자열 모음을 저장하는 데 사용되는 트리 형태의 데이터 구조로, 주로 많은 양의 텍스트에서 특정 문자열을 효율적으로 찾는 데 사용됩니다. 해시 테이블과 같은 다른 데이터 구조와 비교할 때 접두사 트리의 시간 복잡도는 O(k)입니다. 여기서 k는 찾을 문자열의 길이를 나타냅니다.
접두사 트리의 핵심 개념은 "노드"이며, 각 노드에는 다음 정보가 포함됩니다.
2.1 삽입
접두사 트리에 문자열을 삽입할 때 루트 노드부터 탐색을 시작해야 합니다.
구체적인 단계는 다음과 같습니다.
현재 노드를 루트 노드로 초기화합니다.2.2 찾기
문자열을 찾을 때 루트 노드부터 탐색을 시작해야 한다.
구체적인 단계는 다음과 같습니다.
현재 노드를 루트 노드로 초기화합니다.2.3 삭제
문자열을 삭제할 때 루트 노드부터 순회를 시작해야 합니다.
구체적인 단계는 다음과 같습니다.
현재 노드를 루트 노드로 초기화합니다.Golang은 접두사 트리를 구현합니다.
type Trie struct { children map[byte]*Trie isLeaf bool } func NewTrie() *Trie { return &Trie{children: make(map[byte]*Trie)} } func (t *Trie) Insert(word string) { curr := t for i := 0; i < len(word); i++ { c := word[i] if _, ok := curr.children[c]; !ok { curr.children[c] = NewTrie() } curr = curr.children[c] } curr.isLeaf = true } func (t *Trie) Search(word string) bool { curr := t for i := 0; i < len(word); i++ { c := word[i] if _, ok := curr.children[c]; !ok { return false } curr = curr.children[c] } return curr.isLeaf } func (t *Trie) Delete(word string) { nodes := make([]*Trie, 0) curr := t for i := 0; i < len(word); i++ { c := word[i] if _, ok := curr.children[c]; !ok { return } nodes = append(nodes, curr) curr = curr.children[c] } curr.isLeaf = false if len(curr.children) > 0 { return } for i := len(nodes) - 1; i >= 0; i-- { node := nodes[i] delete(node.children, word[i]) if len(node.children) > 0 || node.isLeaf { return } } }
코드에서 NewTrie() 함수는 새로운 접두사 트리 노드를 만드는 데 사용됩니다. Insert() 함수는 Search()에 문자열을 삽입하는 데 사용됩니다. 함수는 문자열을 찾는 데 사용됩니다. 접두사 트리에 존재하는지 여부는 문자열을 삭제하는 데 사용됩니다.
요약위 내용은 접두사 트리 golang 구현의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!