• 朱迪矩阵


    朱迪矩阵[编辑]

    (重定向自Judy array

    Judy array是一个计算机科学和软件工程学中的名词,是一种高性能、低内存消耗的数据结构,实现了关联数组的功能。与普通数组不同,Judy array可以是稀疏的,这一点更像是散列表,而非数组。Judy array可以用整形或字符串作为键值来存储、查询数据,它最大的优势是可动态自动扩展,高性能,节省内存并且易于使用。

    由于Judy array在操作速度和内存使用上都非常高效,同时并不需要特殊配置或初始化,使得它可以用来替换掉多种常见数据结构,例如跳跃列表,链表,二叉树,B树,散列表,而且judy array在海量数据集上的表现比那些数据结构更好。

    粗略地讲,Judy array像是一个高度优化了的256叉树,为了节省内存,它使用了超过20种不同的压缩技术来压缩树节点。.[1]

    Judy array 是Douglas Baskins发明的,他用自己妹妹的名字命名了这种数据结构。[2]

    目录

    [隐藏

    术语[编辑]

    容量、用量、密度 这三个概念是传统树形结构中很少使用,但在Judy array中反复使用的。 这个的概念的定义如下:

    1. 容量 可以理解为Judy Array在不扩展内存使用的情况下所能维护的数据量,也可以是某个节点的,视乎上下文。
    2. 用量 已经存储的数据量,既可以描述整个Judy Array的数据量,也可以是某个节点下的。
    3. 密度 用来描述数据存储的密集程度, 密度 = 用量/容量

    优势[编辑]

    内存分配[编辑]

    Judy array是没有容量限制的,所以也不用事先分配好存储空间,它可以根据用量动态决定生长或收缩内存使用,来支撑海量数据存储。其存储能力仅受到计算机内存容量的限制。[3]Judy array的内存用量与其存储的数据用量基本呈线性关系。

    速度[编辑]

    Judy array在设计上就力争保持尽可能高的CPU缓存命中率,为了达到这个目标,其内部算法十分复杂。由于有了这些针对性的优化,使得Judy array在运行速度上十分高效,有时甚至超过散列表,尤其是在处理大数据集的时候。由于Judy array是依托树 (数据结构)形结构设计的,其内存消耗比散列表小很多,同样是拜树形结构所赐,使得它可以完成键值的顺序遍历,这一点在散列表中是不可能的。

    译者注:我完全没搞明白Judy array是如何提高缓存命中率的,希望有高人在此补充

    算法[编辑]

    从Judy array的发明者所撰写的简介以及其他一些相关的中文论文中看,设计中使用了多种的压缩思想与压缩算法,根据不同的密度情况,选择不同的压缩方式,以期尽可能节省内存,降低实际存储中的稀疏情况,我猜测,这能够在缓存命中率上带来不少提升,进而提升效率。

    看到的算法思路包括:

    • 对于密度很高,空洞很少的节点,使用位图(bitmap)来存储。
    • 对于密度很低的情况,只存储出现的键值
    • 对于密度极低的情况,使用类似于字典树的结构,跨层压缩数据。

    Judy Array API介绍

    本文介绍https://code.google.com/p/judyarray/这个JudyArray实现的API。

    judy_open:新建一个JudyArray,并返回指向这个JudyArray的指针。

    judy_close:释放为JudyArray分配的存储空间。这个函数同时也会释放调用judy_data和judy_clone申请的空间。

    judy_clone

    judy_data

    image

      从judy中分配大小为amt的存储空间,返回指向此空间的指针。这个函数通常用来为key对应的value分配私有空间。

    jud_cell

    向已有的JudyArray中插入一个string类型的key,并返回指向该key对应的value的指针。

    调用方法是:

     image

          不管这个Key在judy中是否存在,返回的指针的内容都是value的内容。

          如果这个key在judy中存在,返回的指针的内容是value的内容。用户可以把这个内容转换为自己的指针类型,来访问value数据。

          如果这个key在judy中不存在,返回的指针的内容是0,用户可以创建value数据,并把value数据的地址填到这个0的位置。

    典型用法

    image

    judy_slot:

    从judy中取出key对应的value,返回值的内容实际上是value的地址地址。如果key不存在,则返回NULL。

    image

    judy_strt:

    judy_prv:

    judy_nxt:

    judy_key:

    这几个函数是获取judyarray的迭代器,并访问judyarray元素的。

    image

      其中judy_key返回迭代器位置的key,key的值存储到buff中,max表示buff的大小,返回值是key的长度。

    典型用法

    image

    judy_del:删除一个key value

    image

      它可以用在两个地方,一是在迭代器中,如上面例子中的注释所示;还有是可以用在judy_cell函数调用后,这个时候judy中内置的栈顶元素指向当前访问的元素,也可以用judy_del删除该元素。它的返回值是该元素的上一个key-value的value的内容。

    Judy Array – Example

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
     
    #include "judy64nb.c"
     
    typedef struct data{
        int a;
        int b;
    }data;
     
    int main()
    {
        Judy *judy;
        void *cell;
        data *p;
     
        char *key1 = "IEatCrab";
        char *key2 = "IEatCrabToo";
        char *key3 = "CrabEatWorm";
     
        data data1 = {1, 1};
        data data2 = {2, 2};
     
        judy = judy_open(100, 0);
     
        cell = judy_cell(judy, key1, strlen(key1)); 
        *(data*)cell = data1; 
     
        cell = judy_slot(judy, key2, strlen(key2)); 
        if(cell == NULL){ 
            cell = judy_cell(judy, key2, strlen(key2)); 
            (*(data*)cell) = data2; 
        }
     
        cell = judy_slot(judy, key3, strlen(key3)); 
        if(cell == NULL){ 
            p = (data*)judy_data(judy, sizeof(data)); 
            p->a = 3; 
            p->b = 3; 
            cell = judy_cell(judy, key3, strlen(key3)); 
            *(data**)cell = p;          
        }
     
     
        cell = judy_slot(judy, key1, strlen(key1)); 
        printf("%d %d
    ", ((data*)cell)->a, ((data*)cell)->b); 
        cell = judy_slot(judy, key2, strlen(key2)); 
        printf("%d %d
    ", ((data*)cell)->a, ((data*)cell)->b); 
        cell = judy_slot(judy, key3, strlen(key3)); 
        p = *(data**)cell;
        printf("%d %d
    ", p->a, p->b);
     
        judy_close(judy);
     
        return 0;
    }
  • 相关阅读:
    Java 注解
    java 编码设计细节
    快捷键大全
    java 常用方法
    用SelectSingleNode()方法查找xml节点一直返回null
    未能加载文件或程序集“microsoft.Build.Engine, Version=3.5.0.0,...”或它的摸一个依赖项。
    引用dll出现了黄色感叹号
    保持控件和容器之间的相对位置
    DataGridView中EnditCommit()调用之后,单元格的内容被全选了,每次输入都要鼠标点击定位到最后才能继续输入
    访问DataGridView的Rows报了OutOfIndexRangeException错误
  • 原文地址:https://www.cnblogs.com/274914765qq/p/4324905.html
Copyright © 2020-2023  润新知