最近一直沉迷于图的算法学习不能自拔。
经已免强能写图的构建、深度优先搜索、广度优先搜索、图的连通性、图的环、图的二分性这种基础入门算法。
其中现实中有一些需求,我也尝试用图算法去做处理,满满的成就感。不啰唆,直接先上我需求中的一个图构建代码
class Graph {
private final int V;
private int E;
private HashSet<Integer>[] adj;
public Graph(int v) {
this.V = v;
this.E = 0;
adj = new HashSet[v];
for (int i = 0; i < v; i++) {
adj[i] = new HashSet();
}
}
public Graph(List<PositionDO> positionDOS) {
this(positionDOS.size());
List<CreRuleVO> creRuleVOs = creRuleMapper.selectCareerData(null);
for (int v = 0; v < positionDOS.size(); v++) {
List<Integer> posIds = findPositionCareerVisible(positionDOS, v, creRuleVOs);// 返回可见职位在positionDOS中的索引位置
for (Integer w : posIds) {
addEdge(w, v);
}
}
}
private void addEdge(int v, int w) {
adj[v].add(w);
E++;
}
public int V() {
return V;
}
public int E() {
return E;
}
public HashSet<Integer> adj(int v) {
return adj[v];
}
}
这个需求是这样,公司有成套的岗位体系图,686个职位。首先需要在岗体图上定义职位的职业发展规则。这个规则里面有个可见性规则:某个职位能被哪些职位看到,从而让看到的人可以把该职位纳入自已的职业发展进行考量(实际会复杂得多,我这里暂且尽量简化抽出我需要说的点)。
这个可见性的需求我是用的有向图处理,职位就是顶点,职位V能看到职位W,那就是V>W。看上图代码,当图构造函数执行完的时候,每个职位能看到的职位关系也就有了。想要看当前登陆人能看到哪些职位作为自已的职业生涯发展考量,只需要调用adj(传入自已所在职位)即可。