Lua 排行榜更新
排行榜:
key:玩家名字,val:玩家的数值
local key1 = {"a1", "a2", "b1", "b2", "a3"}
local val1 = {, , , , }
local key2 = {"b1", "a", "a2", "b2"}
local val2 = {, , , }
val1:原排行榜中的数值,已排序(从小到大)
key1:原排行榜val已排序的数值对应的名字
key2, val2为新的数据,两组数据合并为一组,相同名字的数值合并取最小(或最大)
采用归并排序
迭代法步骤:
1. 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
2. 设定两个指针,最初位置分别为两个已经排序序列的起始位置
3. 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
4. 重复步骤3直到某一指针达到序列尾
5. 将另一序列剩下的所有元素直接复制到合并序列尾
递归法
原理如下(假设序列共有n个元素):
- 将序列每相邻两个数字进行归并操作,形成个序列,排序后每个序列包含两个元素
- 将上述序列再次归并,形成个序列,每个序列包含四个元素
- 重复步骤2,直到所有元素排序完毕
动态图:
又因旧排行榜数据和新排行榜数据已经是两个已经有序的数列,就不用再分了。但需要合并相同名字的数据只保留一份
使用协程合并:
local keys, vals = {}, {}
-- 创建协程
local function createCo(keys, values)
return coroutine.create(
function ()
for i, v in ipairs(values or {}) do
coroutine.yield(keys[i], v)
end
end
)
end
-- 插入到结果中并唤醒协程
local function insertResultAndResume(key, val, co)
for _, v in next, keys do
if v == key then
return coroutine.resume(co)
end
end
table.insert(keys, key)
table.insert(vals, val)
return coroutine.resume(co)
end
local co1, co2 = createCo(key1, val1), createCo(key2, val2)
local r1, k1, v1 = coroutine.resume(co1)
local r2, k2, v2 = coroutine.resume(co2) while v1 and v2 do
if v1 > v2 then
r2, k2, v2 = insertResultAndResume(k2, v2, co2)
else
r1, k1, v1 = insertResultAndResume(k1, v1, co1)
end
end
while v1 do
r1, k1, v1 = insertResultAndResume(k1, v1, co1)
end
while v2 do
r2, k2, v2 = insertResultAndResume(k2, v2, co2)
end print("-------result--------")
for i, v in pairs(keys) do
print(v, "= ", vals[i])
end
-- 打印结果为:
-------result--------
a1 =
b1 =
a2 =
b2 =
a3 =
Lua 排行榜更新的更多相关文章
- Lua热更新时正确设置文件名
Lua热更新时正确设置文件名(金庆的专栏 2016.12)Lua热更新模块见:https://github.com/jinq0123/hotfix其中使用 load(chunk) 来加载更新后的内容, ...
- Lua热更新(hotfix)
Lua热更新(hotfix)(金庆的专栏)hotfixLua 5.2/5.3 hotfix. Hot update functions and keep old data.https://github ...
- 出售一套Unity + Lua热更新框架代码
出售一套Unity + Lua的客户端框架代码,功能有资源管理.网络通信.配置文件解析.热更新.文件读写.Lua加密揭秘.UI框架.打包工具.编辑器工具等,已经在多个实际项目(已上线)中使用.代码优雅 ...
- (原创)cocos lua 热更新从零开始(一)最简单demo
开发环境:WIN7 + cocos2dx 3.10 lua版本 0.学习这篇内容的基础是你要会创建并运行一个cocos lua项目 1.热更新的思想所谓的热更新,就是在线更新代码和资源.热更新的过程首 ...
- cocos2dx lua 热更新方案的实现
(Upgrade.h) #include <stdio.h> #include "cocos2d.h" #include "framework/utils/U ...
- Lua------------------unity与lua的热更新
[Unity3D]Unity3D游戏开发之Lua与游戏的不解之缘终结篇:UniLua热更新完全解读 标签: 游戏开发游戏解决方案用户体验unity3d 2014-10-18 23:23 7680人阅读 ...
- [Unity3D]Unity3D游戏开发之Lua与游戏的不解之缘终结篇:UniLua热更新全然解读
---------------------------------------------------------------------------------------------------- ...
- 腾讯开源手游热更新方案,Unity3D下的Lua编程
原文:http://www.sohu.com/a/123334175_355140 作者|车雄生 编辑|木环 腾讯最近在开源方面的动作不断:先是微信跨平台基础组件Mars宣布开源,腾讯手游又于近期开源 ...
- Lua学习笔记(一)-----C#和lua的交互
一直以来对Lua热更新技术很感兴趣,在上周开始了对Lua的学习,主要学的是uLua. 直接上干货 准备工作: LuaInterface包括两个核心库一个是LuaInterface.dll,一个是Lua ...
随机推荐
- 30多条mysql数据库优化方法,千万级数据库记录查询轻松解决(转载)
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...
- Android app AOP添加埋点技术总结
目标:通过面向切面编程来实现对源代码无侵入的埋点. 方式 能力 缺点 学习曲线 XPosed 运行期hook 能hook自己应用进程的方法: 能hook别的应用的方法: 能hook系统方法 ...
- 阿里云部署nodejs服务器(windows)
花了大半个月做的网站终于要上线了,周围的同学们很多都在使用阿里云的服务器,我也入手了一台.考虑到自己不是很适应ubuntu的命令行界面,于是买了个windows的,上网搜了一下,似乎都是用linux来 ...
- python ConfigParser 模块
ConfigParser的函数方法 读取配置文件 read(filename) 直接读取ini文件内容 sections() 得到所有的section,并以列表的形式返回 options(sectio ...
- 数据库如何生成sql语句
以SQL SERVER 2008为例子. 1.启动客户端管理器,连接到要生成脚本的数据库. 2.在左边的”对象资源管理器“中,右键选择该数据库打开菜单.选择”任务“,”生成脚本“菜单,打开对话框. 3 ...
- 【NodeJs环境下bower】如何更改bower_components文件夹的位置
bower在初始化,默认是将bower_components文件夹放到项目的根目录下,若是public/index.html如何配置bower_components下的js或者css类库呢?只需要将b ...
- 在ashx文件中制作验证码(使用session要继承IRequiresSessionState)
必须继承System.Web.SessionState.IRequiresSessionState接口,才能实现Session读写! System.Web.SessionState的一些接口 IRea ...
- gulp学习-gulpfile
安装gulp 假设已经安装了node 和npm (淘宝的cnpm很适合国内使用). 1.首页全局安装gulp. 1 npm install --global gulp 2.其次局部安装gulp.(注: ...
- oh my zsh
简单使用oh my zsh 安装oh my Zsh 安装zsh 安装curl或者wget 下载并安装oh my zsh: curl 下载方式curl -L https://raw.github.com ...
- excel的导入导出的实现
1.创建Book类,并编写set方法和get方法 package com.bean; public class Book { private int id; private String name; ...