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 ...
随机推荐
- 使用node初始化项目
初始化项目 在建项目的时候经常会建很多文件夹和文件,今天使用node初始化项目自动生成这些内容. 执行步骤 执行命令 node init 初始化项目生成package.json 设置配置文件 var ...
- POJ1753(位操作和枚举)
题目:http://poj.org/problem?id=1753 题意:一块4*4的棋盘,黑白块不规律分布,翻动一个色块,其上下左右,都会被翻动,知道全黑全白为止.输出最小次数,达不到则输出“Imp ...
- Life Is A Funny Proposition After All
你们有没有坐下思考,感到疑惑 ,静静思考,我们为什么在这里 ,生活为什么如此这般 这个问题让无数聪明人喝酒买醉,这是最最奇怪的事情,他们都想弄清楚,科学家们可以展示上千种不同的理论,但从未证明这是为什 ...
- 【Network】Neutron-Docker-K8S
Neutron-Docker-K8S openstack/neutron: Neutron is a virtual network service for Openstack. Neutron和SD ...
- Python AES - base64 加解密
首先python引用AES加密 from Crypto.Cipher import AES 需要先安装 Crypto 模块, 可以使用 easy_install 进行安装 会自动去官网进行搜索 ...
- 关于layoutSubviews
layoutSubviews 是什么? 设定subviews的尺寸和位置,如果要精确布局,可以在子类里重写此方法.不能直接调用此方法,如果想强制layout刷新,调用setNeedsLayout来代替 ...
- mysql5.7安装
用到的命令和文件: 错误日志:/usr/local/mysql/data/carydeMBP.lan.err 忘记密码时,关闭mysql的密码登陆验证:mysqld_safe --skip-grant ...
- C# 连接DB2字符串 Oracle免安装客户端连接字符串
以下是DB2连接数据库 1)使用IBM.Data.DB2链接DB2数据库 2)必须安装DB2客户端,IBM.Data.DB2在安装的BIN里可以找到 3)注意一下DB2客户端版本问题,我的就是WIN7 ...
- SQL批量增加修改数据
insert into A表(字段1,字段2) select 字段1,字段2 From B表 [注:字段类型.字段数应相同] --批量进行修改ID值 declare @i int begin )) F ...
- 【webGL】threejs入门 ---创建一个简单立方体
开发环境 Three.js是一个JavaScript库,所以,你可以使用平时开发JavaScript应用的环境开发Three.js应用.如果你没什么偏好的话,我会推荐Komodo IDE. 调试建议使 ...