本着开源,共享的精神,我将一些常用的基于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