- 浏览: 1477843 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (691)
- linux (207)
- shell (33)
- java (42)
- 其他 (22)
- javascript (33)
- cloud (16)
- python (33)
- c (48)
- sql (12)
- 工具 (6)
- 缓存 (16)
- ubuntu (7)
- perl (3)
- lua (2)
- 超级有用 (2)
- 服务器 (2)
- mac (22)
- nginx (34)
- php (2)
- 内核 (2)
- gdb (13)
- ICTCLAS (2)
- mac android (0)
- unix (1)
- android (1)
- vim (1)
- epoll (1)
- ios (21)
- mysql (3)
- systemtap (1)
- 算法 (2)
- 汇编 (2)
- arm (3)
- 我的数据结构 (8)
- websocket (12)
- hadoop (5)
- thrift (2)
- hbase (1)
- graphviz (1)
- redis (1)
- raspberry (2)
- qemu (31)
- opencv (4)
- socket (1)
- opengl (1)
- ibeacons (1)
- emacs (6)
- openstack (24)
- docker (1)
- webrtc (11)
- angularjs (2)
- neutron (23)
- jslinux (18)
- 网络 (13)
- tap (9)
- tensorflow (8)
- nlu (4)
- asm.js (5)
- sip (3)
- xl2tp (5)
- conda (1)
- emscripten (6)
- ffmpeg (10)
- srt (1)
- wasm (5)
- bert (3)
- kaldi (4)
- 知识图谱 (1)
最新评论
-
wahahachuang8:
我喜欢代码简洁易读,服务稳定的推送服务,前段时间研究了一下go ...
websocket的helloworld -
q114687576:
http://www.blue-zero.com/WebSoc ...
websocket的helloworld -
zhaoyanzimm:
感谢您的分享,给我提供了很大的帮助,在使用过程中发现了一个问题 ...
nginx的helloworld模块的helloworld -
haoningabc:
leebyte 写道太NB了,期待早日用上Killinux!么 ...
qemu+emacs+gdb调试内核 -
leebyte:
太NB了,期待早日用上Killinux!
qemu+emacs+gdb调试内核
想起搜狐老大的一句话
看代码先看h文件,擦,当初感觉他这句话很2,现在想想,诶。
代码摘自
shellinabox
看代码先看h文件,擦,当初感觉他这句话很2,现在想想,诶。
代码摘自
shellinabox
// trie.h -- Basic implementation of a trie abstract data type #ifndef TRIE_H__ #define TRIE_H__ #include "libhttp/http.h" struct Trie { void (*destructor)(void *, char *); void *arg; char *key; char *value; int idx; char ch; struct Trie *children; int numChildren; }; struct Trie *newTrie(void (*destructor)(void *, char *), void *arg); void initTrie(struct Trie *trie, void (*destructor)(void *, char *), void *arg); void destroyTrie(struct Trie *trie); void deleteTrie(struct Trie *trie); void addToTrie(struct Trie *trie, const char *key, char *value); char *getFromTrie(const struct Trie *trie, const char *key, char **diff); #endif /* TRIE_H__ */
// trie.c -- Basic implementation of a trie abstract data type #include "config.h" #include <stdlib.h> #include <string.h> #include "libhttp/trie.h" #include "logging/logging.h" struct Trie *newTrie(void (*destructor)(void *, char *), void *arg) { struct Trie *trie; check(trie = malloc(sizeof(struct Trie))); initTrie(trie, destructor, arg); return trie; } void initTrie(struct Trie *trie, void (*destructor)(void *, char *), void *arg) { trie->destructor = destructor; trie->arg = arg; trie->key = NULL; trie->value = NULL; trie->idx = -1; trie->ch = '\000'; trie->children = NULL; trie->numChildren = 0; } void destroyTrie(struct Trie *trie) { if (trie) { free(trie->key); for (int i = 0; i < trie->numChildren; i++) { if (trie->destructor && !trie->children[i].ch) { trie->destructor(trie->arg, trie->children[i].value); } else { check(!trie->children[i].value); } destroyTrie(&trie->children[i]); } free(trie->children); } } void deleteTrie(struct Trie *trie) { destroyTrie(trie); free(trie); } static void addLeafToTrie(struct Trie *trie, char ch, const char *key, int len, void *value) { check (len >= 0); if (len) { check(trie->key = malloc(len)); memcpy(trie->key, key, len); } else { trie->key = NULL; } trie->value = NULL; trie->idx = len; trie->ch = ch; check(trie->children = malloc(sizeof(struct Trie))); trie->numChildren = 1; initTrie(trie->children, trie->destructor, trie->arg); trie->children->value = value; } void addToTrie(struct Trie *trie, const char *key, char *value) { if (trie->numChildren == 0) { addLeafToTrie(trie, '\000', key, strlen(key), value); } else { nextNode:; int len = strlen(key); for (int i = 0; i < trie->idx; i++) { if (key[i] != trie->key[i]) { struct Trie *child; check(child = malloc(2*sizeof(struct Trie))); child->destructor = trie->destructor; child->arg = trie->arg; check(child->key = malloc(trie->idx - i - 1)); memcpy(child->key, trie->key + i + 1, trie->idx - i - 1); child->value = trie->value; child->idx = trie->idx - i - 1; child->ch = trie->key[i]; child->children = trie->children; child->numChildren = trie->numChildren; trie->value = NULL; trie->idx = i; trie->children = child; trie->numChildren = 2; child++; child->destructor = trie->destructor; child->arg = trie->arg; if (key[i]) { addLeafToTrie(child, key[i], key + i + 1, len - i - 1, value); } else { initTrie(child, trie->destructor, trie->arg); child->value = value; } return; } } for (int i = 0; i < trie->numChildren; i++) { if (key[trie->idx] == trie->children[i].ch) { if (trie->children[i].ch) { key += trie->idx + 1; trie = &trie->children[i]; goto nextNode; } else { if (trie->destructor) { trie->destructor(trie->arg, trie->children[i].value); } trie->children[i].value = value; return; } } } key += trie->idx; len -= trie->idx; check(trie->children = realloc( trie->children, ++trie->numChildren*sizeof(struct Trie))); struct Trie *newNode = &trie->children[trie->numChildren-1]; if (*key) { newNode->destructor = trie->destructor; newNode->arg = trie->arg; addLeafToTrie(newNode, *key, key + 1, len - 1, value); } else { initTrie(newNode, trie->destructor, trie->arg); newNode->value = value; } } } char *getFromTrie(const struct Trie *trie, const char *key, char **diff) { if (diff) { *diff = NULL; } struct Trie *partial = NULL; char *partialKey = NULL; for (;;) { if (trie->idx > 0) { if (memcmp(trie->key, key, trie->idx)) { if (diff && partial != NULL) { *diff = partialKey; return partial->value; } return NULL; } key += trie->idx; } for (int i = 0; ; i++) { if (i >= trie->numChildren) { if (diff && partial != NULL) { // If the caller provided a "diff" pointer, then we allow partial // matches for the longest possible prefix that is a key in the // trie. Upon return, the "diff" pointer points to the first // character in the key does not match. *diff = partialKey; return partial->value; } return NULL; } else if (*key == trie->children[i].ch) { if (!*key) { if (diff) { *diff = (char *)key; } return trie->children[i].value; } for (int j = i + 1; j < trie->numChildren; j++) { if (!trie->children[j].ch) { partial = trie->children + j; partialKey = (char *)key; break; } } trie = &trie->children[i]; key++; break; } else if (!trie->children[i].ch) { partial = trie->children + i; partialKey = (char *)key; } } } }
发表评论
-
weak_ptr解决循环引用问题
2021-03-08 21:12 1173C++11引入的三种智能指 ... -
gcc链接顺序
2019-10-12 18:25 634代码在 https://github.com/killinux ... -
c++11的function和bind
2019-09-10 16:12 533参考:https://www.cnblogs.co ... -
opengl的helloworld
2014-10-22 19:41 9031.我提供一个不需要配置环境就可运行的源码。 glut.h放在 ... -
画图板用c++实现和用js实现的websocket版本
2014-10-17 13:02 2130画图板 opencv的c++ #include <o ... -
c语言内存
2014-07-02 10:26 6951、C中内存分为五个区 栈:用来存放函数的形参和函数内的局部变 ... -
重定向stdout到文件
2014-03-05 18:37 5485把stdout重定向到文件 两种方法: 第一种方法没有恢复 ... -
通过nginx远程执行shell
2014-03-03 10:26 5087saltstack远程执行shell,远程管理等返回json已 ... -
c的urldecode
2014-02-28 18:22 1363#include <stdio.h> #in ... -
pthread的pthread_mutex_lock 的使用
2014-02-25 16:54 26145参考http://haoningabc.iteye.com/b ... -
c调用c++
2013-10-12 15:24 1178参考 http://www.cppblog.com/frank ... -
用C语言,实现接收管道输出的结果,并显示
2013-04-23 21:35 1947在shell里利用“|”管道干的事情就是io重定向,把“|”命 ... -
关于char * 与 char[]
2013-04-22 21:56 962问题引入: 在实习过程中发现了一个以前一直默认的错误,同样ch ... -
单向链表翻转
2012-12-25 23:41 1021临时笔记,创建一个链表 #include <stdl ... -
指针函数与函数指针的区别
2012-12-14 22:44 1198一、 1、指针函数是指带指针的函数,即本质是一个函数。函数返回 ... -
指针和数组
2012-11-14 22:40 1069转载http://kan.weibo.com/con/3512 ... -
js备份
2012-10-31 23:56 1726<!DOCTYPE HTML PUBLIC " ... -
线程的helloworld
2012-10-30 21:51 1604#include<stdio.h> #inc ... -
c的书籍
2012-10-30 10:56 1130http://www.acm.uiuc.edu/webmonk ... -
深入理解计算机系统第三章笔记 gcc
2012-10-24 12:11 1531随便写个最简单程序 然后gcc -S 看汇编 在gcc -C ...
相关推荐
用Python实现Trie树的应用,并可以对英汉词典进行导入和检索、添加和删除,最终可以将导入的英汉词典保存到本地磁盘。内附两个.py文件,分别是tree.py和d_gui.py,tree.py是类和方法,d_gui.py是图形界面;一个.txt...
这段代码实现了将字符串插入到Trie树中。对于每个字符,都检查其对应的子节点是否存在,不存在则创建新节点,并递归地向下进行,直到到达字符串末尾。 #### 四、删除操作 删除操作相对复杂,需要考虑两种情况:一是...
### IT笔试面试--Trie树(前缀树)常考题目及解析 #### 概述 Trie树,又称字典树或前缀树,是一种用于快速检索的多叉树结构,广泛应用于字符串处理领域。它能有效地利用字符串的公共前缀来减少存储空间,并在查询...
下面是一个简单的Trie树的实现代码: ```cpp struct Trie { int num; // 记录该节点可以达到的字符串数量 bool terminal; // 是否是终结节点 struct Trie *son[26]; // 26个子节点 }; Trie *NewTrie() { Trie ...
在压缩包中,"trie.c"可能是C语言实现的Trie树代码,而"trie.exe"是编译后的可执行程序,可用于实际操作Trie树。"kmp.py"则是Python实现的KMP算法代码,可以用来进行字符串匹配。"readme.txt"通常包含有关项目或代码...
这个项目“基于Trie树模仿谷歌百度搜索框提示”旨在实现类似谷歌和百度搜索引擎的自动补全功能。我们将深入探讨Trie树数据结构以及如何使用Java来构建这样的系统。 首先,我们要理解什么是Trie树,也被称为前缀树或...
Trie树,又称前缀树或字典树,是一种用于存储字符串的数据结构,它在IT领域尤其是数据结构和算法的学习中占据着重要的地位。这个压缩包包含的“王赟.doc”和“王赟.ppt”很可能是关于Trie树的详细讲解和实践题目,...
### ACM Trie树详解 #### 一、Trie树的基本概念 **Trie树**,又称为**字典树**或**前缀树**,是一种用于高效存储和检索字符串的树形数据结构。它通过利用字符串之间的公共前缀来减少查询时间,从而提高搜索效率。...
**哈希 Trie 树(HashTrie)与字典树(Trie树)详解** 哈希 Trie 树,也称为 HashTrie 或者是哈希化的 Trie 树,是一种结合了哈希表和 Trie 数据结构特点的数据结构。它在 Trie 树的基础上引入了哈希函数,提高了...
**DoubleArrayTrie(双数组Trie树)详解** DoubleArrayTrie(简称DAT),是一种高效的数据结构,常用于字符串的查找和匹配,特别是在分词检索、数据挖掘以及搜索引擎等领域有着广泛的应用。它是由日本学者高津陵...
在面试中,面试官可能会要求候选人现场手写Trie树和后缀树的相关代码,或者询问相关的算法实现原理和时间复杂度。因此,程序员在准备面试时应当对这些数据结构有深入的理解,并且能够熟练地分析和解决相关问题。 ...
**数据结构实验报告——Trie树** Trie树,又称为前缀树或字典树,是一种用于存储字符串的有效数据结构。它通过将字符串的字符分解并存储在树的节点中,来实现高效的字符串查找、插入和删除操作。在Trie树中,每个...
在这个课设中,`file.cpp`很可能是实现Trie树数据结构及其操作的源代码文件。可能包括插入单词、删除单词、查找单词、显示所有以特定前缀开头的单词等功能。C++是实现这类算法的常用编程语言,它提供了丰富的控制...
对于一般的Trie树的数据结构,它的实现简单但是空间效率极低。三叉搜索树使用了一种聪明的手段去解决字典树的内存问题(空的指针数组)。为了避免多余的指针占用内存,每个节点不再用数组来表示,而是表示成“树中有...
在本项目中,我们探讨的是一个名为"smarteditor-master"的压缩包,它包含了一个基于Trie树实现的具有联想功能的文本编辑器。这个文本编辑器是用Python编程语言编写的,因此对于熟悉Python的开发者来说,这是一个很好...
1. `KeywordExtractor.py`:这是主要的代码文件,包含了Trie树的实现,包括构造函数、插入、查找和删除等基本操作。 2. `test.py` 或类似的文件:测试脚本,用于验证Trie树功能的正确性,可能包含一些示例关键词和...
KMP(字符串匹配),Trie树(字典树),manacher(最长回文子串) 算法思想 代码 经典题目
Trie是一种字典树,用于存储文本字符,并利用了单词之间共享前缀的特点,所以叫做前缀树。不像平衡BST,Trie的高度只与最长的文本串的长度s有关系,而与单词的数量n无关。该代码为C#版本。
Trie树,也被称为前缀树或字典树,是一种用于高效存储和检索字符串的数据结构。它通过将字符串的字符按顺序插入到树的不同层级...通过实际操作和代码阅读,学习者可以深化对Trie树的掌握,并将其应用到实际问题解决中。
Trie(发音为 "try")是一种数据结构,也称为“前缀树”或“字典树”,常用于高效地存储和检索字符串集合中的关键词。Trie 的核心思想是将字符串按照字符顺序进行分层存储,每层节点对应一个字符,这样可以快速查找...