当前位置: 首页 > news >正文

网站空间 windows linux沈阳德泰诺网站建设

网站空间 windows linux,沈阳德泰诺网站建设,wordpress好的播放器,南京网站的优化目录 基本概念 结构特点 优势 代码举例 应用场景 复杂度分析 变种 基本概念 字典树,又称为前缀树或Trie树,是一种树形数据结构,专门用于高效地存储和检索字符串数据集中的键。它的名字来源于单词"retrieval"的中间几个字母&…

目录

基本概念

结构特点

优势

代码举例

应用场景

复杂度分析

变种


基本概念

       字典树,又称为前缀树或Trie树,是一种树形数据结构,专门用于高效地存储和检索字符串数据集中的键。它的名字来源于单词"retrieval"的中间几个字母,强调了其用于快速检索的特性。

结构特点

1. 
   节点结构 :每个节点包含多个子节点(通常对应字符集的大小),一个指向父节点的指针,以及一个标记表示是否为某个单词的结束。
2. 
   路径表示 :从根节点到任意节点的路径表示一个字符串前缀。
3. 
   共享前缀 :具有相同前缀的字符串在树中共享相同的路径,直到前缀结束。
4. 
   根节点 :不包含字符,仅作为所有字符串的起点。


优势

1. 
   高效检索 :查找时间与字符串长度相关,与数据集大小无关,时间复杂度为O(k),其中k是字符串长度。
2. 
   前缀共享 :节省存储空间,尤其是当有大量具有相同前缀的字符串时。
3. 
   前缀匹配 :很容易实现前缀搜索功能。
4. 
   排序便捷 :按字典序遍历树可以得到所有字符串的排序。

代码举例

#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define ALPHABET_SIZE 26/*字典树节点*/
typedef struct TrieNode
{struct TrieNode *children[ALPHABET_SIZE];char character;bool isEndOfWord;} TrieNode;/*创建新节点*/
TrieNode *createTrieNode()
{TrieNode *node;node = malloc(sizeof(TrieNode));node->isEndOfWord = false;int i = 0;while (i < ALPHABET_SIZE){node->children[i] = NULL;i++;}return node;
}/*插入新单词到字典树*/
void insert(TrieNode *root, char *word)
{/*递归地添加单词*///如果单词的长度为0,则返回if ((strlen(word) - 1) != 0){char character = *word;if (root->children[character - 97] == NULL){TrieNode *node = NULL;node = createTrieNode();node->character = character;root->children[character - 97] = node;}word++;insert(root->children[character - 97], word);}else{root->isEndOfWord = true;}return;
}/*在字典树中搜索单词*/
TrieNode *search(TrieNode *root, char *word)
{TrieNode *temp;while (*word != '\0'){char character = *word;if (root->children[character - 97] != NULL){temp = root->children[character - 97];word++;root = temp;}else{printf("No possible words!!\n");return NULL;}}return root;
}/*打印数组*/
void printArray(char chars[], int len)
{int i;for (i = 0; i < len; i++){printf("%c", chars[i]);}printf("\n");
}/*返回所有相关单词*/
void printPathsRecur(TrieNode *node, char prefix[], int filledLen)
{if (node == NULL)return;prefix[filledLen] = node->character;filledLen++;if (node->isEndOfWord){printArray(prefix, filledLen);}int i;for (i = 0; i < ALPHABET_SIZE; i++){printPathsRecur(node->children[i], prefix, filledLen);}
}/*遍历字典树*/
void traverse(char prefix[], TrieNode *root)
{TrieNode *temp = NULL;temp = search(root, prefix);int j = 0;while (prefix[j] != '\0'){j++;}printPathsRecur(temp, prefix, j - 1);
}/*使用字典树文件演示*/#define NUMBER_OF_WORDS (354935)
#define INPUT_WORD_SIZE (100)/*用户输入单词*/
char *receiveInput(char *s)
{scanf("%99s", s);return s;
}int main()
{//读取字典文件int word_count = 0;char *words[NUMBER_OF_WORDS];FILE *fp = fopen("dictionary.txt", "r");if (fp == 0){fprintf(stderr, "Error while opening dictionary file");exit(1);}words[word_count] = malloc(INPUT_WORD_SIZE);while (fgets(words[word_count], INPUT_WORD_SIZE, fp)){word_count++;words[word_count] = malloc(INPUT_WORD_SIZE);}//插入新单词到字典树TrieNode *root = NULL;root = createTrieNode();int i;for (i = 0; i < NUMBER_OF_WORDS; i++){insert(root, words[i]);}while (1){printf("Enter keyword: ");char str[100];receiveInput(str);printf("\n==========================================================\n");printf("\n【********************* Possible Words ********************】\n");// Find the word through the Trietraverse(str, root);printf("\n==========================================================\n");}
}

运行结果:

ubuntu@ubuntu-virtual-machine:~/trie$ ./a.out 
Enter keyword: good luck==========================================================********************* Possible Words ********************
good
goodby
goodbye
goodbyes
goodbys
goodeniaceous
gooder
gooders
goodhap
goodhearted
goodheartedly
goodheartedness
goodhumoredness
goodie
goodies
gooding
goodish
goodishness
goodless
goodlier
goodliest
goodlihead
goodlike
goodliness
goodly
goodman
goodmanship
goodmen
goodnaturedness
goodness
goodnesses
goodnight
goodrich
goods
goodship
goodsire
goodsome
goodtemperedness
goodwife
goodwilies
goodwill
goodwilled
goodwillie
goodwillies
goodwillit
goodwills
goodwilly
goodwily
goodwives
goody
goodyear
goodyish
goodyism
goodyness
goodys
goodyship==========================================================
Enter keyword: 
==========================================================********************* Possible Words ********************
luck
lucked
lucken
luckful
luckie
luckier
luckies
luckiest
luckily
luckiness
lucking
luckless
lucklessly
lucklessness
luckly
lucks
lucky==========================================================
Enter keyword: 

应用场景

1. 
   自动补全 :如搜索引擎、输入法的自动补全功能。
2. 
   拼写检查 :检测输入单词是否存在于词典中。
3. 
   IP路由 :用于快速查找路由表。
4. 
   单词游戏 :如Scrabble、Boggle等游戏中的单词验证。
5. 
   前缀匹配 :如DNA序列分析中的匹配问题。


复杂度分析

时间复杂度 :
  插入:O(k),k为字符串长度
  查找:O(k),k为字符串长度
  删除:O(k),k为字符串长度
空间复杂度 :
  最坏情况:O(n×k),n为字符串数量,k为平均字符串长度
  最好情况:O(∑k),所有字符串共享尽可能多的前缀


变种

1. 
   压缩字典树 :合并只有一个子节点的节点,减少空间使用。
2. 
   二进制字典树 :用于存储二进制数据,常用于异或相关问题。
3. 
   后缀字典树 :用于存储字符串的所有后缀,用于字符串匹配问题。


       字典树是一种非常高效的字符串处理数据结构,尤其适合于有大量共享前缀的字符串集合。尽管在某些情况下可能会占用较多内存,但其出色的检索效率使其在许多应用场景中成为首选。

http://www.dtcms.com/a/460545.html

相关文章:

  • 烟台网站建设外贸wordpress 未登录提示
  • 贵州网站建设公司有哪些江西省赣州市天气预报
  • 平台网站怎么做怎么样利用一些网站开发客户
  • 网站seo问题杭州app开发价格表
  • 合肥知名网站建设公司受欢迎的广州做网站
  • 网站建设需要的网络技术教学网站开发视频
  • 企业网站建设的常见流程wordpress安装地址修改
  • ps做游戏下载网站有哪些制作游戏需要学什么
  • 重庆点优建设网站公司吗wordpress手机模板
  • 网页特效代码免费网站临海做网站
  • 婚恋网站开发微信公众号管理平台app
  • 境外网站开发网络营销职业规划300字
  • 网站提交搜索引擎成都今天重大新闻事件
  • 大连网站建设新图闻柳州小程序制作公司
  • 平台类网站有哪些网站更换空间改版收录
  • 专业外贸网站制作攀枝花仁和住房和城乡建设局网站
  • 有教做点心的网站吗wordpress 摘要不显示
  • 学网站建设要多久网站建设中 模板素材
  • 做网站 十万小程序后端怎么搭建
  • 寒亭营销型网站建设wordpress 进销存
  • 做杂志模板下载网站ppp模式在网站建设的
  • 知识产权教育平台网站开发总结网站开发模板教务管理
  • 天律网站建设上班没事做看什么网站
  • 网站开发 搜索wordpress建站阿里云
  • 平面设计专用网站建一个pc网站需要多少钱
  • 网站怎样建立数据库连接网络营销理论与实务
  • 网站建设报价方案.xlswordpress single页面
  • 网站建设细化流程咸宁商城网站建设
  • 网站建设岗位招聘犀牛建设网站
  • 网站出现的的问题视觉中国网站