lua中的Table

简介:

Lua中,Table是很重要的一个部分,它可以表示很多的数据结构,可以是Array,可以是Map,可以根据自己的需要实现栈,队列等等,使用起来方便

分析:

Table分为2部分,分别是数组Array和Hash部分。

数组部分主要是存储下标从1开始的连续不为空的节点内容,如果是中间断开部分会存到hash部分。

Hash部分是存储各种类型的离散数据

 

对于一个Table初始化的时候,如果是空表,即Array和Hash部分长度都为0。

这里主要讲哈希的部分

然后根据哈希表的原理从后向前进行插入元素(开放定址法)

当哈希表的内存不够存储元素时,则申请元素,扩容的规则是每一次扩容翻倍,称为rehash

rehash的过程是:先分配一块新的内存块。然后,要把旧的迁移过来新内存块。但是,它并不是按顺序一个一个对位拷贝的,遍历每一个节点的时候,都要重新去进行一次哈希,所以分配前后的位置可能会不一样(它和Array部分不一样,Array部分是直接一对一,位置不变地拷贝的)

 

扩容前:

扩容后:

然后再在扩容后的位置去进行哈希

逻辑:

1:先去检查key所对应的哈希表位置是否为空,如果为空直接设置值

2:如果不为空,就在内存中找一个空的点,从最后往前找

3:如果找不到,则表示哈希表满了,调用一次rehash的方法,申请内存,并且重新设置一次之前的值

4:如果找到了,去计算该key点a本该存在的位置上的点b是否在其正确的位置上(即该点是否是通过开放定制法偏移过来的)

5:如果不是,则将b点放在空的结点位置去,a点放入计算好的位置上

6:如果b点在其正确的位置上,就将a插入空的位置

参考:https://blog.csdn.net/fwb330198372/article/details/88579361?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值