10.贝博betball网页数据结构_映射

betball贝博app Linux, 数据结构 295 次浏览 没有评论

映射

映射是一个由唯一键组成的集合,每个键关联一个特定的值,包含三个操作:

  • Add(key,value);
  • Remove(key);
  • value = Lookup(key);
  • 哈希表是一种映射,但是并非所有的映射都通过哈希表实现,更多的是通过自平衡二叉搜索树来存储数据。

  • 散列表能提供更好的平均渐进复杂度
  • 二叉搜索树在最坏情况下能有更好的表现
  • c++中的std:map也是通过的自平衡二叉搜索树实现。

    linux提供了简单有效的映射数据结构,因为多是完成自己的特有目的:映射一个唯一的标识数(UID)到一个指针,除了三个标准的映射操作,还在add的基础上实现了allocate操作,不但向map中加入了键值对,还可产生UID。idr数据结构用于映射用户空间的UID

    初始化一个idr

    定义或动态分配一个idr数据结构,然后调用idr_init();

    struct idr id_huh;
    idr_init(&id_huh);
    

    分配一个新的UID

  • 告诉idr需要分配新的UID,允许在必要时调整后备树的大小
  • 请求新的UID
  • 因为需要允许调整初始大小-设计在无锁情况下分配内存的场景

    调整后备树大小 idr_pre_get(idp,gfp_mask)

    该函数在需要时进行UID的分配工作:调整由idp指向的idr大小

    获取新的UID idr_get_new(idp,ptr,id)

    使用idp所指向的idr分配新的UID,并关联至指针ptr上。

    指定获得的最小UID idr_get_new_above(idp,ptr,starting_id,id)

    允许idr的使用者确保UID不会被重用

    查找UID

    idr_find(idp,id)

    调用成功返回关联指针,否则返回空指针
    如果使用idr_get_new或idr_get_new_above将空指针映射给UID,那么该函数在成功时也返回NULL,就无法区分成功还是失败,所以不要将UID映射到空指针。

    删除UID

    idr_remove(idp,id)

    撤销UID

    idr_destroy(idp)

    如果成功只释放idr中未使用的内存,并不释放当前分配给UID使用的内存

    发表评论

    邮箱地址不会被公开。

    Go