python - 卡恩算法的顺序不正确
问题描述
我正在尝试使用卡恩算法实现拓扑排序:
from collections import defaultdict
def ordering(graph:dict):
in_counts = defaultdict(int)
for k, v in graph.items():
if not k in in_counts:
in_counts[k] = 0
for in_node in v:
in_counts[in_node] += 1
queue = []
for in_node in in_counts.keys():
if in_counts[in_node] == 0:
queue.append(in_node)
topological_order = []
while queue:
print("in_counts:", in_counts)
print("queue:", queue)
current_node = queue.pop(0)
topological_order.append(current_node)
print("result:", topological_order)
if not current_node in graph:
continue
for in_node in graph[current_node]:
in_counts[in_node] -= 1
if in_counts[in_node] == 0:
queue.append(in_node)
return topological_order
print(ordering({'GTTGA': ['CTGAG'], 'TTCAC': ['GTTGA'], 'AAGGC': ['GTTGA', 'TAACA', 'TTCAC'], 'CGGGC': ['GTTGA', 'TAACA'], 'CCCTC': ['GTTGA', 'TAACA', 'TTCAC', 'AAGGC', 'CGGGC', 'CTGAG'], 'AGCTT': ['GTTGA']}))
调试输出:
in_counts: defaultdict(<class 'int'>, {'GTTGA': 5, 'CTGAG': 2, 'TTCAC': 2, 'AAGGC': 1, 'TAACA': 3, 'CGGGC': 1, 'CCCTC': 0, 'AGCTT': 0})
queue: ['CCCTC', 'AGCTT']
result: ['CCCTC']
in_counts: defaultdict(<class 'int'>, {'GTTGA': 4, 'CTGAG': 1, 'TTCAC': 1, 'AAGGC': 0, 'TAACA': 2, 'CGGGC': 0, 'CCCTC': 0, 'AGCTT': 0})
queue: ['AGCTT', 'AAGGC', 'CGGGC']
result: ['CCCTC', 'AGCTT']
in_counts: defaultdict(<class 'int'>, {'GTTGA': 3, 'CTGAG': 1, 'TTCAC': 1, 'AAGGC': 0, 'TAACA': 2, 'CGGGC': 0, 'CCCTC': 0, 'AGCTT': 0})
queue: ['AAGGC', 'CGGGC']
result: ['CCCTC', 'AGCTT', 'AAGGC']
in_counts: defaultdict(<class 'int'>, {'GTTGA': 2, 'CTGAG': 1, 'TTCAC': 0, 'AAGGC': 0, 'TAACA': 1, 'CGGGC': 0, 'CCCTC': 0, 'AGCTT': 0})
queue: ['CGGGC', 'TTCAC']
result: ['CCCTC', 'AGCTT', 'AAGGC', 'CGGGC']
in_counts: defaultdict(<class 'int'>, {'GTTGA': 1, 'CTGAG': 1, 'TTCAC': 0, 'AAGGC': 0, 'TAACA': 0, 'CGGGC': 0, 'CCCTC': 0, 'AGCTT': 0})
queue: ['TTCAC', 'TAACA']
result: ['CCCTC', 'AGCTT', 'AAGGC', 'CGGGC', 'TTCAC']
in_counts: defaultdict(<class 'int'>, {'GTTGA': 0, 'CTGAG': 1, 'TTCAC': 0, 'AAGGC': 0, 'TAACA': 0, 'CGGGC': 0, 'CCCTC': 0, 'AGCTT': 0})
queue: ['TAACA', 'GTTGA']
result: ['CCCTC', 'AGCTT', 'AAGGC', 'CGGGC', 'TTCAC', 'TAACA']
in_counts: defaultdict(<class 'int'>, {'GTTGA': 0, 'CTGAG': 1, 'TTCAC': 0, 'AAGGC': 0, 'TAACA': 0, 'CGGGC': 0, 'CCCTC': 0, 'AGCTT': 0})
queue: ['GTTGA']
result: ['CCCTC', 'AGCTT', 'AAGGC', 'CGGGC', 'TTCAC', 'TAACA', 'GTTGA']
in_counts: defaultdict(<class 'int'>, {'GTTGA': 0, 'CTGAG': 0, 'TTCAC': 0, 'AAGGC': 0, 'TAACA': 0, 'CGGGC': 0, 'CCCTC': 0, 'AGCTT': 0})
queue: ['CTGAG']
result: ['CCCTC', 'AGCTT', 'AAGGC', 'CGGGC', 'TTCAC', 'TAACA', 'GTTGA', 'CTGAG']
预期结果是:
['CCCTC', 'CGGGC', 'AGCTT', 'AAGGC', 'TAACA', 'TTCAC', 'GTTGA', 'CTGAG']
这与我的结果不同(见上文)。
我知道CGGGC
应该放在 之后CCCTC
,但是我不明白这如何与算法不冲突:在开始时两者都具有,并且CCCTC
在之后进入队列。AGCTT
0
CGGGC
AGCTT
我错过了什么?
解决方案
推荐阅读
- javascript - 查找匹配条件的数组索引,然后推入另一个数组
- linux - 反向函数通过shell读取应用csv中的特定列
- laravel - Laravel Cache,正在重新查询缓存的查询
- vba - VBA:循环遍历各种 Excel 文件并将 cokumn 复制到主文件中
- django - 如何创建连接到现有 MySQL 表的 Django REST Framework API,而不是通过 models.py 创建它们
- ssl - erlang elixir nif char * 数据到二进制文件的 OCSP 请求失败
- java - java.lang.NoClassDefFoundError:解析失败:Lcom/google/android/gms/common/internal/zzbo;
- scala - 在Scala中无条件返回字符串
- google-app-engine - 无法访问受版本控制的 Google App Engine 网站
- angular6 - 为什么我在 `http.get().pipe()` 上得到“未定义”