广度优先搜索算法(OC实现)

广度优先是一种用于图的查找算法

使用广度优先算法可以让你找到两样东西之间的最短距离,
编写国际跳棋AI,计算最少走多少步就可以获胜。
编写拼写检查器,计算多少编辑多少个地方就可将错拼的单词改成正确的单词,如将READED改为READER需要编辑一个地方;
根据你的人际关系网络找到关系最近的医生。

举个栗子说明:

假设你是一个芒果经销商,需要寻找芒果经销商,以便将芒果卖给他。为此你可以在朋友圈中查找是否含有这样的人。
2631509-2538e02d0161b3d9.png
屏幕快照 2019-01-29 上午10.11.47.png
2631509-6de1e7f6c685e640.png
屏幕快照 2019-01-29 上午10.12.37.png

2631509-95a293bcfc4e6f52.png
屏幕快照 2019-01-29 上午10.12.54.png

这样一来你不仅在朋友圈中查找,还在朋友的朋友圈中查找。别忘了你的目标是在你的人际关系中找到一位经销商因此,Alice 不是经销商,就将其朋友加入到名单中,这就意味着你将在他的朋友,朋友的朋友中查找。使用这种算法将搜索你的整个人际关系网,直到找到苹果经销商。这就是广度优先搜索算法。

2631509-9225e5c6b3e00bcf.png
屏幕快照 2019-01-29 上午10.21.46.png
2631509-a5893e460484c91b.png
屏幕快照 2019-01-29 上午10.21.57.png

实现算法:
1.算法工作原理


2631509-7335c19354c0cacc.png
屏幕快照 2019-01-29 上午10.23.53.png

算法执行过程


2631509-5c2d4b1192521f49.png
屏幕快照 2019-01-29 下午2.36.04.png

- (void)viewDidLoad {
    [super viewDidLoad];
//需要搜索的朋友数据
    _searchList = @{@"YOU":@[@"ALICE",@"BOB",@"claire"],@"ALICE":@[@"PEEGY"],@"BOB":@[@"PEEGY",@"ANUJ"],@"claire":@[@"THOM",@"JONNY"]};
    [self search:@"THOM"];
}

-(BOOL)search:(NSString *)str{
    //1.创建一个查找队列
    NSMutableArray *array = [NSMutableArray array];
    //首先将你的第一级朋友加入到搜索集合中
    [array addObjectsFromArray:_searchList[@"YOU"]];
    //已经查找过的节点(记录)
    NSMutableArray *searchArray = [NSMutableArray array];
    while (array.count) {//直到队列为空
        //取出集合中的第一个元素去匹配
        NSString *name = array.firstObject;
        //去除队列最前面一个节点()
        [array removeObjectAtIndex:0];
        if (![searchArray containsObject:name]){//没有检查过
            if ([name isEqualToString:str]) {//找到节点
                return YES;//返回结果
            }else{
                //将这个节点加入到搜索记录集合中防止 陷入无限循环中
                [searchArray addObject:name];
                //将这个节点对应的邻居节点加入查找队列
                [array addObjectsFromArray:[_searchList valueForKey:name]];
            }
        }
    }
    return NO;
}

最后搜索记录数组searchArray中存储的数据
我们来分析一下:首先第一步,由于我们首先取出的第一条数据是ALICE,去匹配,没有匹配到,然后是BOB,claire,第一级朋友圈数据中没有THOM(也就是芒果经销商),然后去第二级朋友圈中去匹配查找,ALICE的二级朋友圈是PEEGY,BOB的二级朋友圈是@[@"PEEGY",@"ANUJ"],claire的二级朋友圈中第一条数据就是THOM,所以searchArray记录中的数据顺序是ALICE,BOB,claire,PEEGY, PEEGY,ANUJ.,但是由于PEEGY之前已经被检查过一次了,所以不会在被添加到searchArray数组中,所以最终的数据是ALICE,BOB,claire,PEEGY,ANUJ.


2631509-6005056e3a96bb88.png
屏幕快照 2019-01-29 下午2.34.24.png

猜你喜欢

转载自blog.csdn.net/weixin_34268753/article/details/87579455