Tech Log Graph Theory Note
2026年4月3日 研究日志
今日研究内容:学习有关图论和深度优先遍历的基础知识。
说真的,基因可以被理解为图我是今天才知道的,序列分析可以通过将其视作顶点为k-mer,边则是重叠关系的De Brujin图,单细胞组学的kNN也是将细胞视作顶点,相似度视作边。以前一直不求甚解地用着这些做项目,没想到我的工作底层竟然在这里,现在学习了一点,感觉眼界又开阔了一些。
DFS(深度优先搜索)
从一个节点开始,沿着一条路径尽可能深入 → 找到所有可能的路径
import networkx as nx
def dfs(graph, start):
visited = set()
order = []
def _dfs(node):
visited.add(node)
order.append(node)
for neighbor in graph.neighbors(node):
if neighbor not in visited:
_dfs(neighbor)
_dfs(start)
return order
G = nx.Graph()
G.add_edges_from([
("A", "B"), ("A", "D"),
("B", "C"),
("C", "E"),
("D", "E")
])
print("DFS 遍历顺序:", dfs(G, "A"))
DFS 遍历顺序: ['A', 'B', 'C', 'E', 'D']
在基因调控网络(GRN)或 PPI 网络中,DFS 常用于寻找调控链、探索深层路径、检测反馈环(feedback loops),以及在单细胞轨迹树中遍历分化路径。
BFS(广度优先搜索)
按层扩散,用于找到最短路径或局部结构
import networkx as nx
from collections import deque
def bfs(graph, start):
visited = set([start])
queue = deque([start])
order = []
while queue:
node = queue.popleft()
order.append(node)
for neighbor in graph.neighbors(node):
if neighbor not in visited:
visited.add(neighbor)
queue.append(neighbor)
return order
G = nx.Graph()
G.add_edges_from([
("A", "B"), ("A", "D"),
("B", "C"),
("C", "E"),
("D", "E")
])
print("BFS 遍历顺序:", bfs(G, "A"))
BFS 遍历顺序: ['A', 'B', 'D', 'C', 'E']
BFS 在组学中常用于寻找最短生物通路(如代谢网络中的最短反应链)、单细胞 kNN 图中的连通性检测、网络扩散分析(disease gene propagation),以及识别距离某个基因最近的功能模块。
说来惭愧,我现在还对这些算法懵懵懂懂,所以没法教学,今天就做个展示,之后再深入了解吧。