引用
题目:给定一个包含有一亿随机整数的数组,要求对其排序,越快越好,请给出算法。(随意发挥,对内存无要求)
年末大家闲的蛋疼,有同事抛出上述题目切磋切磋。之后一哥们给出一个大规模数据排序的Fork/Join解法,基本思路如下:“从样本中任意取一个元素(比如最后一个元素),将整个数组Array分为两部分Array_1和Array_2,其中Array_1的每个元素比这个数大,Array_2的每个元素比这个数小”,再分别对Array_1和Array_2执行上述操作,直到每个小array_n_n的规模到达某个量级(比如5k个),再用基本的排序算法对每个小array_n_n排序,最后合并整个结果集。
经测试,别说亿级,即使样本规模缩小到百万级,此解法的效率也是极其低下,当然这不是Map/Reduce擅长的场景,不是他的菜,我们只是玩玩,切磋切磋而已。
后来我想到一个自以为比较不错的方法,记录下来以备用。当然此法也是有缺陷的,稍后再说,思路如下:不好意思,拿铁道部举个例子,假设样本数组中的数值表示的是某人回家的火车的车次编码,比如第一个元素是302,其代表这个人要坐302次列车回家见妈,这一亿个样本数据就是一亿个人,每个人背上写着回家要坐的火车车次号码编码(不是座位号,仅仅是哪趟车),比如你是1404次列车,他是302次列车,我也是1404次,首先请铁道部车准备好一亿辆从小到大编好号码的火车(艾玛,铁道部赚大了),1次,2次。。302次。。。1404次一字排开,然后大家按队伍先后一个个上火车(当然也可以一股脑往上挤,那就是并发啦),最后铁道部按照火车次序挨个说,你们都是使用插件抢的票,统统下车,这按照火车次序挨个清理出来的人即是排序结果。
大家都是码农,就直接上代码:
@Test
public void sort() {
final byte[] tmp = new byte[SIZE];// 用byte省点空间
int index = SIZE;
while (--index >= 0) {
tmp[datas[index]] += 1;
}
byte t;
int i = 0;
index = SIZE;
while (--index >= 0) {
t = tmp[index];
while (t-- > 0)
datas[i++] = index;
}
}
上述代码算头算尾一共15行,没错吧,我不是标题党!我在公司机器上(32位 win server 2003 3G内存 2核CPU)跑基本在5.5秒左右即可完成排序,回家在自己机器上(64位win7旗舰版 4核CPU 4G内存)试了很多遍,基本都是在4.5秒左右便可以完成。
当然,这算法是有缺陷的,辅助数组byte[] tmp的初始程度应该是样本数据中的绝对值的最大值,你必须先想办法弄到最大值,额。。。如果你是高富帅可以new个Integer.MAX_VALUE的辅助数组。另外,有同事说你这个算法要求样本必须是正数才行,我觉得包含负数也OK啊,再弄个byte[] tmp2,针对负数取绝对值反着排,分而治之再合并。代码见附件,欢迎拍砖。
ps:首先,我承认我是标题党,我就是为了引起大家注意的,谁让咱刚开始写博客,人气低呢。
- 大小: 261.6 KB
分享到:
相关推荐
教你四行代码搞定钉钉打卡
根据提供的标题、描述、标签及部分内容,我们似乎在探讨一个涉及使用三行代码来执行特定计算机操作的主题。然而,给出的信息并不完整且存在明显的错误与混淆。为了更好地理解和阐述这一主题,我们可以假设这里讨论的...
"安卓app自动更新,一行代码搞定,最新开源库"这个标题所指的,就是一种简化了自动更新流程的方法,它利用特定的开源库,使得开发者只需要一行代码就能实现在用户设备上检查并安装应用的更新。这大大提高了开发效率...
【标题】:“教你四行代码搞定钉钉打卡” 在当今数字化办公时代,自动化流程成为提高工作效率的重要手段。本文将深入探讨如何使用编程技术,通过四行代码实现钉钉打卡的自动化,让工作更加便捷。 【描述】:“教你...
### 100行伪代码搞定HTTP监控框架详解 #### 一、常见HTTP监控需求与实践 在现代互联网应用中,HTTP监控对于保障系统稳定性和用户体验至关重要。传统的HTTP监控主要关注于状态码(如200、404等)和响应时间。然而,...
这个“一行代码搞定整站的表单验证js代码”很可能通过封装这些验证方法,提供了一个简洁的接口,使得开发者在表单元素上简单调用即可实现多种验证。这种做法大大减少了开发时间和复杂度,对于快速开发和维护是极其...
北大青鸟 李赞红老师 轻松搞定ExtJS 实例 源代码
"ios-2行代码搞定一个日历表.zip" 提供了一个简单快捷的方法来实现这个功能。让我们深入探讨如何用两行代码实现一个基本的日历表,并了解背后的原理和技术。 首先,iOS提供了`EventKit`框架,这是一个用于管理用户...
本方案提供了一种简单高效的方法,通过一行代码即可实现分布式锁,特别适合初学者和快速开发。 在分布式环境中,传统的单机锁无法满足需求,因为它们无法跨多个服务器进行协调。而Redis作为一种内存数据存储系统,...
标题"一行代码搞定等待进度窗体"所暗示的是,通过一种简洁高效的方式来实现这个功能。描述中提到,这个解决方案包括一个Demo和实例,用户在使用前需要先阅读ReadMe文档来获取指导。 首先,让我们深入理解这个"一行...
本主题将聚焦于如何通过两行代码轻松实现3D转场,特别适用于iOS应用。Android开发者可能会羡慕这种简洁高效的方式,因为其平台上的实现往往需要更多的代码和步骤。 首先,我们需要了解Core Animation,它是iOS中的...
在本文中,我们将深入探讨如何通过三行代码轻松集成友盟统计到你的项目中,以及这背后的原理和技术要点。 首先,我们来分解这“三行代码”: 1. 引入SDK依赖:在Android项目中,你需要在`build.gradle`文件中添加...
标题中的“一行Python代码搞定数据分析报告”指的是使用Python的pandas_profiling库,该库能够通过一行简单的代码生成详尽的数据分析报告。这个库对于快速理解数据集的特性,进行初步的数据探索非常有用。 描述中...
这是一个简单的实验,要求也特别简单 产生数据集:使用某种随机生成器产生10万个101维向量(每个分量非0即1);...包括十行代码搞定决策树的全套代码 并且齐全的包括所有树的可视化等等 保证可运行可复现结果。
使用SDAutoLayout自动.../* 用法二 (一行代码搞定,其实用法一也是一行代码) */ _view.sd_layout.leftSpaceToView(self.view, 10).topSpaceToView(self.view,80).heightIs(130).widthRatioToView(self.view, 0.4);
在这个“VB利用DDE进程间通信,5行代码搞定”的主题中,我们将探讨如何使用DDE来实现简单的进程间通信,并通过一个简单的Demo来加深理解。 DDE是一种基于消息的通信协议,它允许应用程序之间共享数据或者启动其他...
标题“担心冗余代码,一行注解搞定运行时权限”所提到的方法,就是针对这一问题提供的一种解决方案,通过注解的方式来简化权限管理,减少冗余代码。 描述中提到了两种技术:注解反射和APT(Annotation Processing ...
在这个“ios-三行代码搞定自然周选择.zip”资源中,开发者提供了一个简洁的解决方案,只需三行代码就能实现一个功能完整的自然周选择器,能够清晰地显示每周的周一日期和周日日期。下面我们将详细讲解这个功能的实现...
一行代码即可将微信登陆集成到项目中