如何从存有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
原创粉丝点击