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 ...
随机推荐
- Linux下安装tensorflow
- Linux SVN 命令详解
1.将文件checkout到本地目录 svn checkout path(path是服务器上的目录) 例如:svn checkout svn://192.168.1.1/pro/domain ...
- 一些VS2013下使用QT和MFC的错误解决方案
http://blog.csdn.net/lovejiayang/article/details/51853191
- Apache 配置多站点访问「为项目分配二级域名」
一级域名(baidu.com)也叫作顶级域名,注册一级域名是需要付费的. 而二级域名(image.baidu.com)是一级域名的延伸,所以只要购买了一级域名,二级域名是可以任意配置的. 其实(www ...
- Android实现双击事件的两种方式
Work around的方法是先监听onTouch事件来监听连续点击次数,每次点击都布置一个间隔时间的延时任务,延时任务执行时判断间隔内是否还有点击,如果没有则发布点击次数,重置计数. 实现代码如下: ...
- Erlang C1500K长连接推送服务-内存
上篇 Erlang C1500K长连接推送服务-性能 提到:150w连接,使用了23GB内存,每个连接占用15KB,约一半是内核使用. 大概分析一下: 1. Erlang 节点 12GB,内部因为有内 ...
- 常用jQuery代码
返回元素的html包括它本身 <div class="test"><p>hello,你好!</p></div> <script ...
- Java内存管理及GC算法
概述 内存划分 虚拟机规范中将内存分为六大部分,分别为PC寄存器.JAVA虚拟机栈.JAVA堆.方法区.运行时常量及本地方法栈. 1.PC寄存器:线程独占: 2.JAVA虚拟机栈:线程独有:JAVA虚 ...
- C# 连接DB2字符串 Oracle免安装客户端连接字符串
以下是DB2连接数据库 1)使用IBM.Data.DB2链接DB2数据库 2)必须安装DB2客户端,IBM.Data.DB2在安装的BIN里可以找到 3)注意一下DB2客户端版本问题,我的就是WIN7 ...
- 「C++」理解智能指针
维基百科上面对于「智能指针」是这样描述的: 智能指针(英语:Smart pointer)是一种抽象的数据类型.在程序设计中,它通常是经由类型模板(class template)来实做,借由模板(tem ...