美文网首页
广度优先搜索算法(OC实现)

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

作者: 东了个尼 | 来源:发表于2019-01-29 14:37 被阅读0次

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

    使用广度优先算法可以让你找到两样东西之间的最短距离,
    编写国际跳棋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

    相关文章

      网友评论

          本文标题:广度优先搜索算法(OC实现)

          本文链接:https://www.haomeiwen.com/subject/jcgtsqtx.html