今天在学Linux内核页高速缓存时,学到了一种新的数据结构radix树(基数),经过分析,感觉此数据结构有点鸡肋,有可能是我理解不到位吧。

先来张图,给大家以直观的印象

当有一个key-value型的数据结构,它的key是从0-255共256个int型数字,如果用数组来存储的话,只是key的部分,需要256*sizeof(int)个字节。

但如果把key看作是一个bit序列,从00000000-11111111,按照字典树的思想,把8位bit分成4个部分,每一部分就对应上面树的一层,那么我们就会得到上图所示的一个radix树。上面的树中有4+16+64+256=340个节点。

如果把这个树扩展到32个bit,即一个int型所能表示的范围,如果用数组的话,只是key部分就需要4G*4B=16G

如果把32个bit分成每6个bit一组,那么形成的radix树最多就是6层,形成节点数:64+642+643+644+645+646不用算了,这个数远远大于16G。

于是我们可以得到一个结论,如果树是满的话,我们根本没有必要使用radix树。

在网上查询一些资料,radix适用于一些稀疏的存储。这样就说得通了。但我又有疑问了,在稀疏的情况下,为什么我们不用hash表,甚至是排序的红黑树呢?

以上是一些自己的想法,在些先写下来,也可能它在一些情境下,的确是比较适用的。不管怎么说,它提供的思想还是很好的,在key的位数比较固定的情况下,用它来代替hash表没准也是一个好的选择。

radix树的更多相关文章

  1. 19-看图理解数据结构与算法系列(Radix树)

    Radix树 Radix树,即基数树,也称压缩前缀树,是一种提供key-value存储查找的数据结构.与Trie不同的是,它对Trie树进行了空间优化,只有一个子节点的中间节点将被压缩.同样的,Rad ...

  2. 《TCP/IP作品详细解释2:实现》笔记--Radix树路由表

    通过IP完整的路由是路由机制,它通过搜索路由表来确定从哪个分组被发送的接口执行此,它是不一样的路由策略,路由策略 它是一组规则,这些规则可以被用来确定哪些路由编程到路由表,Net/3内核实现的路由机制 ...

  3. 基数树(radix tree)

    原文   基数(radix)树 Linux基数树(radix tree)是将指针与long整数键值相关联的机制,它存储有效率,并且可快速查询,用于指针与整数值的映射(如:IDR机制).内存管理等.ID ...

  4. Linux 内核中的数据结构:基数树(radix tree)

    转自:https://www.cnblogs.com/wuchanming/p/3824990.html   基数(radix)树 Linux基数树(radix tree)是将指针与long整数键值相 ...

  5. Merkle Patricia Tree (MPT) 树详解

    1.    介绍 Merkle Patricia Tree(简称MPT树,实际上是一种trie前缀树)是以太坊中的一种加密认证的数据结构,可以用来存储所有的(key,value)对.以太坊区块的头部包 ...

  6. Linux内核Radix Tree(二)

    1.   并发技术 由于需要页高速缓存是全局的,各进程不停的访问,必须要考虑其并发性能,单纯的对一棵树使用锁导致的大量争用是不能满足速度需要的,Linux中是在遍历树的时候采用一种RCU技术,来实现同 ...

  7. Linux内核Radix Tree(一)

    一.概述 Linux radix树最广泛的用途是用于内存管理,结构address_space通过radix树跟踪绑定到地址映射上的核心页,该radix树允许内存管理代码快速查找标识为dirty或wri ...

  8. 海量路由表能够使用HASH表存储吗-HASH查找和TRIE树查找

    千万别! 非常多人这样说,也包括我. Linux内核早就把HASH路由表去掉了.如今就仅仅剩下TRIE了,只是我还是希望就这两种数据结构展开一些形而上的讨论. 1.hash和trie/radix ha ...

  9. AVL树,红黑树,B-B+树,Trie树原理和应用

    前言:本文章来源于我在知乎上回答的一个问题 AVL树,红黑树,B树,B+树,Trie树都分别应用在哪些现实场景中? 看完后您可能会了解到这些数据结构大致的原理及为什么用在这些场景,文章并不涉及具体操作 ...

随机推荐

  1. PL/SQL学习(一)

    原文参考:http://plsql-tutorial.com/ 组成: 声明部分(可选) 执行部分(必选) 异常处理(可选)       声明:         DECLARE       执行:   ...

  2. C/C++易错点

    问:void print( int arr[][], int size );这个函数声明是对是错? 当然是错的了,这个根本不是什么函数声明的问题,而是数组声明的问题,int arr[][]这个声明就是 ...

  3. C#黑白棋制作~

    前些天自己复习一下C#语言 做了个黑白棋,望大家看一下,可能有些bug嘿嘿 链接如下 http://files.cnblogs.com/files/flyingjun/%E9%BB%91%E7%99% ...

  4. Length of Last Word | Leetcode

    Given a string s consists of upper/lower-case alphabets and empty space characters ' ', return the l ...

  5. Http 状态码详解

    状态码 含义 100 客户端应当继续发送请求.这个临时响应是用来通知客户端它的部分请求已经被服务器接收,且仍未被拒绝.客户端应当继续发送请求的剩余部分,或者如果请求已经完成,忽略这个响应.服务器必须在 ...

  6. iOS中使用RegexKitLite来试用正则表达式 使用ARC 20个错误解决办法

    You can also disable the ARC for the RegexKitLite only by adding a flag: select the project -> YO ...

  7. 传感器- 加速计 - CoreMotion

    /** *  CoreMotion * */ #import "ViewController.h" #import <CoreMotion/CoreMotion.h> ...

  8. uva 12526 - Cellphone Typing

    字典树,可惜比赛的时候有两句话写倒了: 害得我调了一个小时: 今天不宜做题 = = 代码: #include<cstdio> #include<cstring> #define ...

  9. USB OTG

    OTG检测的原理是:USB OTG标准在完全兼容USB2.0标准的基础上,增添了电源管理(节省功耗)功能,它允许设备既可作为主机,也可作为外设操作(两用OTG).USB OTG技术可实现没有主机时设备 ...

  10. 带圆角的EditText

    转载请注明出处:http://blog.csdn.net/krislight/article 1.定义一个Drawable <?xml version="1.0" encod ...