diff options
author | chai <chaifix@163.com> | 2021-10-26 11:32:46 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2021-10-26 11:32:46 +0800 |
commit | 0549b1e5a8a3132005e275d6026db8003cb067d2 (patch) | |
tree | f0d7751ec32ecf5c4d23997fa0ffd3450a5a755a /Data/DefaultContent/Libraries/containers/README.md | |
parent | 32345800737b668011a87328cd3dcce59ec2934c (diff) |
*rename folder
Diffstat (limited to 'Data/DefaultContent/Libraries/containers/README.md')
-rw-r--r-- | Data/DefaultContent/Libraries/containers/README.md | 202 |
1 files changed, 202 insertions, 0 deletions
diff --git a/Data/DefaultContent/Libraries/containers/README.md b/Data/DefaultContent/Libraries/containers/README.md new file mode 100644 index 0000000..cba8776 --- /dev/null +++ b/Data/DefaultContent/Libraries/containers/README.md @@ -0,0 +1,202 @@ +# Lua-ADT(5.1分支和5.2分支) +封装的lua数据结构, 元组(tuple)、动态数组(vector)、双向链表(list)、队列(queue)、栈(stack)。 +纯lua方法封装,没有使用oop,延续lua的简洁的风格。封装的数据结构能安全使用,在语言层面过滤掉非法操作,使其使用更加简单高效。 + +所有的类型都支持#获取长度. +> eg. +```lua + local tuple = require("tuple") + local v = tuple.create({2,3,6}) + print(#v) + ---3 +``` + +### 元组(tuple) +需要用table的动态数组初始化(不支持hashtable),只对外公开遍历,修改关闭。 + +遍历: +```lua + local tuple = require("tuple") + local v = tuple.create({2,3,6}) + + for i,v in ipairs(v) do --只支持ipairs遍历,抛弃了pairs(因为原则上我们是数组,不存在key) + print(i,v) + end + ---1 2 + ---2 3 + ---3 6 + + print(v) --重写了__tostring,方便快速浏览数据 + ---2,3,6 + + v[2] = 9 --因为对修改关闭了所以这地方修改会抛出错误 + ---lua: .\tuple.lua:33: >> Dee: Limited access + ---stack traceback: + ---[C]: in function 'error' +``` + +### 动态数组(vector) +实现高效的遍历和修改,但是新增和删除都不是线性时间复杂度。基本上就是lua table的数组,但是lua的table我们会一不小心就搞成不连续的。比如: +```lua + local t = {2,4} + t[4] = 9 + + print(#t) -- 2 +``` +#### 方法: + * add --尾添加(高效的操作) + * insert --插入(会有内存整理) + * addRange --尾添加一个表, + * removeAt + * remove + * contains + * indexOf + * sort + * find + +#### eg. +```lua + local vector = require("vector") + local v = vector.create() + + v:add(4) + v:add(5) + v:add(6) + v:add(7) + + for i,v in ipairs(v) do + print(i,v) + end + ---1 4 + ---2 5 + ---3 6 + ---4 7 + + print(v) + ---4,5,6,7 + + v[4] = 9 --修改值 + + print(v) + ---4,5,6,9 + + v[7] = 9 + ---lua: .\vector.lua:101: outrange of vector + ---stack traceback: + --- [C]: in function 'assert' +``` + +### 双向链表(list) +弥补动态数组增删的不足,提供增删效率,但是遍历和修改效率比较低 + +#### 方法: + * addFirst --头添加 + * addLast --尾添加 + * addBefore --node前添加 + * addAfter --node后添加 + * removeNode --删除node + * remove --根据值移除 + * find --查找node +#### eg. +```lua + local vector = require("list") + local v = list.create() + + v.addFirst(1) + v.addLast(2) + print(v) + ---1,2 + + local node = v.find(1) + node.value = 9 + print(v) + ---9,2 + + v.removeNode(node) + print(v) + ---2 + + v.addLast(10) + v.addLast(20) + v.addLast(30) + print(v) + ---2,10,20,30 + + for _,i,v in ipairs(v) do --第一个参数是node, i: index, v: value + print(i,v) + end + ---1 2 + ---2 10 + ---3 20 + ---4 30 +``` +### 栈(stack) +FILO先进后出, 对修改关闭,关闭遍历,只能通过方法修改数据 +#### 方法: + * push --添加 + * pop --移除 + * peek --返回栈顶数据 + * clear --清空 +#### eg. +```lua + local stack = require("stack") + local v = stack.create() + + v.push(1) + v.push(2) + v.push(5) + + print(v) + ---5,2,1 + print(v.len) + ---3 + v.pop() + print(v) + ---2,1 + v.clear() + print(v.len) + ---0 +``` +### 队列(queue) +FIFO,先进先出,因为是队首删除所以不能使用table.remove +#### 方法: + * enqueue --添加 + * dequeue --移除 + * peek --返回栈顶数据 + * clear --清空 + * #queue --获取长度 +#### eg. +```lua +local queue = require("queue") +-- lua table +local cnt = 10000 * 1 + +local t = {} +for i=1,cnt do +t[i] = i +end + +local time = os.clock() +while #t > 0 do +-- table.remove(t) + table.remove(t, 1) +end +print(os.clock() - time) +---1.037s + +local v = queue.create() + +for i=1,cnt do + v.enqueue(i) +end + + +local time1 = os.clock() +while v.len > 10 do + v.dequeue() +end +print(os.clock() - time1) +---0.005s +``` +1w条数据,lua table直接删除表头的耗时1.037s,queue耗时0.005s,而且queue整理内存的步长可以调整,耗时可以进步一提高. + |