在之前簡要介紹過
深度優先搜索和
廣度優先搜索這兩個算法。
同時我們之前也講過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 閱讀(221)
評論(0) 編輯 收藏 所屬分類:
java小程序