Lua常用的数据结构表示

1.矩阵

Lua中有两种表示矩阵的方法,一是“数组的数组”。也就是说,table的每个元素是另一个table。例如,可以使用下面代码创建一个n行m列的矩阵:
mt = {}          -- create the matrix
for i=1,N do
    mt = {}    -- create a new row
    for j=1,M do
      mt[j] = 0
    end
end
由于Lua中table是对象,所以每一行我们必须显式地创建一个table,比起c或pascal,这显得冗余,但另一方面也提供了更多的灵活性,例如可修改前面的例子创建一个三角矩阵:
for j=1,M do
改成
for j=1,i do
这样实现的三角矩阵比起整个矩阵,仅使用一半的内存空间。
表示矩阵的另一方法,是将行和列组合起来。如果索引下标都是整数,通过第一个索引乘于一个常量(列)再加上第二个索引,看下面的例子实现创建n行m列的矩阵:
mt = {}          -- create the matrix
for i=1,N do
    for j=1,M do
      mt[i*M + j] = 0
    end
end
如果索引是字符串,可用一个单字符将两个字符串索引连接起来构成一个单一的索引下标,例如一个矩阵m,索引下标为s和t,假定s和t都不包含冒号,代码为:m[s..‘:‘..t],如果s或者t包含冒号将导致混淆,比如("a:", "b") 和("a", ":b"),当对这种情况有疑问的时候可以使用控制字符来连接两个索引字符串,比如‘\0‘。
实际应用中常常使用稀疏矩阵,稀疏矩阵指矩阵的大部分元素都为空或者0的矩阵。例如,我们通过图的邻接矩阵来存储图,也就是说:当m,n两个节点有连接时,矩阵的m,n值为对应的x,否则为nil。如果一个图有10000个节点,平均每个节点大约有5条边,为了存储这个图需要一个行列分别为10000的矩阵,总计10000*10000个元素,实际上大约只有50000个元素非空(每行有五列非空,与每个节点有五条边对应)。很多数据结构的书上讨论采用何种方式才能节省空间,但是在Lua中你不需要这些技术,因为用table实现的数据本身天生的就具有稀疏的特性。如果用我们上面说的第一种多维数组来表示,需要10000个table,每个table大约需要五个元素(table);如果用第二种表示方法来表示,只需要一张大约50000个元素的表,不管用那种方式,你只需要存储那些非nil的元素。

2.链表
   Lua中用tables很容易实现链表,每一个节点是一个table,指针是这个表的一个域(field),并且指向另一个节点(table)。例如,要实现一个只有两个域:值和指针的基本链表,代码如下:

list = nil
for i = 1, 10 do
    list = { next = list, value = i}
end

local l = list
while l do
    print(l.value)
    l = l.next
end

其他类型的链表,像双向链表和循环链表类似的也是很容易实现的。然后在Lua中在很少情况下才需要这些数据结构,因为通常情况下有更简单的方式来替换链表。比如,我们可以用一个非常大的数组来表示栈,其中一个域n指向栈顶。

3。队列和双向队列
虽然可以使用Lua的table库提供的insert和remove操作来实现队列,但这种方式实现的队列针对大数据量时效率太低,有效的方式是使用两个索引下标,一个表示第一个元素,另一个表示最后一个元素。

function ListNew ()
    return {first = 0, last = -1}
end
为了避免污染全局命名空间,我们重写上面的代码,将其放在一个名为list的table中:
List = {}
function List.new ()
    return {first = 0, last = -1}
end
下面,我们可以在常量时间内,完成在队列的两端进行插入和删除操作了。

http://www.cnblogs.com/stephen-liu74/archive/2012/06/25/2417894.html

http://xiazhihui321.blog.163.com/blog/static/8132889320115249583590/

Lua常用的数据结构表示

时间: 2024-08-10 06:03:00

Lua常用的数据结构表示的相关文章

Lua 常用数据结构

Lua中的table不是一种简单的数据结构,它可以作为其它数据结构的基础.如数组.记录.线性表.队列和集合等,在Lua中都可以通过table来表示. 一.数组 在lua中通过整数下标访问表中的元素即可简单的实现数组.并且数组不必事先指定大小,大小可以随需要动态的增长. a = {} for i = 1,100 do a[i] = 0 end print("The length of array 'a' is " .. #a) squares = {1, 4, 9, 16, 25} pr

Unity3D中常用的数据结构总结与分析

Unity3D中常用的数据结构总结与分析 c#语言规范 阅读目录 1.几种常见的数据结构 2.几种常见数据结构的使用情景 来到周末,小匹夫终于有精力和时间来更新下博客了.前段时间小匹夫读过一份代码,对其中各种数据结构灵活的使用赞不绝口,同时也大大激发了小匹夫对各种数据结构进行梳理和总结的欲望.正好最近也拜读了若干大神的文章,觉得总结下常用的数据结构以供自己也能灵活的使用变得刻不容缓.那么还是从小匹夫的工作内容入手,就谈谈在平时使用U3D时经常用到的数据结构和各种数据结构的应用场景吧. 回到目录

Lua 常用库函数

一.数学库 1. 随机数 math.randomseed(os.time());   -- 设置随机种子 for i=1, 100 do print(math.random(-1000,1000));   -- 随机区间 [-1000,1000], math.random(1000) 表示 [1,1000] end; 2. 最大,最小值 math.max   math.min 二.table 库 1. 插入和删除 a = {10,20,30}; print(unpack(a)); table.i

在使用R做数据挖掘时,最常用的数据结构莫过于dataframe了,下面列出几种常见的dataframe的操作方法

原网址 http://blog.sina.com.cn/s/blog_6bb07f83010152z0.html 在使用R做数据挖掘时,最常用的数据结构莫过于dataframe了,下面列出几种常见的dataframe的操作方法.1.查看数据 head(dataframe) # 查看数据前10行tail(dataframe) # 查看数据后10行 2.合并数据(1)data.frame(x,y)x,y是dataframe或者一列数据,x和y的行数一样,该操作得到一个新的dataframe,该dat

游戏制作中的大宝剑---常用的数据结构与算法

前言 时间流逝,物是人非,就好像涌动的河流,永无终焉,幼稚的心智将变得高尚,青年的爱慕将变得深刻,清澈之水折射着成长. ----------<塞尔塔传说> PS:为了方便大家阅读,个人认为比较重要的内容-------红色字体显示 个人认为可以了解的内容-------紫色字体显示 --------------------------------------------------------------------------- ---------------------------------

一些常用的数据结构维护手法

这篇会理论上讲一讲常用的数据结构维护手法. 我是嘴巴选手我自豪! ①cdq分治 现在我们有一些修改,有一些询问,修改之间独立. 我们考虑分治,对于左右两半分别分治,然后对于左边的修改计算对右边询问的贡献. 本身的复杂度是O(nlogn). ②整体二分 现在我们有一些修改,有一些询问. 我们需要求出,在最少多少组修改之后满足题目条件.(或者可以转化成这样) 对于单组询问,我会二分!对于多组询问,真不巧,二分超时了... 我们考虑整体二分.整体二分的框架大概是这样: def 整体二分(el,er,q

lua常用函数

select (index, ···) 功能:当index为数字将返回所有index大于index的参数: 如:select(2,"a","b","c") 返回 "b","c" 当index为"#",则返回参数的总个数(不包括index) 如:select("#","a","b","c") 返回 3 lua常

关于海量数据常用的数据结构

数据结构 应用场景 示例 哈希表 要求所有键值对放入内存,查找可以在常数时间内完成. l  提取某日志访问百度次数最多的IP l  统计不同电话号码的个数 堆 插入和调整需要O(logn)时间,n为堆元素的个数,而获取堆顶元素只需要常数时间. l  求出海量数据前K大的数 l  求海量数据流的中位数 BitMap 通常记录整数出现的情况,用来快速查找.数字判重.删除元素等. l  统计不同电话号码的个数 l  2.5亿个整数中查出不同重复的整数个数 双层桶 两次寻址方式以节省内存,通常用在求第K

Python 常用查找数据结构及算法

一.基本概念 二.无序表查找 三.有序表查找 3.1 二分查找(Binary Search) 3.2 插值查找 3.3 斐波那契查找 四.线性索引查找 4.1 稠密索引 4.2 分块索引 4.3 倒排索引 五.二叉排序树 六. 平衡二叉树 七.多路查找树(B树) 7.1 2-3树 7.2 2-3-4树 7.3 B树 7.4 B+树 八.散列表(哈希表) 8.1 散列函数的构造方法 8.2 处理散列冲突 8.3 散列表查找实现 8.4 散列表查找性能分析 参考书目<大话数据结构> 一.基本概念