本文共 1688 字,大约阅读时间需要 5 分钟。
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/