在之前简要介绍过
深度优先搜索和
广度优先搜索这两个算法。
同时我们之前也讲过Java中
队列的使用。
在
基于百度的推荐程序的基础上,我们可以开展大规模搜索了,也就是说:
今天,我写的东西是 DFS/BFS 和 推荐 的 结合。
我将会把网页信息的挖取加上搜索从而达到得到更多信息的效果。
举个例子,比如我在百度搜索“一句话木马”,百度会推荐给我一些信息,如“广外女生木马”,然后我再继续搜“广外女生木马”,会得到一个“网络神偷”的推荐词;这个推荐词是不包含在搜“一句话木马”的推荐词里面的,但是也是我感兴趣的,所以我通过广度优先搜索或者深度优先搜索来进行这种大规模的网络上的搜索。
RelateDigger类用于实现该功能。
其中的bfs方法体现了广度优先搜索的功能;dfs方法体现了深度优先搜索的功能。
使用digInBFS方法进行大规模的bfs网页挖取推荐信息功能。
使用digInDFS方法进行大规模的dfs网页挖取推荐信息功能。
我用max_count限制广度优先搜索搜索到的关键词的最大数量,用max_depth限制搜索的深度。大家可以根据自己的需求更改这两个常量。
用HashMap来记录得到的关键词。
代码如下:
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Queue;
public class RelateDigger {
public static HashMap <String,Integer> map;
private static final int max_count = 100;
private static int count;
private static final int max_depth = 3;
private static void init() {
count = 0;
map = new HashMap<String, Integer>();
}
private static void dfs(String u, int depth) throws Exception {
System.out.println("digging in " + u);
String[] res = FindRelate.getRelate(u);
int n = res.length;
for(int i=0;i<n;i++) {
String v = res[i];
if(map.containsKey(v)) continue;
map.put(v, new Integer(1));
if(depth >= max_depth) return;
dfs(v, depth+1);
}
return;
}
public static void digInDFS(String word) throws Exception {
init();
map.put(word, new Integer(1));
dfs(word, 0);
Iterator<String> iter = map.keySet().iterator();
while(iter.hasNext()) {
String key = iter.next();
System.out.print(key);
if(iter.hasNext()) System.out.print(",");
}
}
private static void bfs(String u) throws Exception {
Queue<String> queue = new LinkedList<String>();
queue.offer(u);
while((u=queue.poll())!=null){
System.out.println("digging in " + u);
String[] res = FindRelate.getRelate(u);
int n = res.length;
for(int i=0;i<n;i++) {
String v = res[i];
if(map.containsKey(v)) continue;
map.put(v, new Integer(1));
count ++;
queue.offer(v);
if(count >= max_count) return;
}
}
}
public static void digInBFS(String word) throws Exception {
init();
map.put(word, new Integer(1));
count ++;
bfs(word);
Iterator<String> iter = map.keySet().iterator();
while(iter.hasNext()) {
String key = iter.next();
System.out.print(key);
if(iter.hasNext()) System.out.print(",");
}
}
public static void main(String[] args) throws Exception {
digInDFS("一句话木马");
digInBFS("珠穆朗玛峰");
}
}
其中digInDFS得到的结果为:null,中国十大最难懂方言,必应词典,盗号木马,震荡波病毒,充值软件,盗号,网络神偷,塔佐蠕虫,中越黑客大战,黑客教程,蛀船虫,中国黑客联盟,小球病毒,宏病毒,中华吸血鬼,特洛伊木马,qq木马,鬼影病毒,后门木马,动漫日语,中国红客联盟,CIH病毒,李俊,有道词典,黑光病毒,伯乐木马,百度杀毒,手机透视器,黑客教父,qq盗号木马,机器狗病毒,米特尼克,qq枪手,冰河木马,c病毒,火焰病毒,g病毒,免费黑客网,百度翻译,华夏黑客联盟,广外女生木马,oldboot,cih病毒,特洛伊:木马屠城,玻璃蛇,网游大盗,学术翻译,灰鸽子木马,三角木马,熊猫烧香,女巫的椅子,江民炸弹,黑客工具,网上学英语,米米病毒,金山词霸,灰鸽子远程控制软件,莫里斯蠕虫,百度卫士,僵尸世界大战2,远程控制软件,悬玉环,食骨蠕虫,千斤顶,超级工厂病毒,灰鸽子,灵格斯,磁碟机病毒,骑木马驴,机器狗,震荡波,幸运破解器,黑客基地,维罗妮卡病毒,nabau,一句话木马,蠕虫病毒,冲击波病毒,黑客技术教程,大小姐木马,木马病毒,大麻病毒,不死木马,2001中美黑客大战,下村勉,trojan.generic,金猪报喜,qq尾巴,欢乐时光病毒,geohot,asp木马,手机骷髅病毒,中国鹰派,世界十大黑客,海词词典,黑客,王江民,潘多拉,杀毒软件,citrus,qq大盗,计算机病毒,g幼体,罗塞塔石碑,黑客技术,卡巴斯基免费版,丧尸,万能登陆器,高危型人乳头瘤病毒,铁莲花
digInBFS得到的结果为:德令哈外星人遗址,百慕大三角,麦田怪圈,中国三大海峡,太阳墓,中国四大无人区,海底金字塔,中国最美十大名山,中国梯,巴黎性博物馆,中国死海,玫瑰湖,天门山,大蓝洞,贡嘎山,51区,西藏,普罗旺斯,中华十大名山,山西十大景区,克尔黑洞,暗物质,美国大峡谷空中走廊,魔鬼城,安纳布尔纳峰,羌塘,哭岛,全球被遗弃的31个景点,外星人,白洞,史瓦西黑洞,罗布泊,中国五大淡水湖,恐怖谷理论,道教四大名山,性博物馆,托木尔峰,中国四大名塔,幽灵岛,乞力马扎罗山,霍金,四大道教名山,喜马拉雅山脉,怪坡,黑洞,可可西里,无底洞,毛里求斯,藏王,中国四大古镇,藏北无人区,巧克力山,玉珠峰,撒哈拉之眼,大西国,爱因斯坦,奥林匹斯山,黄泉大道,天门山玻璃栈道,球状闪电,帕巴拉神庙,中华侏罗纪公园,凤凰山ufo事件,神农架,卡瓦格博,中国十大古城,珠峰大本营,亚特兰蒂斯,昆仑山死亡谷,查亚峰,魔鬼塔,巨人之路,贵州时光隧道,潘洛斯阶梯,处女峰,怒江72拐,希勒湖,乔戈里峰,倒悬空寺,鱼人岛,慕士塔格峰,日本龙三角,地心人,列宁峰,全球十大惊悚地点,不可能图形,死亡谷,巴比伦通天塔,珠穆朗玛峰,马尔代夫太阳岛,天下第一桥,蓝洞,9.8新疆ufo事件,沈阳怪坡,雁荡山,中国四大古城,四姑娘山,三山五岳,墨脱水电站,黑林错觉
posted on 2015-03-07 22:20
marchalex 阅读(219)
评论(0) 编辑 收藏 所属分类:
java小程序