首页 > 其他 > 详细

用Lua实现插入、删除和查找时间复杂度为O(1)的集合

时间:2014-03-28 17:53:54      阅读:503      评论:0      收藏:0      [点我收藏+]
利用下面代码可以定义一个集合S,对该集合所有的操作,比如插入、删除元素和查找元素都是O(1),代码如下:
function newset()
     local reverse = {} --以数据为key,数据在set中的位置为value
     local set = {} --一个数组,其中的value就是要管理的数据
     return setmetatable(set,{__index = {
          insert = function(set,value)
               if not reverse[value] then
                    table.insert(set,value)
                    reverse[value] = table.getn(set)
               end
          end,

          remove = function(set,value)
               local index = reverse[value]
               if index then
                    reverse[value] = nil
                    local top = table.remove(set) --删除数组中最后一个元素
                    if top ~= value then
                         --若不是要删除的值,则替换它
                         reverse[top] = index
                         set[index] = top
                    end
               end
          end,

          find = function(set,value)
               local index = reverse[value]
               return (index and true or false)
          end,
     }})
end


local s = newset()
s:insert("hi0")
s:insert("hi1")

for _,Value in ipairs(s) do
     print(Value)
end

print(s:find("hi0"))
s:remove("hi0")
print(s:find("hi0"))


--[[--output--
hi0
hi1
true
false
--]]

上面set之所以能做到插入、删除和查找为O(1),首先是lua中table实现的保证,另外一个是利用了一个额外的数组reverse,来保存数组s中每个数据在s中的位置,相当于以空间换时间。

ps:上面代码是对luasocket源码samples/tinyirc.lua中代码的改写。

用Lua实现插入、删除和查找时间复杂度为O(1)的集合,布布扣,bubuko.com

用Lua实现插入、删除和查找时间复杂度为O(1)的集合

原文:http://blog.csdn.net/maximuszhou/article/details/22313773

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!