图与广度优先搜索

图由节点和边组成,直接相连的节点成为邻居。广度优先搜索时一种用于图的查找算法,用来解决节点之间是否存在路径及最短路径问题。

看一个简单的问题,你想找一个懂炒股的人带你玩玩股票,你想从身边的人找找,你找了身边的几个好友(佩奇,苏西,艾德蒙,理查德),结果可能找到,也可能没找到。

如果没找到,你决定从朋友的朋友去找一下,看有没有结果,比如佩奇的朋友(瑞贝卡,丹尼),苏西的朋友(乔治,佩德罗)。

为了找到最短路径,假设你的好友是一度好友,朋友的朋友是二度朋友,你需要先依次筛选你的一度朋友,看是否有满足条件的。如果没有,则将二度朋友加入筛选当中。

筛选要注意:
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);
}

猜你喜欢

转载自blog.csdn.net/weixin_43275277/article/details/108449759