商品搜索 排序算法排序问题,通过内存数据库排序和多次查询排序,那个效率更高?

>> 排序的列表的基类一种实时内存数据库组织与管理方法
排序的列表的基类一种实时内存数据库组织与管理方法
所属分类:
下载地址:
sorted_base.zip文件大小:61.27 kB
分享有礼! 》
请点击右侧的分享按钮,把本代码分享到各社交媒体。
通过您的分享链接访问Codeforge,每来2个新的IP,您将获得0.1 积分的奖励。
通过您的分享链接,每成功注册一个用户,该用户在Codeforge上所获得的每1个积分,您都将获得0.2 积分的分成奖励。
排序的列表的基类一种实时内存数据库组织与管理方法-ranking list of base class a real-time memory database organization and management methods
Sponsored links
源码文件列表
温馨提示: 点击源码文件名可预览文件内容哦 ^_^
&SortedListCtrl&0.00 B05-23-98 13:42
SortedListCtrl.doc50.50 kB05-23-98 13:36
608.00 B03-21-98 12:44
4.54 kB05-23-98 13:39
1.34 kB03-21-98 19:01
13.79 kB05-23-98 13:39
SortedListCtrl.dsp2.63 kB05-23-98 13:28
SortedListCtrl.dsw551.00 B04-21-98 14:52
2.97 kB03-28-98 22:41
SortedListCtrl.ncb49.00 kB05-23-98 13:40
SortedListCtrl.opt48.50 kB05-23-98 13:40
SortedListCtrl.plg1.39 kB05-23-98 13:39
212.00 B04-21-98 15:07
1.35 kB04-21-98 15:03
&TestListCtrl&0.00 B05-23-98 13:42
565.00 B05-23-98 12:20
952.00 B05-23-98 12:42
2.03 kB05-23-98 13:12
1.27 kB05-23-98 13:03
3.37 kB05-23-98 11:15
&res&0.00 B05-23-98 11:15
690.00 B05-23-98 11:19
TestListCtrl.ico1.05 kB05-23-98 11:15
TestListCtrl.rc2404.00 B05-23-98 11:15
210.00 B05-23-98 11:15
987.00 B05-23-98 11:15
TestListCtrl.aps34.21 kB05-23-98 11:19
TestListCtrl.clw1.49 kB05-23-98 13:22
2.10 kB05-23-98 11:15
TestListCtrl.dsp4.48 kB05-23-98 13:28
TestListCtrl.dsw861.00 B05-23-98 13:28
1.37 kB05-23-98 11:15
TestListCtrl.ncb105.00 kB05-23-98 13:41
TestListCtrl.opt53.50 kB05-23-98 13:41
TestListCtrl.plg2.50 kB05-23-98 13:41
5.63 kB05-23-98 11:19
5.16 kB05-23-98 13:19
1.45 kB05-23-98 12:21
(提交有效评论获得积分)
评论内容不能少于15个字,不要超出160个字。
评价成功,多谢!
下载sorted_base.zip
CodeForge积分(原CF币)全新升级,功能更强大,使用更便捷,不仅可以用来下载海量源代码马上还可兑换精美小礼品了
您的积分不足,优惠套餐快速获取 30 积分
10积分 / ¥100
30积分 / ¥200原价 ¥300 元
100积分 / ¥500原价 ¥1000 元
订单支付完成后,积分将自动加入到您的账号。以下是优惠期的人民币价格,优惠期过后将恢复美元价格。
支付宝支付宝付款
微信钱包微信付款
更多付款方式:、
您本次下载所消耗的积分将转交上传作者。
同一源码,30天内重复下载,只扣除一次积分。
鲁ICP备号-3 runtime:Elapsed:277.334ms - init:0.1;find:0.6;t:0.4;tags:0.7;related:137.8;comment:0.2; 27.69
登录 CodeForge
还没有CodeForge账号?
Switch to the English version?
^_^"呃 ...
Sorry!这位大神很神秘,未开通博客呢,请浏览一下其他的吧本帖子已过去太久远了,不再提供回复功能。收藏环球网首页
手机环球网
环球TIME客户端
扫描二维码下载
环球微信公众号
扫描二维码关注
万象城娱乐送彩金
万象城娱乐送彩金:快讯:西王特钢料下半年钢价再升约16% 股价涨逾10%
万象城娱乐送彩金:快讯:西王特钢料下半年钢价再升约16% 股价涨逾10%。
���关必须依法保护广大人民群众、特别是危害公共安全及欺诈消费者的合法权益。此前一度备受关注让民众恐慌、恶心乃至损害健康的问题氧,警报解除了吗?当然没有。对于来自老百姓的举报、诉状是否属实该不该要严肃对待?虽然门进了、事难办?201年至今举报人先后二次向普宁市公安机关报案涉嫌问题氧,当事人多次到承办单位跟踪案件进展,承办人员也没有说立案也没有说不立案,只是以案情在调查为由,至此目前是否立不立案报案人均未��
万象城娱乐送彩金:各种饮料,去年煎饼5元钱,今年已经卖元了,我记得前年只卖4元一个。一瓶海之言饮料也从每瓶5元涨到元了。在附近上班的袁先生说。北青报记者发现,越是距离城市中心的繁华地段,早餐价格涨幅越大。地铁1号线,不同站早餐的价格不同,越往里越贵。王女士经常从管庄坐车到四惠换乘地铁,她发现管庄家门口的灌饼加肠去年4元今年涨价到5元,但相隔两公里的四惠地区,这份早餐的价格就是7元了。北青报记者在双井、国贸桥南等地的���进入活动的传播圈。本次活动将主要的传播平台搭建在易这一以摄影、青年、旅行、文艺为主要用户属性互联传播平台,同时利用官方渠道(乌海旅游体育双微平台)同步推广,定位准确,目标鲜明,使得活动传播更加精准,投入更加有效。带动旅游目的地营销开启大众传播时代当前,中国正迎来新一轮消费升级的浪潮,消费者从应付生活转变为经营生活、享受生活的过程,旅游业发展也进入新的阶段。从前,大家满足于观光旅游,景点打卡、地标合�
万象城娱乐送彩金相关新闻
责编:于凝芙
473&人参与,8&条跟帖网友跟帖
理性思考&文明跟帖
| 社交账号登录:
AETOS艾拓思:非农夜美指现反转 朝核风险再激化
欧班列再添新线 沈阳到德国单程货运17天
男童晚高峰赤身雨中奔跑 交警脱下雨衣把他裹住
燃油车将消失?工信部:已启动燃油车退出时间表
小米云平台崔宝秋:小米云服务用户是如何突破2亿的?
还有这种操作?容大球员一脚放倒两人 被罚出场
S佳通上半年净利猛降 股改拖延阻碍重组承诺兑现
高二就有签名鞋是啥体验?这小子比哭科比库里
曝巴萨5月就知道内马尔要走!高层灾难性操作
白宫称特朗普向文在寅允诺巨额军售 韩方否认
环球时报系产品
扫描关注环球网
扫描关注 这里是美国
微信公众号
扫描关注更多环球
微信公众号2464人阅读
综合(35)
问题:假设一个文件中有9亿条不重复的9位整数,现在要求对这个文件进行排序。
一般解题思路:
1、将数据导入到内存中
2、将数据进行排序 (比如插入排序、快速排序)
3、将排序好的数据存入文件
一个整数为4个字节
即使使用数组也需要900,000,000 * 4byte = 3.4G内存
对于32位系统,访问2G以上的内存非常困难,而且一般设备也没有这么多的物理内存
将数据完全导入到内存中的做法不现实
其他解决办法:
1、导入数据库运算
2、分段排序运算
3、使用bit位运算
解决方案一:数据库排序
将文本文件导入到数据库,让数据库进行索引排序操作后提取数据到文件
优点:操作简单
缺点:运算速度慢,而且需要数据库设备。
解决方案二:分段排序
操作方式:
规定一个内存大小,比如200M,200M可以记录(200*) = 条记录,我们可以每次提取5000万条记录到文件进行排序,要装满9位整数需要20次,所以一共要进行20次排序,需要对文件进行20次读操作
编码复杂,速度也慢(至少20次搜索)
关键步骤:
先将整个9位整数进行分段,亿条数据进行分成20段,每段5000万条
在文件中依次搜索0~5000万,亿……
将排序的结果存入文件
解决方案三:bit位操作
思考下面的问题:
一个最大的9位整数为
这9亿条数据是不重复的
可不可以把这些数据组成一个队列或数组,让它有0~亿个)元素
数组下标表示数值,节点中用0表示这个数没有,1表示有这个数
判断0或1只用一个bit存储就够了
声明一个可以包含9位整数的bit数组(10亿),一共需要10亿/8=120M内存
把内存中的数据全部初始化为0, 读取文件中的数据,并将数据放入内存。比如读到一个数据为这个数据,那就先在内存中找到这个bit,并将bit值置为1遍历整个bit数组,将bit为1的数组下标存入文件
检查是某一个char里面(first)的第second位中存储的数据是否为1
bool CompareBit (unsigned char first, int second)
const static int mark_buf[] = {0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80};
if (second & .8)
return (first & mark_buf[second]) == mark_buf[second];
将某一个char(Desc)中的第source位置为1
bool WriteToBit (unsigned char *Desc, int source)
const static int mark_buf[] = {0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80};
if (source && .8)
Desc[0] |= mark_buf[source];
在某个项目中,我们需要对2亿条手机号码删除重复记录(过滤号码黑名单同样有效)
工作难点就在于如何处理这2亿条电话号码,直接用哈希表存放手机号码不大现实,即使经过优化,用一个unsigned int存放一条记录,那也得需要2亿*4=8亿byte,远超过32位系统的寻址能力
将电话号码由12位单个数字组成的字符串转换为一个unsigned int型数据(这个完全可能,手机号码由前三位数字和后面八位数字组成,后面八位需要占到1~1000万的空间,而前面用0~100的数字存储已经足够)为简单起见,默认为0~4G的数字都有可能分布号码,为此我们分配4G/32=512M的内存将这2亿个号码整理成unsigned int类型后按上述办法存放在这块内存中(比如我们整理后为,我们找到内存中bit的下标,并将此bit值设为1)遍历整个bit数组,记录下所有的号码,这些号码即是不重复的手机号码
建立一个足够大的bit数组当作hash表
以bit数组的下标来表示一个整数
以bit位中的0或1来表示这个整数是否在这个数组中存在
适用于无重复原始数据的搜索
原来每个整数需要4byte空间变为1bit,空间压缩率为32倍
扩展后可实现其他类型(包括重复数据)的搜索 & xmlnamespace prefix =&o& ns =&urn:schemas-microsoft-com:office:office& /&
主题:数据的表,取某项字段前项数据,内存
偶然看到这个题,就想了一下怎么做,大体实现思路是这样子的,的数据划分为段,也就是为一段,项为第二段,依次类推,从每的数据中提取出前条数据(这个根据排序就能取出来,个的内存够了),最后个就会产生个数据,最后提取出来的的数据放置到中去,最后的数据统一排序,取出前条。的对比与交换是可以搞定的。具体实现,等最近的项目完了用多线程试试!
主题:【探讨】给你内存,如何从万个手机号码中检索出你要的号码,要求每秒检索次
主题:亿数据快速检索实现
上周有个需求,就是要做一个检索库:  1 3亿个手机号码,并且每个号码20个左右的属性例:地区,订阅等信息。  2 在最短的时候内出来(5分钟,10分钟)最重要  3 允许更新。对这些号码进行发送信息后,状态改变。可以让他慢慢更新  和几个同事讨论了一下,具体要注意以下几点:  1 如果发送下去状态改变,但是只发送一半,但状态改变了如何办?  2 如果多个产品线一起下发,状态会不会混乱。  解决以上第二个问题,决定采用,队列等待的方式。第一个问题没想到好的解决办法,回滚也想过了,但感觉不是很现实!  解决方案:  经过实验条的数据在用直接,只需要02秒,所以总体采用分表的方式,每条分一个表,然后同时查询!重新描述一下需求很多人说需求不是很的清楚,这里重新整理了一下!不过要注意的是数据库里已经有亿个手机基数了!一.号码入库。不定期会有新的号码需要入库,入库需要记录号码的常规属性,如:手机号,省份,城市,入库时间,手机卡类型,是否支持彩信,号码来源情况等。二.入库手机号源文件管理入库手机号源文件要以文件形式保存在服务器上。三.按需要提取号码(最关键部分)要按照需求提取所需的号码。例如:提号要求:此号码非黑名单用户。此号码为的订购和退订用户。此号码个月内没有活动。省份要求:辽宁,云南,广东号段要求:和和号段数量要求:每个省是否支持彩信:是(是,否,忽略三种情况)最后,符合条件的号码,按照固定格式(每个手机号占一行),形成文本文件,将此文件测试号码,是否需要状态报告等信息形成最终可发送文件并提供下载功能,同时记录本次提取信息(发送时间,发送标识等)注:文件格式如下:第列:手机号第列:产品类型()第列:是否需要状态报告()四.统计功能一.号码情况统计统计当前号码总量。按照个基本要求,统计现在库中可以使用的号码数量。注:统计需要显示,全国总量,各省总量,各省省会总量,各省去除省会总量,各省天未下发总量(省会与其他城市分开显示),各省可以发送总量(省会与其他城市分开显示,所以单独列出来)。二.发送产品统计按时间段、业务线等统计发送产品的情况,如:发送时间,最终发送文件等五.黑名单及特殊号码管理添加黑名单去除黑名单过滤黑名单查询黑名单以上除黑名单外都是迫切需要的,黑名单功能可以以后完善。
现在有一万()的个数,从中拿掉一个数,还剩个数,现在用一个数组来存储这个数,问怎么才能找出拿掉的数?
用个数的数组循环匹配个数,匹配成功,从数组中去除,不成功就是该数。大家还有什么好的思路没有?
问题:假设一个文件中有9亿条不重复的9位整数,现在要求对这个文件进行排序。
一般解题思路:&1、将数据导入到内存中 2、将数据进行排序 (比如插入排序、快速排序) 3、将排序好的数据存入文件
难题:&一个整数为4个字节即使使用数组也需要900,000,000 * 4byte = 3.4G内存对于32位系统,访问2G以上的内存非常困难,而且一般设备也没有这么多的物理内存将数据完全导入到内存中的做法不现实。
其他解决办法:&1、导入数据库运算 2、分段排序运算 3、使用bit位运算
解决方案一:数据库排序&将文本文件导入到数据库,让数据库进行索引排序操作后提取数据到文件
优点:操作简单缺点:运算速度慢,而且需要数据库设备。
解决方案二:分段排序&操作方式:规定一个内存大小,比如200M,200M可以记录条记录,我们可以每次提取5000万条记录到文件进行排序,要装满9位整数需要20次,所以一共要进行20次排序,需要对文件进行20次读操作
缺点:&编码复杂,速度也慢(至少20次搜索)
关键步骤:先将整个9位整数进行分段,亿条数据进行分成20段,每段5000万条,在文件中依次搜索0~5000万,亿…… 将排序的结果存入文件
解决方案三:bit位操作&思考下面的问题: 一个最大的9位整数为 这9亿条数据是不重复的,可不可以把这些数据组成一个队列或数组,让它有0~亿个)元素数组下标表示数值,节点中用0表示这个数没有,1表示有这个数,判断0或1只用一个bit存储就够了
声明一个可以包含9位整数的bit数组(10亿),一共需要10亿/8=120M内存,把内存中的数据全部初始化为0 ,读取文件中的数据,并将数据放入内存。比如读到一个数据为这个数据,那就先在内存中找到这个bit,并将bit值置为1 ,遍历整个bit数组,将bit为1的数组下标存入文件
关键代码&检查是某一个char里面(first)的第second位中存储的数据是否为1
bool CompareBit (unsigned char first, int second)
const static int mark_buf[] = {0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80};
if (second & 8)
return (first & mark_buf[second]) == mark_buf[second];
将某一个char(Desc)中的第source位置为1
bool WriteToBit (unsigned char *Desc, int source)
const static int mark_buf[] = {0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80};
if (source & 8)
Desc[0] |= mark_buf[source];
案例&在某个项目中,我们需要对2亿条手机号码删除重复记录(过滤号码黑名单同样有效)
工作难点就在于如何处理这2亿条电话号码,直接用哈希表存放手机号码不大现实,即使经过优化,用一个unsigned int存放一条记录,那也得需要2亿*4=8亿byte,远超过32位系统的寻址能力
解决方案:&将电话号码由12位单个数字组成的字符串转换为一个unsigned int型数据(这个完全可能,手机号码由前三位数字和后面八位数字组成,后面八位需要占到1~1000万的空间,而前面用0~100的数字存储已经足够) ,为简单起见,默认为0~4G的数字都有可能分布号码,为此我们分配4G/32=512M的内存,将这2亿个号码整理成unsigned int类型后按上述办法存放在这块内存中(比如我们整理后为,我们找到内存中bit的下标,并将此bit值设为1)
,遍历整个bit数组,记录下所有的号码,这些号码即是不重复的手机号码
总结&建立一个足够大的bit数组当作hash表,以bit数组的下标来表示一个整数,以bit位中的0或1来表示这个整数是否在这个数组中存在,适用于无重复原始数据的搜索,原来每个整数需要4byte空间变为1bit,空间压缩率为32倍,扩展后可实现其他类型(包括重复数据)的搜索
注意&由于操作系统和编程语言本身的限制,有可能内存足够,但无法分配一块连续大内存的情况,这样的话可以申请多块稍微小一点的内存,然后用链表或其他的方式连接起来使用
关于海量数据处理
常用的数据结构:
1.Bloom Filter
&& 大致思想是这样,把一个数据通过N个哈希函数映射到一个长度为M的数组的一位上,将hash函数对应的值的位数组置1,查找时如果发现所有hash函数对应位都是1说明该数据的存在。但不能保证完全正确性,但是此方法无比高效。
【实例】给你A,B两个文件,各存放50亿条URL,每条URL占用64字节,内存限制是4G,让你找出A,B文件共同的URL。如果是三个乃至n个文件呢?&
&& 这个简单,无非是通过一些哈希函数把元素搞到一个指定的位置,简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。这个很一般啊感觉。无非就是分类查找么,完全不如1猛。
3.最大或最小堆
&& & 就是一个完全的最大或最小二叉树,用途,比如:1)100w个数中找最大的前100个数。&用一个100个元素大小的最小堆即可。感觉还是不错的。
所谓的Bit-map就是用一个bit位来标记某个元素对应的Value, 而Key即是该元素。由于采用了Bit为单位来存储数据,因此在存储空间方面,可以大大节省。
【问题实例】
1)已知某个文件内包含一些电话号码,每个号码为8位数字,统计不同号码的个数。
8位最多99 999 999,大概需要99M个bit,大概10几m字节的内存即可。 (可以理解为从0-99 999 999的数字,每个数字对应一个Bit位,所以只需要99M个Bit==1.2MBytes,这样,就用了小小的1.2M左右的内存表示了所有的8位数的电话)
2)2.5亿个整数中找出不重复的整数的个数,内存空间不足以容纳这2.5亿个整数。
将bit-map扩展一下,用2bit表示一个数即可,0表示未出现,1表示出现一次,2表示出现2次及以上,在遍历这些数的时候,如果对应位置的值是0,则将其置为1;如果是1,将其置为2;如果是2,则保持不变。或者我们不用2bit来进行表示,我们用两个bit-map即可模拟实现这个2bit-map,都是一样的道理。
公司的一道考试题算法分析大数据量整数排序
题目大意:移动公司需要对已经发放的所有段的号码进行统计排序,已经发放的号码段的文件都存放在一个文本文件中(原题是放在两个文件中),一个号码一行,现在需要将文件里的所有号码进行排序,并写入到一个新的文件中;号码可能会有很多,最多可能有一亿个不同的号码(所有的段号码),存入文本文件中大概要占的空间;最大的内存在以内,程序要考虑程序的可执行性及效率;只能使用标准库,不得使用第三方工具。这是个典型的大数据量的排序算法问题,首先要考虑空间问题,一下把的数据读入内存是不太可能的,就算把一亿条数据,转都转换成类型存储也要占接近的空间。当时做个题目我并没有想太多的执行效率问题,主要就考虑了空间,而且习惯性的想到合并排序,基本思想是原文件分割成若干个小文件并排序,再将排序好的小文件合并得到最后结果,算法大概如下:顺序读取存放号码文件的中所有号码,并取之后的八位转换为类型;每读取号码数满一百万个,(这个数据可配置)将已经读取的号码排序并存入新建的临时文件。
将所有生成的号码有序的临时文件合并存入结果文件。这个算法虽然解决了空间问题,但是运行效率极低,由于读写操作太多,加上步骤中的排序的算法(快速排序)本来效率就不高(对于电话排序这种特殊情况来说),导致亿条数据排序运行个小时才有结果。如果和能够减少排序的时间呢?首当其冲的减少操作,另外如果能够有更加好排序算法也行。前天无聊再看这个题目时突然想到大三时看《编程珠玑》时上面也有个问题的需求这个这个题目差不多,记得好像使用是位向量(实际上就是一个数组),用电话作为,心中大喜,找到了解决此问题的最完美方案啦:用位向量存储电话号码,一个号码占一个,一亿个电话号码也只需要大概的空间;算法大概如下:
顺序所有读入电话号码,并转换为类型,修改位向量值:;
遍历数组,如果,转换为电话号码输出。中没有类型,一个值占空间为(感兴趣的可以自己写程序验证),我自己写个用模拟数组的类,代码如下:
用于设置或者提取类型的数据的某一位的值时使用,//00&&&&&&& &&,//00&&&&&&& &&,//00&&&&&&& &&,//00&&&&&&& &&,//00&&&&&&& &&,//00&&&&&&& &&,//00&&&&&&& &&,//00&&&&&&& &&,//00&&&&&&& &&,//00&&&&&&& &&,//00&&&&&&& &&,//00&&&&&&& &&,//00&&&&&&& &&,//00&&&&&&& &&,//00&&&&&&& &&,//00&&&&&&&&&&& &&,//00&&&&&&& &&,//00&&&&&&& &&,//00&&&&&&& &&,//00&&&&&&& &&,//00&&&&&&& &&,//00&&&&&&& &&,//10&&&&&&& &&,//01&&&&&&& &&,//00&&&&&&& &&,//00&&&&&&& &&,//00&&&&&&& &&,//00&&&&&&& &&,//00&&&&&&& &&,//00&&&&&&& &&,//00&&&&&&& &&&//00&&&&&&&&&&&&& && ){ &&必须大于零! &+&(length&%&32&&&0&?&1&:&0)];
取位的值&||&index&&&length){ &&必须大于零小于 ]; &&])&&&&&(32&-&index%32&-1); && 设置位的值,只能为或者
&||&index&&&length){ &&必须大于零小于 &&value!=0){ &&必须为或者
]; &&){ &&]&=&intData&|&bitValue[index%32]; && ]&=&intData&&&~bitValue[index%32]; &&
public class BitArray {
& private int[] bits =
& //用于设置或者提取int类型的数据的某一位(bit)的值时使用
& private final static int[] bitValue = {
&& 0x,//00 &&&&&
&& 0x,//00 &&&&&
&& 0x,//00 &&&&&
&& 0x,//00 &&&&&
&& 0x,//00 &&&&&
&& 0x,//00 &&&&&
&& 0x,//00 &&&&&
&& 0x,//00 &&&&&
&& 0x,//00 &&&&&
&& 0x,//00 &&&&&
&& 0x,//00 &&&&&
&& 0x,//00 &&&&&
&& 0x,//00 &&&&&
&& 0x,//00 &&&&&
&& 0x,//00 &&&&&
&& 0x,//00 && &
&& 0x,//00 &&&&&
&& 0x,//00 &&&&&
&& 0x,//00 &&&&&
&& 0x,//00 &&&&&
&& 0x,//00 &&&&&
&& 0x,//00 &&&&&
&& 0x,//10 &&&&&
&& 0x,//01 &&&&&
&& 0x,//00 &&&&&
&& 0x,//00 &&&&&
&& 0x,//00 &&&&&
&& 0x,//00 &&&&&
&& 0x,//00 &&&&&
&& 0x,//00 &&&&&
&& 0x,//00 &&&&&
&& 0x //00&
& public BitArray(int length) {
&& if(length & 0){
&&&& throw new IllegalArgumentException(&length必须大于零!&);
&& bits = new int[length / 32 + (length % 32 & 0 ? 1 : 0)];
&& this.length =
& //取index位的值
& public int getBit(int index){
&& if(index &0 || index & length){
&&&& throw new IllegalArgumentException(&length必须大于零小于& + length);
&& int intData = bits[index/32];
&& return (intData & bitValue[index%32]) &&& (32 - index%32 -1);
& //设置index位的值,只能为0或者1
& public void setBit(int index,int value){
&& if(index &0 || index & length){
&&&& throw new IllegalArgumentException(&length必须大于零小于& + length);
&& if(value!=1&&value!=0){
&&&& throw new IllegalArgumentException(&value必须为0或者1&);
&& int intData = bits[index/32];
&& if(value == 1){
&&&& bits[index/32] = intData | bitValue[index%32];
&&&& bits[index/32] = intData & ~bitValue[index%32];
& public int getLength(){
数组有了,剩下就是算法代码,核心代码如下:
);& &&顺序读取所有的手机号码);// &&取后位转换为类型设置对应值为
); && 遍历数组输出所有存在的号码;i&sortUi++){ &&){ &&)); &&
&&&& bitArray = new BitArray();&
&&&& //顺序读取所有的手机号码
&&&& while((phoneNum = bufferedReader.readLine())!=null){
&&&&& phoneNum = phoneNum.trim().substring(3);//
&&&&& //取139后8位转换为int类型
&&&&& phoneNumAsInt = Integer.valueOf(phoneNum);
&&&&& //设置对应bit值为1
&&&&& bitArray.setBit(phoneNumAsInt, 1);
&&&& //遍历bit数组输出所有存在的号码
&&&& for(int i = 0;i&sortUi++){
&& &&& & if(bitArray.getBit(i)==1){
& &&& &&&& writer.write(&139& + leftPad(String.valueOf(i + sortUnit*times), 8));
& &&& && & writer.newLine();&&&& &&& &&
&& &&&&& }&&&&&
&&&& writer.flush();
&&& 经测试,修改后的算法排序时只需要20多M的内存,一亿条电话号码排序只要10分钟(时间主要花在IO上),看来效果还是很明显的。
&&& 这个算法很快,不过也有他的局限性:
&&& 1.只能用于整数的排序,或者可以准确映射到正整数(对象不同对应的正整数也不相同)的数据的排序。
&&& 2.不能处理重复的数据,重复的数据排序后只有一条(如果有这种需求可以在这个算法的基础上修改,给出现次数大于1的数据添加个计数器,然后存入Map中)
&&& 3.对于数据量极其大的数据处理可能还是比较占用空间,这种情况可配合多通道排序算法解决。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1279754次
积分:13476
积分:13476
排名:第977名
原创:302篇
转载:45篇
评论:278条
(1)(6)(1)(2)(1)(1)(8)(6)(4)(3)(2)(1)(2)(1)(2)(5)(1)(3)(3)(10)(7)(3)(22)(10)(11)(5)(13)(10)(7)(25)(16)(21)(48)(4)(20)(31)(35)

我要回帖

更多关于 java 内存数据库 的文章

 

随机推荐