关于如何在海量手机号中刷选出想要的手机号

 

关于如何在海量手机号中刷选出想要的手机号

一.业务场景需求

现在有海量手机号,如何快速筛选出固定地区的手机号,现需筛选出所有A地区的手机号,
根据规定,手机号前七位数决定手机的地区。前七位数为手机号地区号段,A地区有3000个号段,现在海量手机号数目3000,0000个

二.解决思路

1.将所有号段生成带标记的数组,(数组即为存放数据的地方,可以想象为杯子,有多少个号段就有多少个杯子),每个号段拥有一个数组,此时数组为空,
2.将所有手机号前七位与数组号段匹配,匹配成功则将手机号丢入该数组
3.输出筛选过的不同地区的数组(每个数组中存放的是同一个地区的号码在同一个数组中)

关于哈希,散列的含义
哈希算法一般用于快速查找和加密算法。
哈希表是根据设定的哈希函数H(key)和处理冲突方法将一组关键字映射到一个有限的地址区间上,并以关键字在地址区间中的象作为记录在表中的存储位置,这种表称为哈希表或散列,所得存储位置称为哈希地址或散列地址。作为线性数据结构与表格和队列等相比,哈希表无疑是查找速度比较快的一种。

三.业务逻辑实现

使用awk为例
生成两个文件a和b

a中放入5个手机号
18119628342
17319319626
15645673456
18396264567
17634562378

b中放入手机号号段
1731931
1564567
1811962
1839626
1763456
第一步:将手机号号段生成五个数组(杯子),初始化这些数组
第二步:将手机号前七位截取和五个数组进行匹配,若匹配成功则将该手机号放入数组
第三步:打印出每个数组的内容
awk -f
#运行前
BEGIN{
  print("start!-------")
  print("开始读取号段文件")
}
#运行中
{
  if(NR==FNR){
    #这是在第一个文件
    printf "%6s \n",$0
    seg[$0]=""//将号段创建为数组,并将每个数组置空初始态
  }
  else{
    #这是第二个文件
    //substr(s,p,n)返回字符串s中从p开始长度为n的后缀部分
    head =substr($0,0,7)
    if(head in seg){
      seg[head]=seg[head]"\n"$0
    }
  }
  #运行后
  END{
    print("过滤后的号码结果列表为:")
    for(i in seg){
      print seg[i] "\n";//i为每个数组的下标标识
    }
    printf "End:.........\n"
  }
posted @ 2018-07-12 16:35  阿水的世界  阅读(825)  评论(0编辑  收藏  举报