trie树查找和hash查找比较(大量数据)

trie树代码

#include<iostream>
#include<stdio.h>
#include<iostream>
#include<string>
#include<stdlib.h>
#include<fstream>
#include<sstream>
#include<vector>
#include<string>
#include<time.h>
using namespace std;
class trienode
{
public:
    char *word;
    int count;
    trienode *branch[26];
public:
    trienode()
    {
        word = NULL;
        count = 0;//词频
        memset(branch, NULL, sizeof(trienode*) * 26);
    }
};
class trie
{
public:
    trienode *root;
public:
    trie();
    ~trie();
    void Insert(char *str);
    bool Search(char*str, int &count);//索引
    void printall(trienode *root);//字符排序
    void printpre(char *str);//前缀匹配
};
trie::trie()
{
    root = new trienode();
}
trie::~trie() {}
void trie::Insert(char *str)
{
    int index;
    trienode *tt = root;
    for (int i = 0; str[i]; i++)
    {
        index = str[i] - ‘a‘;
        if (index < 0 || index>26)
        {
            return;
        }
        if (tt->branch[index] == NULL)
        {
            tt->branch[index] = new trienode();
        }
        tt = tt->branch[index];
    }
    if (tt->word)
    {
        tt->count++;
        return;
    }
    else
    {
        tt->count++;
        tt->word = new char[strlen(str) + 1];
        strcpy_s(tt->word, strlen(str) + 1, str);
    }

}
bool trie::Search(char *str, int &count)
{
    int index = -1;
    trienode *tt = root;
    while (tt&&*str)
    {
        index = *str - ‘a‘;
        if (index < 0 || index>26) return false;
        tt = tt->branch[index];
        str++;
    }
    if (tt&&tt->word)
    {
        count = tt->count;
        return true;
    }
    return false;
}
void trie::printall(trienode *root)
{
    trienode *t = root;
    if (!t) return;
    if (t->word)
    {
        cout << t->word << endl;
    }
    for (int i = 0; i < 26; i++)
    {
        printall(t->branch[i]);
    }

}
void trie::printpre(char *str)
{
    trienode *t = root;
    int index = -1;
    while (t&&*str)
    {
        index = *str - ‘a‘;
        if (index < 0 || index>26) return;
        t = t->branch[index];
        str++;
    }
    if (t)
    {
        printall(t);
    }
}
int main()
{
    clock_t startTime, endTime;
    startTime = clock();
    trie *t = new trie();
    ifstream it("C:/Users/ww/Desktop/string.txt");
    string sline;
    string str = "";
    while (it&&getline(it, sline))
    {
        str += sline + " ";
    }
    it.close();
    for (int i = 0; i < str.length(); i++)
    {
        if (str[i] == ‘.‘ || str[i] == ‘,‘ || str[i] == ‘(‘ || str[i] == ‘(‘)
        {
            str.erase(i, 1);
        }
    }
    string word;
    stringstream ss(str);
    vector<string> vec;
    while (ss >> word)
    {
        vec.push_back(word);
    }
    vector<string>::iterator iter;
    for (iter = vec.begin(); iter != vec.end(); iter++)
    {
        t->Insert((char*)(*iter).data());
    }
    int val = -1;
    if (t->Search("the", val))
    {
        cout << val << endl;
    }
    else
    {
        cout << "empty" << endl;
    }
    endTime = clock();
    cout << "the running time is " << (double)(endTime - startTime) << endl;
    return 0;
}

hash代码

#include<iostream>
#include<fstream>
#include<sstream>
#include<string>
#include<vector>
#include<stdlib.h>
#include<time.h>
using namespace std;
class hashnode
{
public:
    char *p;
    hashnode *next;
};
class hashmap
{
public:
    hashnode *hashps[1000];
public:
    hashmap();
    ~hashmap();
    int String2Int(char *p);
    void Insert(char *p);
    bool Find(char *p);
};
hashmap::hashmap()
{
    for (int i = 0; i < 1000; i++)
    {
        hashps[i] = new hashnode();
    }
    for (int i = 0; i < 1000; i++)
    {
        hashps[i]->next = NULL;
    }
}
hashmap::~hashmap() {}
int hashmap::String2Int(char *p)
{
    int num = 0;
    while (*p)
    {
        num += *p;
        p++;
    }
    return num % 1000;
}
void hashmap::Insert(char *p)
{
    int index = String2Int(p);
    hashnode *hash = hashps[index];
    hashnode *newr = new hashnode();
    newr->p = new char[strlen(p) + 1];
    strcpy_s(newr->p, strlen(p) + 1, p);
    newr->next = hash->next;
    hash->next = newr;
}
bool hashmap::Find(char *p)
{
    int index = String2Int(p);
    hashnode *t = hashps[index]->next;
    if (!t)
    {
        return false;
    }
    else
    {
        hashnode *w = t;
        while (w)
        {
            if (strcmp(p, w->p)==0)
            {
                return true;
            }
            w = w->next;
        }
    }
}
int re(int *p)
{
    return *p;
}
int main()
{
    clock_t startTime, endTime;
    startTime = clock();
    hashmap *t = new hashmap();
    ifstream it("C:/Users/ww/Desktop/string.txt");
    string sline;
    string str = "";
    while (it&&getline(it, sline))
    {
        str += sline + " ";
    }
    it.close();
    for (int i = 0; i < str.length(); i++)
    {
        if (str[i] == ‘.‘ || str[i] == ‘,‘ || str[i] == ‘(‘ || str[i] == ‘(‘)
        {
            str.erase(i, 1);
        }
    }
    stringstream ss(str);
    string word;
    vector<string> vec;
    while (ss >> word)
    {
        vec.push_back(word);
    }
    vector<string>::iterator iter;
    for (iter = vec.begin(); iter != vec.end(); iter++)
    {
        t->Insert((char*)(*iter).data());
    }
    cout << "the result is: " << t->Find("the") << endl;
    endTime = clock();
    cout << "the running time is " << (double)(endTime - startTime) << endl;
    return 0;
}

trie树查找时间是O(L)L是字符串长度,而hash是O(LL),LL是关键字对应哈希地址链表长度,都和数据的大小无关,查找都很高效

时间: 2024-11-05 11:58:12

trie树查找和hash查找比较(大量数据)的相关文章

【转】B树、B-树、B+树、B*树、红黑树、 二叉排序树、trie树Double Array 字典查找树简介

B  树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right): 2.所有结点存储一个关键字: 3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树: 如: B树的搜索,从根结点开始,如果查询的关键字与结点的关键字相等,那么就命中:否则,如果查询关键字比结点关键字小,就进入左儿子:如果比结点关键字大,就进入右儿子:如果左儿子或右儿子的指针为空,则报告找不到相应的关键字: 如果B树的所有非叶子结点的左右子树的结点数目均保持差不多(平衡),那么B树的搜索性

Trie树,又称单词查找树、字典

在百度或淘宝搜索时,每输入字符都会出现搜索建议,比如输入"北京",搜索框下面会以北京为前缀,展示"北京爱情故事"."北京公交"."北京医院"等等搜索词.实现这类技术后台所采用的数据结构是什么?[中国某著名搜索引擎B公司2012年6月笔试题] 答案:Trie树,又称单词查找树.字典树,是一种树形结构,是一种哈希树的变种,是一种用于快速检索的多叉树结构.典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系

二分查找和hash查找

转载:http://blog.csdn.net/feixiaoxing/article/details/6844723 无论是数据库,还是普通的ERP系统,查找功能数据处理的一个基本功能.数据查找并不复杂,但是如何实现数据又快又好地查找呢?前人在实践中积累的一些方法,值得我们好好学些一下.我们假定查找的数据唯一存在,数组中没有重复的数据存在. (1) 普通的数据查找 设想有一个1M的数据,我们如何在里面找到我们想要的那个数据.此时数据本身没有特征,所以我们需要的那个数据可能出现在数组的各个位置,

海量路由表可以使用HASH表存储吗-HASH查找和TRIE树查找

千万别!很多人这样说,也包括我.Linux内核早就把HASH路由表去掉了,现在就只剩下TRIE了,不过我还是希望就这两种数据结构展开一些形而上的讨论. 1.hash和trie/radix hash 和tire其实是可以统一在一起的.具有相同hash值的多个项具有一个共同的特征,这个特征怎么提取呢?无疑这就是hash函数的工作.而trie树 (或者radix树,管它呢)的一棵子树也有共同的特征,这个特征怎么提取呢?无疑这就是该子树根节点的父节点指示的某些bits在这棵子树的每一个节点 都具有相同的

查找(二)简单清晰的B树、Trie树具体解释

查找(二) 散列表 散列表是普通数组概念的推广.因为对普通数组能够直接寻址,使得能在O(1)时间内訪问数组中的任何位置.在散列表中,不是直接把keyword作为数组的下标,而是依据keyword计算出对应的下标. 使用散列的查找算法分为两步.第一步是用散列函数将被查找的键转化为数组的一个索引. 我们须要面对两个或多个键都会散列到同样的索引值的情况.因此,第二步就是一个处理碰撞冲突的过程,由两种经典解决碰撞的方法:拉链法和线性探測法. 散列表是算法在时间和空间上作出权衡的经典样例. 假设没有内存限

查找(二)简单清晰的B树、Trie树详解

查找(二) 散列表 散列表是普通数组概念的推广.由于对普通数组可以直接寻址,使得能在O(1)时间内访问数组中的任意位置.在散列表中,不是直接把关键字作为数组的下标,而是根据关键字计算出相应的下标. 使用散列的查找算法分为两步.第一步是用散列函数将被查找的键转化为数组的一个索引. 我们需要面对两个或多个键都会散列到相同的索引值的情况.因此,第二步就是一个处理碰撞冲突的过程,由两种经典解决碰撞的方法:拉链法和线性探测法. 散列表是算法在时间和空间上作出权衡的经典例子. 如果没有内存限制,我们可以直接

Hash树(散列树)和Trie树(字典树、前缀树)

1.Hash树 理想的情况是希望不经过任何比较,一次存取便能得到所查的记录, 那就必须在记的存储位置和它的关键字之间建立一个确定的对应关系f,使每个关键字和一个唯一的存储位置相对应.因而在查找时,只要根据这个对应关系f找到 给定值K的像f(K).由此,不需要进行比较便可直接取得所查记录.在此,我们称这个对应关系为哈希(Hash)函数,按这个思想建立的表为哈希表. 在哈希表中对于不同的关键字可能得到同一哈希地址,这种现象称做冲突.在一般情况下,冲突只能尽可能地减少,而不能完全避免.因为哈希函数是从

B树、Trie树详解

查找(二) 散列表 散列表是普通数组概念的推广.由于对普通数组可以直接寻址,使得能在O(1)时间内访问数组中的任意位置.在散列表中,不是直接把关键字作为数组的下标,而是根据关键字计算出相应的下标. 使用散列的查找算法分为两步.第一步是用散列函数将被查找的键转化为数组的一个索引. 我们需要面对两个或多个键都会散列到相同的索引值的情况.因此,第二步就是一个处理碰撞冲突的过程,由两种经典解决碰撞的方法:拉链法和线性探测法. 散列表是算法在时间和空间上作出权衡的经典例子. 如果没有内存限制,我们可以直接

Trie树的详解及应用

Trie树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高.Trie的核心思想是空间换时间.利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的. Trie 的强大之处就在于它的时间复杂度.它的插入和查询时间复杂度都为 O(k) ,其中 k 为 key 的长度,与 Trie 中保存了多少个元素无关.Hash 表号称是