图由节点和边组成,直接相连的节点成为邻居。广度优先搜索时一种用于图的查找算法,用来解决节点之间是否存在路径及最短路径问题。
看一个简单的问题,你想找一个懂炒股的人带你玩玩股票,你想从身边的人找找,你找了身边的几个好友(佩奇,苏西,艾德蒙,理查德),结果可能找到,也可能没找到。
如果没找到,你决定从朋友的朋友去找一下,看有没有结果,比如佩奇的朋友(瑞贝卡,丹尼),苏西的朋友(乔治,佩德罗)。
为了找到最短路径,假设你的好友是一度好友,朋友的朋友是二度朋友,你需要先依次筛选你的一度朋友,看是否有满足条件的。如果没有,则将二度朋友加入筛选当中。
筛选要注意:
1使用队列,确保一度筛选在二度筛选之前
2筛选过的要做标记,避免重复筛选或反复循环
下面用最简单的程序模拟一下,就以找到以boss开头的字符串为结果,用 map<String,List>来模拟下用户关系,用set来过滤下已经处理过的节点。
public static boolean isBoss(String name){
if (name.startsWith("boss")) {
return true;
}
return false;
}
public static Map<String, List<String>> initPic = new HashMap<String, List<String>>(){
{
put("star", Arrays.asList("white","bank"));
put("white",Arrays.asList("tiger"));
put("bank",Arrays.asList("white","boss bull","naycy"));
}};
public static void searchPic(String name,Map<String,List<String>> pic){
Set<String> hasCheck = new HashSet<>();
LinkedList<String> queue = new LinkedList<>();
pic.entrySet().forEach((e)->{
queue.offer(e.getKey());
});
String temp = "";
while(!queue.isEmpty()){
temp = queue.poll();
if (!hasCheck.add(temp)) {
System.out.println(String.format("%s 已处理", temp));
continue;
}
if (isBoss(temp)) {
System.out.println(String.format("the boss is %s", temp));
return;
}
pic.get(temp).forEach((v)->{
queue.offer(v);
});
}
}
public static void main(String[] args) {
PicSearch.searchPic("star",initPic);
}