1.
打击灌水和欺诈信息的发布,58上的帖子从到展示要经历重重检测。检测规则一共有50个,一条帖子可能会同时被同时被多个规则拦截,也可能不被任何规则拦截。现有一个日志文件,每一行都记录着一个帖子ID和若干拦截该帖子的规则ID,日志文件一共9999995行。帖子ID取值为[1,9999999]上的某个整数,且无重复。帖子ID在日志文件中是无序的。
问题:(1).如何计算任意两个规则同时拦截的帖子数量?要求只扫描一遍日志文件。采用尽可能少的存储空间
(2).假设一个帖子ID需要用4个字节来存储,请使用2M的内存空间丢失的那4个帖子ID找出来,你的算法扫描了几遍日志文件?
解:
(1).
(2).哈希表需要占用很多空间,所以使用bit map的方式来表示数出现的情况
申请一个长度为10000000的bit类型的数组bitArr,bitArr上的每个位置只可以表示0或1的状态
8个bit为1B,,长度为10000000的bit类型数据占用1.25MB,有2M内存空间,只扫描1遍
2.
数组A由1000W个随机正整数(int)组成,设计算法,给定整数n,
在A中找出符合如下等式:n=a+b的a和b,说明算法思路以及时间复杂度是多少?
将数组排序,时间复杂度n*lg(n)
在从头开始 假设第i个位置时arr[i] 那就在 i 到 1000万之间找 n - arr[i] 二分查找的效率是lg(n) 由于当arr[i] > n/2 时就不用找了
所以最终效率 不到 2*n*lg(n)
3.
数组A由1000W个随机正整数(int)组成,设计算法,给定整数n,在A中找出符合如下等式:n=a+b的a和b,说明算法思路以及时间复杂度是多少?
解析:
将数组排序,时间复杂度n*lg(n)
在从头开始 假设第i个位置时arr[i] 那就在 i 到 1000万之间找 n - arr[i] 二分查找的效率是lg(n) 由于当arr[i] > n/2 时就不用找了
所以最终效率 不到 2*n*lg(n)
4.文件f.txt中包含5万行信息,每一行都有一个有8位数组成的唯一ID,现要求将这些信息按照ID从大到小排序后,再存储会f.txt。
import java.util.*;
import java.io.*;
public class SortID {
public static void main(String[] args){
BitSet bitset=new BitSet(10);//8位的id这里改成100000000
String temp=null;
try{
String path="C:\\Users\\dell1\\Documents\\study\\1.txt";
File file=new File(path);
if(!file.exists())
throw new FileNotFoundException();
//另一种读取方式
FileInputStream fis=new FileInputStream(file);
BufferedReader br=new BufferedReader(new InputStreamReader(fis));
StringBuffer sb=new StringBuffer();
while((temp=br.readLine())!=null){
int id=Integer.valueOf(temp);
bitset.set(id);
}
//遍历bitset输出所有id
for(int i=10;i>=0;i--){
if(bitset.get(i)){
sb.append(Integer.toString(i)+"\n");
}
}
FileOutputStream out=new FileOutputStream(file,false);
out.write(sb.toString().getBytes("utf-8"));
out.close();
System.out.println("成功排序");
}catch(IOException e){
System.out.println(e.getStackTrace());
}
}
}