사전 트 리, 사전 트 리 코드
사전 트 리 는 말 그대로 알파벳 등 문자열 을 처리 하 는 특수 한 데이터 구조 이다.말하자면 스물 여섯 갈래 나무 다.머리 지침 을 정의 하고 머리 지침 부터 시작 합 니 다.
사전 트 리 분석:
단어의 주파 수 를 통계 하 는 방식 에 대해 서도 hash 같은 방법 을 사용 할 수 있 지만 사전 트 리 를 사용 하 는 것 이 좋 습 니 다. 사전 트 리 는 접 두 사 를 통계 할 수 있 지만 hash 에 서 는 실현 할 수 없습니다.
극단 적 인 상황 에서 각 노드 아래 에 26 개의 자모 가 있 으 면 차지 하 는 공간 은 26 ^ n 이 고 그 중에서 n 은 단어의 평균 길 이 를 나타 낸다.그러나 단어 에 대해 많은 노드 가 나타 날 수 없고 일부 노드 는 고주파 로 나타난다. 예 를 들 어 단어의 접두사 pre 등 이다. 그러면 사전 트 리 로 빠 른 검색 과 삽입 을 할 수 있 고 단어의 주파수 와 접 두 사 를 통계 할 수 있어 매우 효율 적 이다.
두 가지 상용 동작 이 있 습 니 다. 1. 어떤 문자열 의 출현 횟수 를 조회 합 니 다.이 문자열 이 끝 날 때 까지 노드 마다 count 를 0 으로 설정 합 니 다. 끝 에 count + +. 이렇게 하면 이 문자열 의 출현 횟수 를 기록 합 니 다.2. 특정한 문자열 의 특정한 시퀀스 가 나타 나 는 횟수 를 조회 합 니 다.각 노드 의 count 가 0 으로 초기 화 되 었 습 니 다. 한 문 자 를 읽 으 면 count + + 입 니 다.이렇게 조회 할 때 이 노드 count 는 처음부터 이 노드 까지 특정한 서열 이 나타 나 는 횟수 를 기록 합 니 다.단 어 를 집계 할 수 있 는 접두사 같은 제목 입 니 다.
#include <string>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <assert.h>
using namespace std;
#define MAX 26 //the total number of alphabet is 26, a...z
struct Dictree
{
bool word;
int count;
struct Dictree *trie[MAX]; // the 26 child
} * a;
int init() // init the chained list
{
a = new Dictree;
for(int i = 0; i < MAX; i++)
{
a->trie[i] = NULL;
a->word = false;
}
return 0;
}
bool searchTrie(char *str)
{
int len, res;
Dictree *head = a;
assert(head);
len = strlen(str);
for(int i = 0; i < len; i++)
{
res = (int)(str[i] - 'a');
if(head->trie[res] == NULL)
return false;
head = head->trie[res];
}
if(head->word)
return true;
return false;
}
int insertTrie(char *str)
{
int len, res;
Dictree *head = a;
len = strlen(str);
for(int i = 0; i < len; i++)
{
res = int(str[i] - 'a');
if(head->trie[res] == NULL) //whether the node exist?
{
head->trie[res] = new Dictree;
head = head->trie[res];
head->count = 0;
for(int j = 0; j < MAX; j++)
{
head->trie[j] = NULL;
head->word = false;
}
}
else
head = head->trie[res];
}
head->count++;
head->word = true;
return head->count;
}
int main()
{
char str[20];
init();
for(int i = 0; i < 10; i++)
{
scanf("%s", str);
printf("%d
", insertTrie(str));
}
scanf("%s", str);
printf("%s
", searchTrie(str) ? ("YES"):("NO"));
return 0;
}
PS: 1 판 에 Dictree 에 bool word 판정 을 넣 지 않 았 습 니 다. 단 어 를 찾 는 것 이 정확 하지 않 습 니 다. 워드 판정 을 넣 으 면 현재 노드 word = = true 는 뿌리 노드 에서 이 노드 까지 하나의 단 어 를 표시 합 니 다. false 라면 이 노드 가 단어 중간 에 있 음 을 표시 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.