如何从存有1亿个电话号码的号码(8位电话号码)本中,检索出重复的电话号码,时间复杂度为O(n),空间复杂度为O(1)
来源:互联网 发布:mac自带的编译器 编辑:程序博客网 时间:2024/05/16 14:37
我们用java语言实现,首先我们先生成一个电话号码本,号码的数量可以任意填写,号码也是随机生成的代码如下:
/** * 生成排列组合式的字符串 * @param data */ private void generateData(){ StringBuffer temp = new StringBuffer(); for(int i =0;i<taskCount;i++){ for(int j = 0;j<length;j++){ temp.append(getRandomChar(data)); } saveData(temp.toString()+"\n"); temp.delete(0, temp.length()); } } private char getRandomChar(char[] data) { // TODO Auto-generated method stub return data[(int)((Math.random()*10))]; }
生产一千万个电话号码用时 6秒钟
我们生成一千万个8位的电话号码以后,怎么用最少的空间,最快的速度来查找出重复的电话号码呢,你是不是立刻想到了hash算法。对,我们就用哈希算法就可以了,我们的哈希函数比较简单,就是用将电话号码转换成数值模式,然后我们用hash表记录下来,就可以方便找到重复的号码了,这样我们只用花费大概12.5MB的空间就可以完成了,1千万个电话号码查找应该在10秒钟左右。核心代码如下:
private boolean findRecord(int num) { // TODO Auto-generated method stub int byteCount = num / 8; // int position = (int) (byteCount / Integer.MAX_VALUE); // int divisionResult = (int) (byteCount % Integer.MAX_VALUE); int remainder = (int) (num % 8 + 1); // byte recordChild = record[position][divisionResult]; byte recordChild = record[byteCount]; byte numB = creadByte(remainder); byte resultb = (byte) (recordChild & numB); if (resultb != 0) { return true; } else { upDataRecord(byteCount, numB); } return false; } private byte creadByte(long position) { // TODO Auto-generated method stub byte b = 1; return (byte) (b << position); } private void upDataRecord(int position, byte resultb) { // TODO Auto-generated method stub record[position] = (byte) (record[position] | resultb); }
需要源码可加我QQ:1187502892
阅读全文
0 0
- 如何从存有1亿个电话号码的号码(8位电话号码)本中,检索出重复的电话号码,时间复杂度为O(n),空间复杂度为O(1)
- 从顺序表中删除所有值为x的元素(Java实现),要求时间复杂度O(n),空间复杂度O(1)
- 数组中重复的数字(剑指offer)+时间复杂度O(n)空间复杂度O(1)的想法
- 时间复杂度为O(n),空间复杂度为O(1)
- 数组中未出现的最小正整数(时间复杂度O(N),空间复杂度O(1))
- 将数组排序,数组中所有的负整数出现在正整数前面(时间复杂度为 O(n), 空间复杂度为 O(1)).
- 排序的时间复杂度为O(n),空间复杂度为O(1)
- 时间复杂度为O(N),空间复杂度为O(1)的排序算法
- (C#)实现时间复杂度为O(n)空间复杂度为O(1)的数组中奇偶数分离
- 找出一个数组中出现次数超过一半的那个数字,要求时间复杂度O(n)和空间复杂度为O(1)。
- 《编程题》找出数组中出现次数超过一半的数(时间复杂度O(n),空间复杂度为O(1))
- 返回数组中任意某个重复的数字--时间复杂度O(n)空间复杂度O(1)
- 给定一个存放整数的数组,重新排列数组使得数组左边为奇数,右边为偶数。 要求:空间复杂度O(1),时间复杂度为O(n)。
- 给定一个存放整数的数组,重新排列数组使得数组左边为奇数,右边为偶数。要求:空间复杂度O(1),时间复杂度为O(n)
- 【每日一题】查找一个字符串中第一个只出现两次的字符。要求时间复杂度为O(N),空间复杂度为O(1)
- 如何在时间复杂度为O(n),空间复杂度为O(1)的条件下,统计数组中不同元素出现的次数
- C++实现一个栈,出栈,入栈,返回最小值 时间复杂度为O(1),查找字符串中第一个重复出现的字符
- 不用额外空间的整数交换以及时间复杂度为O(n)空间复杂度为O(1)的排序算法
- 数据库sql实用脚本
- AndroidStudio演示代码方案
- idea运行单个java的main方法,不用编译整个项目
- String.intern() 方法__jdk1.6与jdk1.7的不同
- ifram框架session过期时,导致框架内部嵌套显示顶层框架的解决
- 如何从存有1亿个电话号码的号码(8位电话号码)本中,检索出重复的电话号码,时间复杂度为O(n),空间复杂度为O(1)
- plsql工具问题 记录
- 九阳神功,扎马练起!类、对象、实例、实例化的理解!
- c# 连接访问数据库
- 分布式java应用-基础与实践(林昊著)下载地址
- AngularJS判断页面是否已经渲染结束
- Android 真的不能在子线程更新 UI 吗
- 域名解析中A记录、CNAME、MX记录、NS记录的区别和联系
- spring boot Mongodb