首先是这一天,并且是访问百度的日志中的IP取出来,逐个写入到一个大文件中。注意到IP是32位的,最多有个2^32个IP。同样可以采用映射的方法,比如模1000,把整个大文件映射为1000个小文件,再找出每个小文中出现频率最大的IP(可以采用hash_map进行频率统计,然后再找出频率最大的几个)及相应的频率。然后再在这1000个最大的IP中,找出那个频率最大的IP,即为所求。
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.util.Random;
public class MaxFrecencyFinal {
public static void main(String[] args) throws Exception {
File dic = new File("data/");
File[] files = dic.listFiles();
int max = 0; // 下面IP地址的出现频率
String ip = ""; // 出现频率最大的那个IP地址
int index = 0; // 上面这个IP地址出现在第几个文件
//遍历每个文件,用hashtable的方法统计每个文件每个IP对应的频率,然后求出最大值
for(int i=0;i<files.length;i++){
File file = files[i];
Hashtable<String, Integer> table = new Hashtable<String, Integer>();
BufferedReader br = new BufferedReader(new FileReader(file));
for(String str = br.readLine();str!=null;){
Integer number = table.get(str);
if(number == null){
table.put(str, 1);
}else{
table.put(str, number+1);
}
str = br.readLine();
}
//遍历hashtable找个最大IP,max ,index
Iterator<String> it = (Iterator<String>) table.keys();
while(it.hasNext()){
String str = it.next();
int value = table.get(str);
if(value>max){
max = value;
ip = str;
index = i;
}
}
}
System.out.println("max ip at file: " + index);
System.out.println(ip);
System.out.println(max);
}
}
4.解释数组链表:
或者如下阐述(雪域之鹰):
1)算法思想:分而治之+Hash
1)算法思想:分而治之+Hash
1.IP地址最多有2^32=4G种取值情况,所以不能完全加载到内存中处理;
2.可以考虑采用“分而治之”的思想,按照IP地址的Hash(IP)24值,把海量IP日志分别存储到1024个小文件中。这样,每个小文件最多包含4MB个IP地址;
3.对于每一个小文件,可以构建一个IP为key,出现次数为value的Hash map,同时记录当前出现次数最多的那个IP地址;
4.可以得到1024个小文件中的出现次数最多的IP,再依据常规的排序算法得到总体上出现次数最多的IP;
2.可以考虑采用“分而治之”的思想,按照IP地址的Hash(IP)24值,把海量IP日志分别存储到1024个小文件中。这样,每个小文件最多包含4MB个IP地址;
3.对于每一个小文件,可以构建一个IP为key,出现次数为value的Hash map,同时记录当前出现次数最多的那个IP地址;
4.可以得到1024个小文件中的出现次数最多的IP,再依据常规的排序算法得到总体上出现次数最多的IP;
2)算法实现:
1. 由于手头没有数据,只能自己制造一个,1亿条IP数据,这个十分简单:
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.util.Random;
//produce 10000 * 10000 IP
public class IpDataSet {
private static int section = 10000;
private static int sum = 10000;
public static void main(String[] args) throws Exception {
BufferedWriter bw = new BufferedWriter(new FileWriter(new File("ip.txt")));
Random r = new Random();
StringBuffer buffer = null;
StringBuffer temp = null;
for(int i=1;i<=sum;i++){
buffer = new StringBuffer();
//每section个IP写一次。
for(int j=1;j<=section;j++){
temp = new StringBuffer();
temp.append(r.nextInt(256));
temp.append(".");
temp.append(r.nextInt(256));
temp.append(".");
temp.append(r.nextInt(256));
temp.append(".");
temp.append(r.nextInt(256));
//buffer的最后一个没有换行
if(j!=section){
temp.append("\n");
}
buffer.append(temp);
}
bw.write(buffer.toString());
//sum中的最后一个,也就是1亿条数据的最后一行没有newline();
if(i!=sum){
bw.newLine();
}
if(i0==0){
System.out.println(i);
}
}
bw.flush();
bw.close();
}
}
public class IpDataSet {
}
2.按照hashcode拆分文件:
见工程代码,一共2两种方法
3. 统计每个小文件,使用hashtable
package com.carlosfu.chap1;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.Hashtable;
import java.util.Iterator;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.Hashtable;
import java.util.Iterator;
public class MaxFrecencyFinal {
}
4.解释数组链表:
本文介绍了一种利用哈希映射算法对大量IP日志进行处理的方法,包括将IP地址按哈希值分组存储到多个小文件中,通过构建哈希表统计每个小文件中IP地址的出现频率,最终确定整体出现次数最多的IP地址。

1303

被折叠的 条评论
为什么被折叠?



