广度优先搜索

栏目: IOS · 发布时间: 7年前

内容简介:广度优先搜索
广度优先搜索
SYJ.png

广度优先搜索回答两类问题:

1.从节点A出发,有前往节点D的路径吗?
    2.从节点A出发,前往节点D的哪条路径最短?

演示:

广度优先搜索
SYJ.png

代码演示

OC实现代码:

//示例:是否存在A到D的路径
#import "ViewController.h"

@interface ViewController ()
@property(nonatomic,strong)NSDictionary *dic;
@end
@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    _dic = [[NSDictionary alloc] init];
    //把每个节点对应的邻居节点存储起来
    _dic = @{@"A":@[@"B",@"F"],@"B":@[@"C"],@"C":@[@"D"],@"D":@[],@"E":@[@"C"],@"F":@[@"E",@"G"],@"G":@[@"C"]};
    BOOL lj = [self search:@"D"];
    if(lj){
        NSLog(@"存在A到D的路径");
    }else{
        NSLog(@"不存在A到D的路径");
    }
}

-(BOOL)search:(NSString*)str{
    //查找队列
    NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:0];
    [array addObject:@"A"];
    //存储已经检查过的节点
    NSMutableArray *searchedArr = [[NSMutableArray alloc] initWithCapacity:0];
    //当查找队列不为空
    while ([array count] != 0) {
        //取出队列中的一个元素
        NSString *name = array[0];
        [array removeObjectAtIndex:0];
        //检查这个元素是否被检查过
        if(![searchedArr containsObject:name]){
            //检查是不是要找的节点
            if([name isEqualToString:str]){
                return YES;
            }else{
                //将这个节点对应的邻居节点加入查找队列
                [array addObjectsFromArray:[_dic objectForKey:name]];
                //将这个节点标记为已检查过
                [searchedArr addObject:name];
            }
        }
    }
    return NO;
}
@end

java代码实现:

import java.util.*;
public class MyClass {
    private static Map m1 = new HashMap();
    public static void main(String[] args){
        //把每个节点对应的邻居节点存储起来
        m1.put("A", new String[]{"B", "F"});
        m1.put("B", new String[]{"C"});
        m1.put("C", new String[]{"D"});
        m1.put("D", new String[]{});
        m1.put("E", new String[]{"C"});
        m1.put("F", new String[]{"E","G"});
        m1.put("G", new String[]{"C"});

        boolean lj = search("G");
        if(lj){
            System.out.println("cz");
        }else{
            System.out.println("bcz");
        }
    }

    private static boolean search(String str){
        //查找队列
        Queue<String> queue = new LinkedList<String>();
        queue.offer("A");
        //存储已经检查过的节点
        String[] searchedArray = new String[0];
        //当查找队列不为空
        while (queue.size() != 0){
            //取出队列中的一个元素
            String name = queue.poll();
            //检查这个元素是否被检查过
            if(!Arrays.asList(searchedArray).contains(name)){
                //检查是不是要找的节点
                if(name == str){
                    return true;
                }else{
                    //将这个节点对应的邻居节点加入查找队列
                    String[] s = (String[]) m1.get(name);
                    for(int i = 0;i<s.length;i++){
                        queue.offer(s[i]);
                    }
                    //将这个节点标记为已检查过
                    searchedArray = Arrays.copyOf(searchedArray,searchedArray.length+1);
                    searchedArray[searchedArray.length-1] = name;
                }
            }
        }
        return false;
    }
}

python实现代码:

from collections import deque
def search(str):
    queue = deque()
    queue += 'A'
    searched = []
    while queue:
        name = queue.popleft()
        if not name in searched:
            if name == str:
                return True
            else:
                queue += dict[name]
                searched.append(name)
    return False

dict = {'A':['B','F'],'B':['C'],'C':['D'],'D':[],'E':['C'],'F':['E','G'],'G':['C']}
if search('D'):
    print('cz')
else:
    print('bcz')

以上所述就是小编给大家介绍的《广度优先搜索》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

算法统治世界——智能经济的隐形秩序

算法统治世界——智能经济的隐形秩序

徐恪、李沁 / 清华大学出版社有限公司 / 2017-11-15 / CNY 69.00

今天,互联网已经彻底改变了经济系统的运行方式,经济增长的决定性要素已经从物质资料的增加转变成为信息的增长。但是,只有信息的快速增长是不够的,这些增长的信息还必须是“有序”的。只有“有序”才能使信息具有价值,能够为人所用,能够指导我们实现商业的新路径。这种包含在信息里的隐形秩序才是今天信息世界的真正价值所在。经济系统的运行确实是纷繁复杂的,但因为算法的存在,这一切变得有律可循,算法也成为新经济系统里......一起来看看 《算法统治世界——智能经济的隐形秩序》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器