广度优先是一种用于图的查找算法
使用广度优先算法可以让你找到两样东西之间的最短距离,
编写国际跳棋AI,计算最少走多少步就可以获胜。
编写拼写检查器,计算多少编辑多少个地方就可将错拼的单词改成正确的单词,如将READED改为READER需要编辑一个地方;
根据你的人际关系网络找到关系最近的医生。
举个栗子说明:
假设你是一个芒果经销商,需要寻找芒果经销商,以便将芒果卖给他。为此你可以在朋友圈中查找是否含有这样的人。
屏幕快照 2019-01-29 上午10.11.47.png
屏幕快照 2019-01-29 上午10.12.37.png
屏幕快照 2019-01-29 上午10.12.54.png
这样一来你不仅在朋友圈中查找,还在朋友的朋友圈中查找。别忘了你的目标是在你的人际关系中找到一位经销商因此,Alice 不是经销商,就将其朋友加入到名单中,这就意味着你将在他的朋友,朋友的朋友中查找。使用这种算法将搜索你的整个人际关系网,直到找到苹果经销商。这就是广度优先搜索算法。
屏幕快照 2019-01-29 上午10.21.46.png 屏幕快照 2019-01-29 上午10.21.57.png实现算法:
1.算法工作原理
屏幕快照 2019-01-29 上午10.23.53.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.
屏幕快照 2019-01-29 下午2.34.24.png
网友评论