LUA数据结构-跳表

本着开源,共享的精神,我将一些常用的基于LUA的数据结构共享出来,大家可以直接使用

本代码是一个字一个字敲出来的,如果你觉得有用给个赞或加个关注

local skipList = {};
local skipNode = {};
function skipNode:new()
    self = {address = 0,value = 0,forward = {},back = {},maxLevel = 1};
    setmetatable(self,{_index = skipNode});
    return self;
end
skipList.head = skipNode:new();
local topLevel = 1;
function skipList:getTopLevel()
    
    return topLevel;
end
function skipList:insert(address,value)
    local node = skipNode:new();
    node.address = address;
    node.value = value;
    node.maxLevel = self:random();
    local update = {};
    local nextUpdate = {};
    for i = 1,node.maxLevel do
        update[i] = skipList.head;
    end
    local p = skipList.head;
    
    --每层搜索最小节点
    for k = 1,node.maxLevel do
        local i = node.maxLevel - k+1;--从稀疏的顶层开始

        while p.forward[i] ~= nil do
            if p.forward[i].value>value then
                break;
            end
            p = p.forward[i];
        end
        update[i] = p;
        nextUpdate[i] = update[i].forward[i];
    end
    --按照每个索引依次的插入索引
    for i= 1,node.maxLevel do
        local cache = update[i].forward[i];
        update[i].forward[i] = node;
        node.forward[i] = cache;
        if nextUpdate[i] == nil then
            node.back[i] = update[i];
        else
            node.back[i] = update[i];
            nextUpdate[i].back[i] = node;
        end
    end
    --获取最大索引
    if topLevel< node.maxLevel then
        topLevel = node.maxLevel;
    end
    return node;
end

function skipList:delete(value)

    local update = {};
    local nextUpdate = {};
    local p = skipList.head;
    for k = 1,topLevel do
        local i = topLevel - k+1;
        while p.forward[i] ~= nil do
            if p.forward[i].value > value then
                break;
            end
            p = p.forward[i];
        end
        update[i] = p;
        nextUpdate[i] = update[i].forward[i];
    end
    if p.forward[1] ~= nil then
        
        for k = 1,topLevel do
            local i = topLevel - k +  1 ;
            if update[i].back[i] ~= nil then
                update[i].back[i].forward[i] = update[i].forward[i];
                
            end
            if nextUpdate[i] ~= nil then
                nextUpdate[i].back[i] = update[i].back[i];
            end
        end
    end
end
function skipList:printAll()
    local p = skipList.head;
    local val = "";
    while (p.forward[1] ~= nil) do
        val = val..(p.forward[1].value .. " ");
        p = p.forward[1];
    end
    val = val.."  ";
    print(val);
end
-- print(math.randomseed(tostring(os.time()):reverse():sub(1, 7)))
function skipList:random()
    
    local level = 1;
    while math.random(100)<50 and level<16 do
        level = level + 1;
    end
    return level;
end

function skipList:find(value)
    local p = skipList.head;
    for k = 1,topLevel do 
        local i = topLevel - k + 1 ;
        while p .forward[i] ~= nil do

            if p.forward[i].value > value then
                
                break;
            end
            p = p.forward[i];
        end
    end

    return p;

end
local command = {};
function command.insert(address,value)
    skipList:insert(address,value);
    return value;
end

function command.delete(val)
    skipList:delete(val)
end
function command.find(val)
    if skipList:find(val) == nil then
        return nil;
    end
    return skipList:find(val).address;
end
function command.getRange(val,range) 
    local tempHead = skipList:find(val);
    local p = tempHead;
    if p == nil then
        return nil;
    end
    local arr = {};
    while p ~= nil do
        if (p.value - val)>  range then
            break;
        end
        arr[p.address] = true;
        p = p.forward[1];
    end
    p = tempHead;
    while p ~= nil do 
        if (val - p.value)>= range then
            break;
        end
        arr[p.address] = true;
        p = p.back[1];
    end
    return arr;
end

以下是飞书链接,飞书链接里面的版本会比这个版本更新一些,有什么更新都会在这个版本里面更新

https://wm2cnmmq7c.feishu.cn/docs/doccn1CDqQS9rJiL31H17nLeETc

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值