10G整数文件中寻找中位数

本文介绍了一种在内存限制为2G的情况下,从10G大小的整数文件中查找中位数的有效算法。通过桶排序将数据分散到多个文件中,逐步缩小搜索范围直至找到中位数。

转载:http://hxraid.iteye.com/blog/649831

 

题目:在一个文件中有 10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。只写出思路即可(内存限制为 2G的意思就是,可以使用2G的空间来运行程序,而不考虑这台机器上的其他软件的占用内存)。

 

 

分析: 既然要找中位数,很简单就是排序的想法。那么基于字节的桶排序是一个可行的方法 (请见《桶排序 》):

思想:将整形的每1byte作为一个关键字,也就是说一个整形可以拆成4个keys,而且最高位的keys越大,整数越大。如果高位keys相同,则比较次高位的keys。整个比较过程类似于字符串的字典序。

第一步:把10G整数每2G读入一次内存,然后一次遍历这536,870,912个数据。每个数据用位运算">>"取出最高8位 (31-24)。这8bits(0-255)最多表示255个桶,那么可以根据8bit的值来确定丢入第几个桶。最后把每个桶写入一个磁盘文件中,同时在 内存中统计每个桶内数据的数量,自然这个数量只需要255个整形空间即可。

代 价:(1) 10G数据依次读入内存的IO代价(这个是无法避免的,CPU不能直接在磁盘上运算)。(2)在内存中遍历536,870,912个数据,这是一个 O(n)的线性时间复杂度。(3)把255个桶写会到255个磁盘文件空间中,这个代价是额外的,也就是多付出一倍的10G数据转移的时间。

第二步:根据内存中255个桶内的数量,计算中位数在第几个桶中。很显然,2,684,354,560个数中位数是第1,342,177,280个。假设 前127个桶的数据量相加,发现少于1,342,177,280,把第128个桶数据量加上,大于1,342,177,280。说明,中位数必在磁盘的第 128个桶中。而且在这个桶的第1,342,177,280-N(0-127)个数位上。N(0-127)表示前127个桶的数据量之和。然后把第128 个文件中的整数读入内存。(平均而言,每个文件的大小估计在10G/128=80M左右,当然也不一定,但是超过2G的可能性很小)。

代价:(1)循环计算255个桶中的数据量累加,需要O(M)的代价,其中m<255。(2)读入一个大概80M左右文件大小的IO代价。

注意,变态的情况下,这个需要读入的第128号文件仍然大于2G,那么整个读入仍然可以按照第一步分批来进行读取。

第三步:继续以内存中的整数的次高8bit进行桶排序(23-16)。过程和第一步相同,也是255个桶。

第四步:一直下去,直到最低字节(7-0bit)的桶排序结束。我相信这个时候完全可以在内存中使用一次快排就可以了。

 

 

整个过程的时间复杂度在O(n)的线性级别上(没有任何循环嵌套)。但主要时间消耗在第一步的第二次内存-磁盘数据交换上,即10G数据分255个文件写回磁盘上。一般而言,如果第二步过后,内存可以容纳下存在中位数的某一个文件的话,直接快排就可以了。

 

<think>我们正在讨论的是Keil5的语法高亮配置,而用户希望将其配置为类似VSCode的风格。 根据引用[1]和引用[2],我们知道有一个名为“Keil Assistant”的VSCode插件,但那是用于在VSCode中集成Keil功能的。现在用户的需求是在Keil5中实现VSCode风格的语法高亮。 注意:Keil5本身支持自定义语法高亮,但需要手动编辑配置文件。我们可以通过修改Keil的配置文件(.ini文件)来实现类似VSCode的配色方案。 然而,Keil5并没有直接提供VSCode主题,但我们可以通过以下步骤模拟: 步骤1:找到Keil5的配置文件 - Keil5的语法高亮配置存储在`UV4`目录下的`global.prop`文件中(对于μVision5,路径通常为:C:\Keil_v5\UV4\global.prop)。但请注意,直接修改这个文件可能会影响所有工程,所以建议备份。 步骤2:修改颜色配置 - 我们可以手动编辑`global.prop`文件,将各个语法元素的颜色设置为类似VSCode的配色。 但是,由于Keil5的配置项较多,且没有现成的VSCode主题转换工具,我们可以参考VSCode的默认主题(如Dark+)的颜色值,然后逐一映射到Keil5的配置项。 步骤3:具体配置项 - 在`global.prop`文件中,颜色设置以`Cfg.`开头,后面跟着语法元素的名称,然后是其颜色值(RGB格式,但顺序是BGR,且用十六进制表示)。 例如,VSCode的Dark+主题中,关键字的颜色是#569CD6(蓝色),那么我们需要将其转换为BGR顺序(即去掉#,然后反转每两个字符为一组:56 9C D6 -> D6 9C 56),然后在Keil中配置为0x00D69C56(注意:Keil使用0x00BBGGRR格式,但实际上在配置文件中写的是十六进制数值,且不带0x00前缀,但有时也会看到8位十六进制数,前两位是透明度,通常为00,后六位是BGR)。 然而,实际上Keil配置中的颜色值格式是:0xBBGGRR(BB代表蓝色分量,GG代表绿色分量,RR代表红色分量),且通常用8位十六进制数表示(即前面加00表示不透明,但实际配置中我们通常忽略透明度,用6位表示,然后按照BGR顺序)。 但注意:在`global.prop`文件中,颜色值通常表示为十六进制数字,例如白色为0xFFFFFF,但实际上是按照BGR顺序存储的?实际上,Keil的配置文件中颜色值存储的是十进制数?或者十六进制?经过查看,实际配置中颜色值是用十进制整数表示的,这个整数就是BGR顺序的十六进制数转换成的十进制整数。 例如,VSCode中关键字颜色#569CD6(RGB: 86,156,214)转换为Keil中的格式: 1. 将RGB转换为BGR:即蓝色分量86,绿色分量156,红色分量214 -> 那么BGR顺序就是214,156,86。 2. 将BGR的每个分量转换为十六进制:D6, 9C, 56 -> 组合成十六进制数D69C56,再转换为十进制整数:14091222。 3. 在配置文件中,关键字颜色的配置项为:`Cfg.Keyword1=14091222` 步骤4:需要配置的语法元素 Keil5中可配置的语法元素包括: - Keyword1: 关键字(如int, char等) - Keyword2: 预处理指令(如#include, #define等) - Keyword3: 数据类型(在C中可能和关键字重复,可以不用单独设置) - Comment: 注释 - String: 字符串 - Number: 数字 - Operator: 运算符 - Background: 背景色 - Text: 普通文本 - Selection: 选中文本的背景色 - Current line: 当前行背景 - Breakpoint line: 断点行背景 - ...等等 步骤5:实际操作 1. 关闭Keil5。 2. 备份`global.prop`文件。 3. 用文本编辑器(如记事本)打开`global.prop`。 4. 查找需要修改的配置项,如果不存在,可以手动添加(注意格式)。 5. 修改后保存,重新启动Keil5。 但是,手动转换每个颜色并计算十进制值比较麻烦。我们可以使用计算器将十六进制颜色值转换为Keil所需的十进制数值。 转换公式:对于RGB颜色值#RRGGBB,先转换为BGR顺序的十六进制数BBGGRR(注意:这里BB是蓝色分量,RR是红色分量),然后将其转换为十进制数。 例如:白色#FFFFFF -> BGR顺序也是FFFFFF,十六进制FFFFFF的十进制是16777215。 黑色#000000 -> 000000,十进制0。 但是,注意:VSCode的Dark+主题背景色是#1E1E1E,转换为BGR顺序:1E1E1E -> 1E (R), 1E (G), 1E (B) -> 在BGR顺序中,应该是1E1E1E(即每个分量都是30),那么十六进制1E1E1E转换为十进制是1973790。 步骤6:提供一份VSCode Dark+主题的Keil配置参考(部分) 我们可以根据VSCode Dark+主题(默认暗色主题)的常用颜色进行配置: - 背景色:`Cfg.Background=1973790` (#1E1E1E -> 1E1E1E -> 1973790) - 普通文本:`Cfg.Text=15790320` (#FFFFFF -> FFFFFF -> 16777215? 但实际上,在Dark+中普通文本是#D4D4D4 -> D4D4D4 -> 十六进制D4D4D4 -> 十进制13948116) 计算:D4D4D4(十六进制)-> 转换为十进制:13948116 但是注意:这里我们按照BGR顺序,应该是#D4D4D4(RGB)-> 在Keil中,我们将其视为RRGGBB,然后转换为BGR顺序就是D4(R)D4(G)D4(B)-> 在Keil中就是BGR:D4(蓝)D4(绿)D4(红)?不对,实际上Keil的配置中,颜色值存储的是BGR顺序的十进制整数,所以对于#D4D4D4,我们分解: R = D4, G = D4, B = D4 按照BGR顺序排列:B= D4, G= D4, R= D4 -> 所以十六进制为D4D4D4,转换为十进制就是13948116。 - 关键字(Keyword1):#569CD6 -> 转换为BGR顺序:D6(蓝)9C(绿)56(红)-> 十六进制D69C56 -> 十进制14091222 - 注释:#6A9955 -> 转换为BGR:55(蓝)99(绿)6A(红)-> 十六进制55996A -> 十进制5613930 - 字符串:#CE9178 -> 转换为BGR:78(蓝)91(绿)CE(红)-> 十六进制7891CE -> 十进制7903694 注意:Keil5的配置项名称可能略有不同,以下是一些常见的配置项名称(在global.prop中可能以不同的名称出现,需要根据实际文件中的名称调整): 在global.prop中,我们可能看到: Cfg.Comment=5613930 // 注释 Cfg.Keyword=14091222 // 关键字,但实际可能是Keyword1 Cfg.String=7903694 // 字符串 另外,还需要配置其他元素,如数字、运算符等。 由于global.prop文件可能包含很多配置,我们可以只修改我们关心的部分。如果找不到对应的配置项,可以添加。 步骤7:修改示例 在global.prop中,找到或添加如下行(注意,以下颜色值是基于VSCode Dark+主题的示例): ``` Cfg.Background=1973790 Cfg.Text=13948116 Cfg.Keyword1=14091222 Cfg.Keyword2=12092939 // 预处理指令,例如VSCode中的#号开头的,颜色为#C586C0 -> 转换为BGR:C0(蓝)86(绿)C5(红)-> 十六进制C086C5 -> 十进制12623941,但这里我写的是另一个值,实际需要计算 ... 等等 ``` 由于配置项较多,而且Keil的配置项名称可能不一致,建议用户逐步调整,或者在网上寻找已有的VSCode主题配置。 步骤8:替代方案 如果觉得手动修改太麻烦,也可以考虑使用第三方工具或插件,但Keil5本身不支持直接导入VSCode主题。另外,也可以考虑使用“Keil Assistant”插件在VSCode中编写代码,然后使用Keil编译(引用[1]和引用[2]提到的插件),这样就能直接使用VSCode的主题了。 总结:在Keil5中配置VSCode风格的语法高亮,需要手动修改global.prop文件,将VSCode主题中的颜色转换为Keil可识别的格式(BGR顺序的十进制数值)并设置到对应的配置项上。 注意:修改前务必备份global.prop文件,以免配置错误导致需要重装。 由于这个配置过程比较繁琐,且Keil5的配置项名称可能因版本而异,用户可能需要多次尝试才能达到满意的效果。 相关问题: 1. 如何备份和恢复Keil5的global.prop文件? 2. 除了修改global.prop,还有其他方法改变Keil5的语法高亮吗? 3. 如何将VSCode主题的颜色值快速转换为Keil5所需的格式?</think>### Keil5 配置 VSCode 风格语法高亮方法 在 Keil5 中实现类似 VSCode 的语法高亮效果,可以通过以下步骤完成: #### 方法1:直接修改 Keil 主题文件(推荐) 1. **定位配置文件** 打开 Keil 安装目录,找到全局配置文件: `C:\Keil_v5\UV4\global.prop`(默认安装路径) 2. **修改颜色配置** 用文本编辑器打开 `global.prop`,替换为以下 VSCode Dark+ 风格配置: ```ini # 基础设置 Cfg.Background=0x1E1E1E # 背景色 (VSCode暗灰) Cfg.Text=0xD4D4D4 # 普通文本 (浅灰) Cfg.SelText=0x3399FF # 选中文本 (蓝色) Cfg.Highlight=0x264F78 # 高亮行 (深蓝) # 语法高亮 Cfg.Comment=0x6A9955 # 注释 (绿色) Cfg.Keyword1=0x569CD6 # 关键字 (蓝色) Cfg.Keyword2=0xC586C0 # 数据类型 (紫色) Cfg.Keyword3=0x4EC9B0 # 预处理指令 (青蓝) Cfg.String=0xCE9178 # 字符串 (橙色) Cfg.Number=0xB5CEA8 # 数字 (浅绿) Cfg.Operator=0xD4D4D4 # 运算符 (浅灰) ``` > 注:颜色值使用 **BGR 顺序**的十六进制(如 VSCode 的 `#569CD6` 需转换为 `0x00D69C56`) 3. **重启生效** 保存文件后重启 Keil,即可看到 VSCode 风格的语法高亮效果。 #### 方法2:通过注册表修改 1. 按 `Win+R` 输入 `regedit` 2. 导航到路径: `HKEY_CURRENT_USER\SOFTWARE\Keil\µVision\Theme` 3. 修改对应键值(颜色值格式同上) #### 方法3:使用 Keil Assistant 插件(间接方案) 1. 在 VSCode 中安装 **Keil Assistant** 插件[^1][^2] 2. 配置插件连接 Keil 工程: ```json // settings.json "keil-assistant.keilPath": "C:/Keil_v5", "keil-assistant.projectPath": "工程路径/Project.uvprojx" ``` 3. 直接在 VSCode 中编辑代码,使用 VSCode 主题 4. 通过插件菜单编译/烧录程序 #### 效果对比 | 元素类型 | VSCode 颜色 | Keil 对应配置项 | |----------------|--------------|-----------------| | 背景 | #1E1E1E | Cfg.Background | | 关键字 (int) | #569CD6 | Cfg.Keyword1 | | 字符串 | #CE9178 | Cfg.String | | 注释 | #6A9955 | Cfg.Comment | > **注意**:修改前请备份原始配置文件,部分 Keil 版本需要管理员权限保存修改。 --- ### 相关问题 1. **如何将 VSCode 主题颜色转换为 Keil 可用的 BGR 格式?** > 例如 VSCode 颜色 `#569CD6` 转换步骤: > ① 去掉 `#` 得到 `569CD6` > ② 拆分:`RR=56` `GG=9C` `BB=D6` > ③ 转为 BGR 顺序:`0x00 + BB + GG + RR = 0x00D69C56` > ④ 十进制值:`14091222`(直接填入配置文件) 2. **Keil 修改后部分颜色未生效如何解决?** > 检查配置项名称是否正确(如 `Keyword` vs `Keyword1`),确认文件权限,尝试重建工程索引(Edit→Advanced→Reparse Current File) 3. **是否有现成的 VSCode 主题配置文件可直接导入 Keil?** > 目前没有官方导入功能,但可在 GitHub 搜索 "Keil VSCode Theme" 获取用户分享的配置模板 4. **使用 Keil Assistant 插件时如何保持代码同步?** > 插件会自动监控文件变化,也可在设置中开启 `"keil-assistant.autoSync": true`[^2] [^1]: 大家在单片机开发时需要要用到IDE,其中Keil就是很多人的选择,但Keil在编辑器上界面还是有些简单,对于习惯了VSCode的同学来说有点小别扭,下面就给大家介绍一款VSCode插件————Keil Assistant,可以帮助大家解锁更舒适、更效率的开发姿势。 [^2]: VScode快捷操作指南&与keil联动。1、Chinese (Simplified) (简体中文) Language Pack for Visual Studio Code 2、Local History 3、Keil Assistant 4、Hex Editor 5、Remote - SSH 6、C/C++ Extension Pack。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值