广度优先搜索算法(OC实现)
2019-01-29 本文已影响0人
东了个尼
广度优先是一种用于图的查找算法
使用广度优先算法可以让你找到两样东西之间的最短距离,
编写国际跳棋AI,计算最少走多少步就可以获胜。
编写拼写检查器,计算多少编辑多少个地方就可将错拼的单词改成正确的单词,如将READED改为READER需要编辑一个地方;
根据你的人际关系网络找到关系最近的医生。
举个栗子说明:
假设你是一个芒果经销商,需要寻找芒果经销商,以便将芒果卖给他。为此你可以在朋友圈中查找是否含有这样的人。
![](https://img.haomeiwen.com/i2631509/2538e02d0161b3d9.png)
![](https://img.haomeiwen.com/i2631509/6de1e7f6c685e640.png)
![](https://img.haomeiwen.com/i2631509/95a293bcfc4e6f52.png)
这样一来你不仅在朋友圈中查找,还在朋友的朋友圈中查找。别忘了你的目标是在你的人际关系中找到一位经销商因此,Alice 不是经销商,就将其朋友加入到名单中,这就意味着你将在他的朋友,朋友的朋友中查找。使用这种算法将搜索你的整个人际关系网,直到找到苹果经销商。这就是广度优先搜索算法。
![](https://img.haomeiwen.com/i2631509/9225e5c6b3e00bcf.png)
![](https://img.haomeiwen.com/i2631509/a5893e460484c91b.png)
实现算法:
1.算法工作原理
![](https://img.haomeiwen.com/i2631509/7335c19354c0cacc.png)
算法执行过程
![](https://img.haomeiwen.com/i2631509/5c2d4b1192521f49.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.
![](https://img.haomeiwen.com/i2631509/6005056e3a96bb88.png)