用Lua实现插入、删除和查找时间复杂度为O(1)的集合
来源:互联网 发布:程序员节活动策划 编辑:程序博客网 时间:2024/06/06 16:07
利用下面代码可以定义一个集合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, }})endlocal s = newset()s:insert("hi0")s:insert("hi1")for _,Value in ipairs(s) do print(Value)endprint(s:find("hi0"))s:remove("hi0")print(s:find("hi0"))--[[--output--hi0hi1truefalse--]]
上面set之所以能做到插入、删除和查找为O(1),首先是lua中table实现的保证,另外一个是利用了一个额外的数组reverse,来保存数组s中每个数据在s中的位置,相当于以空间换时间。
ps:上面代码是对luasocket源码samples/tinyirc.lua中代码的改写。
ps:上面代码是对luasocket源码samples/tinyirc.lua中代码的改写。
0 0
- 用Lua实现插入、删除和查找时间复杂度为O(1)的集合
- 用Lua实现插入、删除和查找时间复杂度为O(1)的集合
- 线性表、栈、队列等查找、删除、插入的时间复杂度O()
- 线性表、栈、队列等查找、删除、插入的时间复杂度O()
- 作业:递归实现插入排序和在o(nlgn)时间复杂度内寻找和为定值的两个元素
- 【哈希表】实现结构RandomPool,用O(1)时间完成插入、删除和随机返回的功能
- 从顺序表中删除所有值为x的元素(Java实现),要求时间复杂度O(n),空间复杂度O(1)
- c语言实现线性表的建立,初始化,插入,删除,查找,遍历以及时间复杂度分析
- 关于快速排序和插入排序最坏时间复杂度为O(nlogn)的算法
- 【排序】时间复杂度为O(N^2)的排序——冒泡、选择和插入排序
- 常见数据结构的查找、插入、删除时间复杂度
- Java 用两个队列实现一个栈,要求top()的时间复杂度为O(1)
- (C#)实现时间复杂度为O(n)空间复杂度为O(1)的数组中奇偶数分离
- 时间复杂度为o(N)查找1至N-1构成的a[N]重复元素
- 时间复杂度为o(N)查找1至N-1构成的a[N]重复元素
- 时间复杂度为o(N)查找1至N-1构成的a[N]重复元素
- 单链表的删除算法时间复杂度O(1)和O(n)
- 时间复杂度为O(1)的删除链表结点方法
- 黑马程序员_java基础之封装
- poj 2352 && hdu 1541 Stars (树状数组)
- To Do List
- Java中利用反射原理拷贝对象
- ZOJ 2922
- 用Lua实现插入、删除和查找时间复杂度为O(1)的集合
- mii,gmii,sgmill,xgmill,xaui
- 我的软考之路(一)——开篇
- hdu1520,树形dp
- 读后感:救黑熊重要,还是救助失学儿童重要?
- C++对象的使用
- Linux内存管理之mmap详解
- 用iptables 实现本地端口转发
- 3种交换变量值的方法