专为手机号码设计的特殊的排序

打个比方说吧,某移动公司的数据库里存了移动用户的数据,有一项属性是用户的手机号码。现在要对这些号码进行排序,条件是,内存比较小,速度希望不要太慢。

我们来分析一下吧,中国的手机号码是11位的。其实在这里各位看官也可以自己先想想具体怎么实现,注意,不要用冒泡、快速等等,要-----非主流。

 书中用到的办法涉及到指针,因为我现在用c#更加顺手一点,所以我用数组的方式加以试验,意会即可:

1>取一数组,含有10^11(10的十一次幂)个元素的bool型 a[n](0<n<10^11)

2>初始值为false

3>遍历手机号码。手机号码=n时,将a[n]=true。

4>结束,重新遍历a[n],如果a[n]=true,输出n即可。

 

总结一下,使用上述排序的方式,肯定比冒泡排序要快的多,具体的特殊条件为

1<所排序数组为整数

2<所排序数组范围一定

3<数组没有重复值出现

 

现在来优化上述算法:

首先,中国移动的号码是大于等于13,400,000,000小于19,000,000,000的,我们首先缩小了数组的排序范围,这一步大约可以省下95%左右的数组空间。

紧接着,书上说是用位图或者位向量来解决(其实我不懂什么事位图什么是位向量),我们用字符串0111 0100 1000 0100 0000来表述数组{1,2,3,5,8,13},(个人感觉是不是用指针的话是不是好一点),字符串从左向右,一次代表0、1、2、3、……,这样做的好处是,省空间,Int32 值类型表示值介于 -2,147,483,648 到 +2,147,483,647 之间,所以用常规方法的话用整型表示一个手机号码,还得用int64型,占用64位,8个字节,很是奢侈,10^11*8b=800G,的内存占有率。。。汗,而用字符串表示,占用10^11个字节=100G,好像也不小。话说回来,我们使用10^11个元素的bool型数组,只要10^11/8=12.5G,就算是去掉不用的号码,也还有12.5*(1-95%)=625M的内存占用,好像还是不能排序,我暂时也没想到别的办法,就先写到这里,还请大家指教。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值