手机号码查找算法(基数树)

转载 2012年03月28日 13:45:59

 

typedef struct mctree_node      mctree_node;
struct mctree_node{
        mctree_node     *child[10];     //节点内包含10个子节点
        mctree_node     *parent;        //当前节点的父节点
        dpl_uint8_t     level;          //当前节点深度
        dpl_uint8_t     valid[10];      //每个子节点是否存在
        //int           count[10];      //每个子节点计数器
};

typedef struct mctree_table      mctree_table;
struct mctree_table{
        mctree_node     *root;
        dpl_blkp_t      *blkp;
        dpl_lock_t      lock;
};

 

dpl_status_t mcnode_find(mctree_node *root, char *id, mctree_node **valid, mctree_node **last)
{
        mctree_node     *pt = NULL;
        int             find = 0, i=0, j=0;

        if(root == NULL || id == NULL || valid == NULL || last == NULL)
                return EINVAL;
        pt = *last =  root;

        while(id[i] != '\0'){
                j = id[i]-'0';
                //若有效,则记录
                if(pt->valid[j] == 1){
                        find  = 1;
                        *valid = pt;
                }
                //查找子节点
                if(pt->child[j] != NULL){
                        pt = pt->child[j];
                        *last = pt;
                }else{
                        break;
                }
                i++;
        }

        if(find == 1){
                if((*valid)->level == strlen(id)-1)
                        return DPL_SUCCESS;
                else
                        return DPL_ISCHILD;
        }
        return DPL_NOTFOUND;
}

 

dpl_status_t mcnode_add(mctree_table *mctree,char *id, mctree_node *last)
{
        dpl_status_t    stat = DPL_SUCCESS;
        mctree_node     *pt = NULL;
        mctree_node     *pn = NULL;
        int             i=0,j=0;
       
        if(mctree == NULL || id == NULL)
                return EINVAL;
               
        if(last == NULL)
                pt = mctree->root;
        else   
                pt = last;
               

        //查找待插入的子节点
        while((id[i] != '\0') && (id[i+1] != '\0')){
                j = id[i] - '0';
                if(pt->child[j] == NULL){
                        stat = dpl_blkp_malloc(mctree->blkp, (void**)&pn);
                        if(DPL_SUCCESS != stat){
                                TRACE(dpl_blkp_malloc, stat);
                                return stat;
                        }      
                        memset(pn, 0, sizeof(mctree_node));
                        pn->parent = pt; //新节点的父节点,此处用下标0
                        pn->level = pt->level + 1;
                        pt->child[j] = pn; //父节点子指向子节点
                        pt = pn;
                }else{ 
                        pt = pt->child[j];
                }      
                i++;
        }
        //插入
        j = id[i] - '0';
        if(pt->valid[j] == 1)
                return DPL_EXIST;
        pt->valid[j] = 1;
        return DPL_SUCCESS;
}

 

手机号码查找算法(基数树)

#define DIGITTREE_NODE_COUNT 111111 typedef struct digittree_node digittree_node; typedef struct ...
  • lotus302
  • lotus302
  • 2012年02月08日 12:54
  • 1344

【数据结构】基数树

本节研究基数树相关的机制和实现;
  • skyuppour
  • skyuppour
  • 2015年05月19日 20:31
  • 1029

《算法导论》第12章 二叉查找树 (3)基数树

基数树与二叉查找树和Trie树很相似。它像BST一样是二叉的,向左表示0而不是BST的小于, 而向右则表示1而不是大于。它像Trie一样共享相同的结点来保存字符串中相同的前缀,从而 节省了空间,但...
  • dc_726
  • dc_726
  • 2012年03月25日 13:38
  • 6212

字典树/trie树,基数树/radix树

转自:百度百科:http://baike.baidu.com/view/2759664.htm
  • taozhi20084525
  • taozhi20084525
  • 2014年07月21日 15:32
  • 1724

算法导论-12-2-基数树

题目: 给定两个串a = a0a1……ap和b = b0b1……b1,其中每一个ai和每一个bj都属于某个有序字符集,如果下面两条规则之一成立,则说串a按字典序小于串b: 1)存在一个整数j,0 ...
  • mishifangxiangdefeng
  • mishifangxiangdefeng
  • 2012年07月05日 18:50
  • 3957

linux 基数树

Linux基数树(radix tree)是将指针与long整数键值相关联的机制,它存储有效率,并且可快速查询,用于指针与整数值的映射(如:IDR机制)、内存管理等。 IDR(ID Radix...
  • lonewolfxw
  • lonewolfxw
  • 2012年09月07日 10:09
  • 2402

Linux 基数(radix)树

基数(radix)树 Linux基数树(radix tree)是将指针与long整数键值相关联的机制,它存储有效率,并且可快速查询,用于指针与整数值的映射(如:IDR机制)、内存管理等。 ID...
  • xiaofeng_yan
  • xiaofeng_yan
  • 2017年11月22日 10:41
  • 106

(p171)基数树

思路很简单,把浅深色的节点设为1,其余的设为0,先序遍历用s存储当前路径对应的字符串,遇到1输出即可 #include #include #include #define max 100 struc...
  • u010327109
  • u010327109
  • 2016年02月28日 18:28
  • 134

经典查找算法 --- B+树

B+树       B+树是应文件系统所需而产生的一种B-树的变形树。一棵m 阶的B+树和m 阶的B- 树的差异在于: ⑴有n 棵子树的结点中含有n 个关键码; ⑵所有的叶子结点中包含了全部关键码的...
  • sjyttkl
  • sjyttkl
  • 2017年04月16日 21:46
  • 799

Nginx学习笔记(十):基数树

前言 接上篇。。。 基数树ngx_radix_tree_t 基数树也是一种二叉查找树,它要求存储的每个节点必须以32位整型作为任意两节点的唯一标识。另外,基数树与...
  • fzy0201
  • fzy0201
  • 2014年02月06日 18:51
  • 2450
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:手机号码查找算法(基数树)
举报原因:
原因补充:

(最多只允许输入30个字)