์ด์ ๋ฏธํ ํผ๋๋ฐฑ
์ด์ ๋ฏธํ ์์ ๋ฐ์ ํผ๋๋ฐฑ์ ๋ฐํ์ผ๋ก ๊ธฐ๋ฅ ๊ฐ์
- ๋ ธ๋ ์ญ์ ์ ์ด์ ๋ ธ๋๋ ํจ๊ป ์ญ์ ํ ๊ฒ์ธ์ง ์ฌ๋ถ ์ ํ ๊ฐ๋ฅ
- ์๋ก ๋ค๋ฅธ ํด๋ฌ์คํฐ๊ฐ ๊ฐ์ ์ถ๊ฐ์ ์์ ๋ณ๊ฒฝ
- Union-Find ์๊ณ ๋ฆฌ์ฆ ์ฑ๋ฅ ๊ฐ์
ํผ๋๋ฐฑ ๋ฐ์
1. ์ด์ ๋ ธ๋ ์ญ์ ์ฌ๋ถ ๊ฒฐ์
ํน์ ๋ ธ๋ ์ญ์ ์ ํด๋น ๋ ธ๋์ ์ด์ํ ๋ ธ๋๋ฅผ ํจ๊ป ์ญ์ ํ ์ง ์ ํ ๊ฐ๋ฅํ๋๋ก ๊ฐ์
const handleSubmit = useCallback(() => {
if (filter === "") {
return;
}
setRerender(false);
setGraphData((prev) => {
let filteredNodes = prev.nodes;
let filteredEdges = prev.edges;
if (deleteNeighbor) {
filteredEdges = prev.edges.filter(
(edge) => !edge.data.filter?.includes(filter)
);
// ์ด์๊ณผ ํจ๊ป ์ญ์
filteredNodes = prev.nodes.filter((node) =>
filteredEdges.some(
(edge) =>
edge.data.source === node.data.id ||
edge.data.target === node.data.id
)
);
} else {
// ์ด์ํ ๋
ธ๋๋ ์ญ์ ํ์ง ์์
filteredNodes = prev.nodes.filter((node) => node.data.id !== filter);
}
return {
nodes: filteredNodes,
edges: filteredEdges,
};
});
setFilter("");
}, [filter, setGraphData, deleteNeighbor]);
- deleteNeighbor์ด๋ผ๋ ์ํ๊ฐ์ ๋์ด์ ์ฌ์ฉ์๊ฐ ์ด๋ ํ ์ต์
์ ์ ํํ๋์ง ๊ตฌ๋ถ
- ์ด์๊ณผ ํจ๊ป ์ญ์ ํ ๊ฒฝ์ฐ์๋ ๊ฐ์ ์ ํตํด ์ด์์ ์ ๋ณด๋ฅผ ์ฐพ์์ ํจ๊ป ์ญ์
- ์ด์์ ์ญ์ ํ์ง ์์ ๊ฒฝ์ฐ, filter ๊ฐ์ ๊ฑธ๋ฆฌ๋ ๋ ธ๋๋ง ์ญ์
2. ๊ฐ์ ์ถ๊ฐ์ ํด๋ฌ์คํฐ ์์ ๋ณ๊ฒฝ
์ง๋๋ฒ์๋ ๊ฐ์ ์ด ์ถ๊ฐ๋์ด ํด๋ฌ์คํฐ๊ฐ ๊ฒฐํฉ๋์ด๋ ํด๋ฌ์คํฐ์ ์์์ด ํต์ผ๋์ง ์์์๋ค
useEffect(() => {
if (myCyRef) {
graphData.nodes.forEach((node) => {
myCyRef.getElementById(node?.data?.id ?? strings.empty).style({
"background-color": node?.data?.color,
});
});
myCyRef?.style(styleSheet).update();
}
}, [layout, graphData]);
- ๊ฐ์ ์ด ์ถ๊ฐ๋๋ฉด ๋ค์ ๋ ธ๋๋ค์ ๋๋ฉด์ ํด๋ฌ์คํฐ๋ฅผ ์ฐพ์ ์์์ ์ง์ ํด์ฃผ์๋ค
- ๊ทธ๋ฆฌ๊ณ ์ง์ ๋ ์์์ ๋ฐํ์ผ๋ก
style()
๋ฉ์๋๋ฅผ ํตํด์ ์์ ๊ฐ์ ๋ณ๊ฒฝํด์ฃผ์๋ค - ์ด์ ์๋ ์ง์ style์ ๋ณ๊ฒฝ์ ํ์ง ์์๊ธฐ ๋๋ฌธ์ ์์์ด ๋ฐ๋์ง ์์์๋ค
3. Union-Find ์ฑ๋ฅ ๊ฐ์
์ง๋๋ฒ์ ๊ฒฐํฉ๋ ํด๋ฌ์คํฐ๋ฅผ ํ์งํ๊ธฐ ์ํด Union-Find๋ฅผ ๋ค์ ๋์์ผ ํ๋ ๊ฒ์ ๋ํด ์ง๋ฌธ์ ๋๋ ธ์๋ค
- Map<String, List>์ ๊ฐ์ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํด์, ๊ฐ ํด๋ฌ์คํฐ์ ๋ํ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ค๊ณ ํ๋ค
- ๋ฌธ์ ๋ Cytoscape์ Node๋ฅผ ํต์งธ๋ก List์ ๋ฃ๊ธฐ์ ๋ฌด๋ฆฌ๊ฐ ์์๋ค.
- ๊ทธ๋ ๋ค๊ณ ID ๊ฐ๋ง String์ผ๋ก ์ ์ฅ์ ํ๋ ค๊ณ ํ๋ฉด, ๋ ๋๋ง์ ํ๊ธฐ ์ํด์๋ ๋ค์ Node๋ก ๋ณ๊ฒฝ์ ํด์ฃผ์ด์ผ ํ๋ค.
- ์ด๋ฐ ๊ณผ์ ์ ๊ฑฐ์น ๋งํผ ๋ ๋๋ง ์๋๊ฐ ๋๋ฆฌ์ง ์์์, ์ผ๋จ์ ๊ทธ๋๋ก ์งํํ๊ธฐ๋ก ํ๋ค.
์๋กญ๊ฒ ๊ตฌํํ ๊ธฐ๋ฅ
ํ์ํ๋ค๊ณ ๋๋ ๊ธฐ๋ฅ์ ์๋กญ๊ฒ ๊ตฌํ
1. ๋ ธ๋ ๊ฒ์
๋ ธ๋์ ์๊ฐ ๋ง์์ก์ ๋, ํน์ ๋ ธ๋์ ์์น๋ฅผ ์ฐพ๋ ๊ฒ์ด ์ด๋ ค์์ ๊ฒ์ ๊ธฐ๋ฅ์ ๋์ ํ๋ค
useEffect(() => {
if (!myCyRef) return;
const elements = myCyRef.elements(`node[label = "${searchNode}"]`);
if (elements && elements.length > 0) {
myCyRef?.animate({
fit: {
eles: elements,
padding: 20,
},
});
myCyRef?.center(elements);
}
}, [searchNode]);
- ๊ฒ์์ด์ ๋ฐ๋ผ์ ํด๋น ๊ฒ์์ด์ ์ผ์นํ๋ ID๋ฅผ ๊ฐ์ง ๋ ธ๋๋ฅผ ํ๋ํด์ ๋ณด์ฌ์ค ์ ์๋๋ก ํ๋ค.
ํผ๋๋ฐฑ
์ด๋ฒ์ ๊ตฌํํ ๊ธฐ๋ฅ๋ค์ ๋ํ ํผ๋๋ฐฑ์ ๋ฐ์๋ค
- ๊ฒ์ ๊ธฐ๋ฅ์ ์ข์ง๋ง, ๋คํธ์ํฌ ๋ด์์ ์ด๋์ ์์นํ๋์ง๋ฅผ ์๊ณ ์ถ์ ๊ฒฝ์ฐ๊ฐ ๋ง์ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ํ๋ ๋ณด๋ค๋ ํด๋น ๋
ธ๋๋ฅผ ๊น๋นก์ด๊ฒ ํ๋ ๋ฑ์ ์ดํํธ๊ฐ ๋ ์ข์ ๋ณด์ธ๋ค
- ์ด์ ๋ฅผ ๋ฃ๊ณ ๋ฐ๋ก ๋ฉ๋ํ๋ ํผ๋๋ฐฑ์ด์๋ค
- ํน์ ๋ ธ๋๋ฅผ ํด๋ฆญํ์ ๋, ํด๋น ๋ ธ๋์ ๋ํ ์ ๋ณด๋ฅผ ์ด๋๊ฐ์ ๋์์ค ์ ์์ผ๋ฉด ์ข๊ฒ ๋ค
์ถํ ๊ณํ
๋ค์๋ฒ์๋ ์ด๋ค ๊ธฐ๋ฅ๋ค์ ๊ตฌํํ ์ง ๋ ผ์
- ๋จผ์ ํผ๋๋ฐฑ์ ๋ฐํ์ผ๋ก ์๋กญ๊ฒ ๊ตฌํํ ๊ธฐ๋ฅ๋ค์ ๊ฐ์ ํ ์์
- ์๊ฒฉ์ผ๋ก ์ ์ํ๊ธฐ ์ ์ ์ฐ๊ตฌ์ค์ ๋ฐฉ๋ฌธํด์ ์๋ฒ ์ปดํจํฐ์ ๊ธฐ๋ณธ์ ์ธ ์ธํ ์ ํ ์์
'HYU > ์กธ์ ํ๋ก์ ํธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
8. ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ตฌ์ถ (0) | 2024.03.31 |
---|---|
7. ์น ์๋ฒ ๊ตฌ์ (0) | 2024.03.20 |
5. ์ ์ , ๊ฐ์ ์ถ๊ฐ ๋ฐ ์ญ์ (0) | 2024.03.04 |
4. ํ์ด์ง ๋ ์ด์์ ๋์์ธ ๋ฐ ๋ณ๊ฒฝ (0) | 2024.02.26 |
3. Community Detection (2) | 2024.02.09 |