博客
关于我
Objective-C实现topological sort拓扑排序算法(附完整源码)
阅读量:795 次
发布时间:2023-02-20

本文共 1688 字,大约阅读时间需要 5 分钟。

Objective-C实现topological sort拓扑排序算法

拓扑排序是一种对有向无环图(DAG)进行排序的算法,它将图中的所有顶点线性排序,使得对于每一条有向边 (u, v),顶点 u 在顶点 v 之前。拓扑排序常用于处理依赖关系,比如任务调度、课程安排等。

实现步骤

我们将使用 Kahn 算法来实现拓扑排序,这是一种基于入度的算法。

Objective-C 代码实现

#import   @interface Graph : NSObject @property (nonatomic, strong) NSMutableArray *nodes; @property (nonatomic, strong) NSMutableArray *edges; @property (nonatomic, strong) NSMutableDictionary *indegree; @end @implementation Extensions (void)topologicalSort { [self calculateIndegree]; [self performKahnAlgorithm]; } (void)calculateIndegree { for (id node in self.nodes) { [indegree removeAllObjects]; for (id edge in edges) { id source = [edge valueForKey:@"source"]; id target = [edge valueForKey:@"target"]; [indegree setObject:indegree forKey:target]; } } (void)performKahnAlgorithm { NSMutableArray *queue = [NSMutableArray new]; for (id node in self.nodes) { if ([indegree objectForKey:node] == 0) { [queue addObject:node]; } } while (!queue.isEmpty) { id node = [queue removeObjectAtIndex:0]; [self visitNode:node]; if (queue.isEmpty) break; } [self finish]; } (void)visitNode:(id)node { for (id edge in edges) { id target = [edge valueForKey:@"target"]; if ([edge valueForKey:@"source"] == node) { [indegree removeObjectForKey:target]; if ([indegree objectForKey:target] == 0) { [queue addObject:target]; } } } } (void)finish { // 排序自定义逻辑 [self.nodes sortUsingComparator:^int _(id a, id b) { return [self compare:(id)a (id)b]; }); // 输出排序结果 for (id node in self.nodes) { NSLog(@"排序结果:%@", node); } } (NSInteger)compare:(id)a (id)b { return [self compareObjects:a b:b]; } (NSInteger)compareObjects:(id)a (id)b { return [a compareTo:b]; } @end @end

以上代码实现了一个基于入度的拓扑排序算法,适用于有向无环图(DAG)的顶点排序。

转载地址:http://wuifk.baihongyu.com/

你可能感兴趣的文章
Network Sniffer and Connection Analyzer
查看>>
Nginx Location配置总结
查看>>
Nginx 反向代理解决跨域问题
查看>>
nginx 后端获取真实ip
查看>>
Nginx 学习总结(17)—— 8 个免费开源 Nginx 管理系统,轻松管理 Nginx 站点配置
查看>>
nginx 常用配置记录
查看>>
Nginx 我们必须知道的那些事
查看>>
nginx 配置~~~本身就是一个静态资源的服务器
查看>>
Nio ByteBuffer组件读写指针切换原理与常用方法
查看>>
NLP 基于kashgari和BERT实现中文命名实体识别(NER)
查看>>
No 'Access-Control-Allow-Origin' header is present on the requested resource.
查看>>
Node.js安装与配置指南:轻松启航您的JavaScript服务器之旅
查看>>
NSSet集合 无序的 不能重复的
查看>>
nullnullHuge Pages
查看>>
Numpy如何使用np.umprod重写range函数中i的python
查看>>
oauth2-shiro 添加 redis 实现版本
查看>>
OAuth2.0_JWT令牌-生成令牌和校验令牌_Spring Security OAuth2.0认证授权---springcloud工作笔记148
查看>>
OAuth2.0_JWT令牌介绍_Spring Security OAuth2.0认证授权---springcloud工作笔记147
查看>>
OAuth2.0_介绍_Spring Security OAuth2.0认证授权---springcloud工作笔记137
查看>>
OAuth2.0_授权服务配置_Spring Security OAuth2.0认证授权---springcloud工作笔记140
查看>>