Skip to content

Commit 50688e0

Browse files
authored
perf(transforms): reduce the complexity of groupByEndpoints for parallel edges (#6824)
1 parent 364b9df commit 50688e0

File tree

1 file changed

+41
-10
lines changed

1 file changed

+41
-10
lines changed

packages/g6/src/transforms/process-parallel-edges.ts

Lines changed: 41 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,12 @@ export class ProcessParallelEdges extends BaseTransform<ProcessParallelEdgesOpti
7878
super(context, Object.assign({}, ProcessParallelEdges.defaultOptions, options));
7979
}
8080

81+
/**
82+
* <zh/> 在每次绘制前处理平行边
83+
*
84+
* <en/> Process parallel edges before each drawing
85+
* @param input
86+
*/
8187
public beforeDraw(input: DrawData): DrawData {
8288
const edges = this.getAffectedParallelEdges(input);
8389

@@ -90,6 +96,12 @@ export class ProcessParallelEdges extends BaseTransform<ProcessParallelEdgesOpti
9096
return input;
9197
}
9298

99+
/**
100+
* <zh/> 获取受影响的平行边
101+
*
102+
* <en/> Get affected parallel edges
103+
* @param input
104+
*/
93105
private getAffectedParallelEdges = (input: DrawData): Map<ID, EdgeData> => {
94106
const {
95107
add: { edges: edgesToAdd },
@@ -240,35 +252,54 @@ export class ProcessParallelEdges extends BaseTransform<ProcessParallelEdgesOpti
240252
}
241253

242254
/**
243-
* <zh/> 按照端点分组
255+
* <zh/> 优化的按照端点分组方法,时间复杂度O(n)
244256
*
245-
* <en/> Group by endpoints
257+
* <en/> Optimized method to group by endpoints, time complexity O(n)
246258
* @param edges - <zh/> 边集合 | <en/> Edges
247259
* @returns <zh/> 端点分组后的边集合 | <en/> Edges grouped by endpoints
248260
*/
249261
export const groupByEndpoints = (edges: Map<ID, EdgeData>) => {
250262
const edgeMap = new Map<string, EdgeData[]>();
251263
const processedEdgesSet = new Set<ID>();
252264
const reverses: Record<string, boolean> = {};
265+
const includedEdgesInGroup = new Map<string, Set<ID>>();
253266

254267
for (const [id, edge] of edges) {
255268
if (processedEdgesSet.has(id)) continue;
256269

257270
const { source, target } = edge;
258271
const sourceTarget = `${source}-${target}`;
259272

260-
if (!edgeMap.has(sourceTarget)) edgeMap.set(sourceTarget, []);
261-
edgeMap.get(sourceTarget)!.push(edge);
262-
processedEdgesSet.add(id);
273+
if (!edgeMap.has(sourceTarget)) {
274+
edgeMap.set(sourceTarget, []);
275+
includedEdgesInGroup.set(sourceTarget, new Set<ID>());
276+
}
277+
278+
const sourceTargetEdges = edgeMap.get(sourceTarget);
279+
const includedEdges = includedEdgesInGroup.get(sourceTarget);
280+
281+
if (sourceTargetEdges && includedEdges && !includedEdges.has(id)) {
282+
sourceTargetEdges.push(edge);
283+
includedEdges.add(id);
284+
processedEdgesSet.add(id);
285+
}
263286

264287
for (const [otherId, sedge] of edges) {
265-
if (processedEdgesSet.has(otherId)) continue;
288+
if (processedEdgesSet.has(otherId) || otherId === id) continue;
266289

267290
if (isParallelEdges(edge, sedge)) {
268-
edgeMap.get(sourceTarget)!.push(sedge);
269-
processedEdgesSet.add(otherId);
270-
if (source === sedge.target && target === sedge.source) {
271-
reverses[`${sedge.source}|${sedge.target}|${edgeMap.get(sourceTarget)!.length - 1}`] = true;
291+
const groupEdges = edgeMap.get(sourceTarget);
292+
const includedGroupEdges = includedEdgesInGroup.get(sourceTarget);
293+
294+
if (groupEdges && includedGroupEdges && !includedGroupEdges.has(otherId)) {
295+
groupEdges.push(sedge);
296+
includedGroupEdges.add(otherId);
297+
298+
if (source === sedge.target && target === sedge.source) {
299+
reverses[`${sedge.source}|${sedge.target}|${groupEdges.length - 1}`] = true;
300+
}
301+
302+
processedEdgesSet.add(otherId);
272303
}
273304
}
274305
}

0 commit comments

Comments
 (0)