首页 > 其他分享 >lua中统计数表数据两个方法及其优劣

lua中统计数表数据两个方法及其优劣

时间:2022-12-18 20:11:32浏览次数:43  
标签:last -- 优劣 times lua wrong error 数表

现在有一个需求: 针对一个答题统计, 需要统计近5次的错误次数.

思路是, 使用数表去储存这5次错误次数, 然后统计数表

现在有一个5个元素的数表 error_last_5_times = {1, 0, 1, 0 ,1} 其中1表示正确, 0表示错误

这里有两种统计方法:

-- 方法1: 使用迭代数表来统计
error_last_5_times = {1, 0, 1, 0 ,1}
total1 = function (error_last_5_times)
  local wrong_times = 0
  for i = 1, 5 do
    if error_last_5_times[i] == 0 then
      wrong_times = wrong_times + 1
    end
  end
  return wrong_times
end
-- 方法2: 使用字符串统计
error_last_5_times = {1, 0, 1, 0 ,1}
total2 = function (error_last_5_times)
  local _, wrong_times
  -- 将数表转化为字符串, 统计替换字符串中"0"的次数
  _, wrong_times = table.concat(error_last_5_times, ""):gsub("0", "")
  return wrong_times
end

通常而言, total1 函数会更快一些, 但是可读性上不是很好.

total2 函数因为使用到了两个内置函数( table.concatstring.gsub )去处理, 可读性上会更高, 但是效率会稍微差上一些, 这一点点出来之后稍微回看一下代码就可以比较清楚的理解了.


还有一个新的需求: 因为是一个答题模拟, 所以不断地有新的数据传入, 需要将新数据答题的正确或者错误, 写入 error_last_5_times 这个表中, 但是需要统计的还是近5次的错误次数.

也就是, 需要一个添加新数据的函数.

一样的, 我们看两个函数:

-- 方法1: 使用循环缓存结构去添加新数据
-- 在`error_last_5_times`表中添加一个键`index`, 用来缓存循环数
error_last_5_times = {1, 0, 1, 0 ,1 , index = 0}
add1 = function (error_last_5_times, value)
  -- 使用余数进行限制循环
  error_last_5_times.index = (error_last_5_times.index % 5) + 1
  error_last_5_times[error_last_5_times.index] = value
  return error_last_5_times
end

在上面这个方法中, 使用了一个循环缓存结构去添加新数据, 即 error_last_5_times.index 是一个从1~5逐步循环的数, 当超过6的数出现时, 会回滚到前面的索引并覆盖原来的数据, 这使得添加新数据并不需要很高的运算.

-- 方法2: 使用内置表操作函数去添加新数据
error_last_5_times = {1, 0, 1, 0 ,1}
add2 = function (error_last_5_times, value)
  table.insert(error_last_5_times, 1, value)
  table.remove(error_last_5_times)
  return error_last_5_times
end

在这一个方法中, 每次添加新数据, 会使用 table.inseterror_last_5_times 的第一个元素添加新的正确率数据, 并使用 table.remove 删除最后一个数据, 由于Lua中移动表的效率较低, 所以很明显, 这也是一个增加可读性以减少程序效率的方法.

标签:last,--,优劣,times,lua,wrong,error,数表
From: https://www.cnblogs.com/Yiero/p/16990850.html

相关文章

  • IEEE浮点数表示
    **浮点数表示**IEEE浮点标准用$V=(-1)^s*M*2^E的形式来表达一个数$: -符号(sign)s决定这个数是负数(s=1)还是正数(s=0),而对于数值0的符号解释作为特殊情况处理......
  • [SDOI2014]数表
    链接:https://www.luogu.com.cn/problem/P3312题目描述:求$\sum_{i=1}^{n}\sum_{j=1}^{m}d(gcd(i,j))[d(gcd(i,j))<=a]$题解:我们先会有一个直观的想法:先不考虑$a$的限制:......
  • luabind-0.9.1在windows、linux下的使用详解及示例
    一.下载  1. 本篇博客使用的版本为luabind-0.9.1二.编译  1.luabind-0.9.1在window 三.示例代码下载:  1.windows下示例代码下载地址(环境是win7,VS2008,已......
  • linux centos 编译luabind-0.9.1 动态库 静态库
    编译步骤一.需先编译好lua,编译好静态库即可,编译lua的具体步骤如下:  1.lua5.1.5下载地址注意:貌似使用lua5.2版本来编译luabind会出现各种奇怪的报错,所以拿lua5.1做测......
  • 【Unity】 HTFramework框架(三十三)XLua热更新
    更新日期:2020年3月20日。Github源码:​​​[点我获取源码]​​​Gitee源码:​​[点我获取源码]​​索引​​XLua热更新简介​​​​使用XLua热更新​​​​创建XLua开发环境......
  • 滴水3.权限控制+虚函数表
    1.头文件的引入使得结构简洁 2.私有与公共3.私有的如何访问   4.私有的优势5.类与结构区别  成员权限区别继承权限    默认继承私有6.私有是否可以被继承 ......
  • 初探极限符号表示形式之优劣
    对于数列极限定义1,其中我们着重来看$\lim_{n\rightarrow\infty}\mspace{2mu}a_{n}=a$,这是大多数教材通常采用的对极限现象的符号代表形式,为了进一步了解极限的性质及......
  • 深入LUA脚本语言,让你彻底明白调试原理
    这是道哥的第008篇原创一、前言上篇文章我们聊了​​gdb的底层调试机制​​,明白了gdb是利用操作系统提供的系统信号来调试目标程序的。很多朋友私下留言了,看到能帮助到大......
  • lua模式匹配
    新入门skynet系列视频b站网址https://www.bilibili.com/video/BV19d4y1678X普通字符串模式字符串普通字符串在普通字符串中,字符\是转移字符。也就是说\有特殊......
  • 5-skynet.newservice创建snlua服务
    新入门skynet系列视频b站网址https://www.bilibili.com/video/BV19d4y1678X#skynet.newservice创建snlua服务之前讲服务间请求和响应的时候,我们在main服务里启动了......