์๋
ํ์ธ์ ์ฌ๋ฌ๋ถ, ๋ํธ ํ์ผ์ ๊ตฌ๋ฌธ ๋ถ์ํ๋ ๋์ ๋ชจ๋ LCA๊ฐ Robert
๋ฐ Cersei
์ฌ์ผ ํ๋ ๊ทธ๋ํ๋ฅผ ์ฌ์ฉํ์ง๋ง ๋์ ์๋ฌด ๊ฒ๋ ๋ฐ์ง ๋ชปํ์ต๋๋ค. ์ ๋ง ๋ฒ๊ทธ์ธ์ง ํ์ธํด์ฃผ์ธ์. ์ด ๋ฒ๊ทธ๋ NaiveLcaFinder์ findLcas
๊ธฐ๋ฅ์ ์์ต๋๋ค.
<strong i="9">@Test</strong>
public void testPseudoLcas(){
public final String NL = "\n";
String input = "digraph GOT {"+NL+
"graph [ bgcolor = whitesmoke ]"+NL+
"subgraph cluster_stark {"+NL+
"style = filled ;"+NL+
"color = lightblue ;"+NL+
"label = \" House Stark \" ;"+NL+
"node [ style = filled , color = white ];"+NL+
"Rickard ;"+NL+
"Brandon ; Eddard ; Benjen ; Lyanna ;"+NL+
"Robb ; Sansa ; Arya ; Brandon ; Rickon ;"+NL+
"node [ shape = doublecircle , style = filled , color = white ];"+NL+
"Jon ;"+NL+
"Rickard -> Brandon ;"+NL+
"Rickard -> Eddard ;"+NL+
"Rickard -> Benjen ;"+NL+
"Rickard -> Lyanna ;"+NL+
"Eddard -> Robb ;"+NL+
"Eddard -> Sansa ;"+NL+
"Eddard -> Arya ;"+NL+
"Eddard -> Brandon ;"+NL+
"Eddard -> Rickon ;"+NL+
"Eddard -> Jon [ label = \" bastard \" , color = azure4 ];"+NL+
"}"+NL+
"subgraph cluster_baratheon {"+NL+
"style = filled ;" +NL+
"color = chocolate3 ;" +NL+
"label = \" House Baratheon \" ;" +NL+
"node [ style = filled , color = white ];" +NL+
"Ormund ; Steffon ; Robert ; Stannis ; Renly ; Shireen ; Joffrey ; Myrcellar ; Tommen ;" +NL+
"Ormund -> Steffon ;" +NL+
"Rhaelle -> Steffon ;" +NL+
"Ormund -> Rhaelle ;" +NL+
"Rhaelle -> Ormund ;" +NL+
"Steffon -> Robert ;" +NL+
"Steffon -> Stannis ;" +NL+
"Steffon -> Renly ;" +NL+
"Stannis -> Shireen ;" +NL+
"Robert -> Joffrey ;" +NL+
"Robert -> Myrcellar ;" +NL+
"Robert -> Tommen ;" +NL+
"}" +NL+
"subgraph cluster_lannister {"+NL+
"style = filled ;"+NL+
"color = cornsilk3 ;"+NL+
"label = \" House Lannister \" ;"+NL+
"node [ style = filled , color = white ];"+NL+
"Tywin ; Joanna ; Jaime ; Cersei ; Tyrion ;"+NL+
"Tywin -> Joanna ;"+NL+
"Joanna -> Tywin ;"+NL+
"Joanna -> Jaime ;"+NL+
"Joanna -> Cersei ;"+NL+
"Joanna -> Tyrion ;"+NL+
"Tywin -> Jaime ;"+NL+
"Tywin -> Cersei ;"+NL+
"Tywin -> Tyrion ;"+NL+
"Jaime -> Cersei ;"+NL+
"Cersei -> Jaime ;"+NL+
"Robert -> Cersei ;"+NL+
"Cersei -> Robert ;"+NL+
"Cersei -> Joffrey ;"+NL+
"Cersei -> Myrcellar ;"+NL+
"Cersei -> Tommen ;"+NL+
"Jaime -> Joffrey [ style = dashed ];"+NL+
"Jaime -> Myrcellar [ style = dashed ];"+NL+
"Jaime -> Tommen [ style = dashed ];"+NL+
"}"+NL+
"Lyanna -> Rhaegar [ style = dashed , label = \" ? \" ];"+NL+
"Rhaegar -> Lyanna [ style = dashed , label = \" ? \" ];"+NL+
"Lyanna -> Jon [ style = dashed , label = \" ? \" ];"+NL+
"Rhaegar -> Jon [ style = dashed , label = \" ? \" ];"+NL+
"labelloc = \" t \" ;"+NL+
"fontsize =50;"+NL+
"fontcolor = lightslategrey ;"+NL+
"fontname = \" Bookman Old Style Bold Italic \" ;"+NL+
"label = \" Game of Thrones Family Tree \""+NL+
"}" ;
VertexProvider<String> vp = (a, b) -> a;
EdgeProvider<String, DefaultEdge> ep = (f, t, l, a) -> new DefaultEdge();
GraphImporter<String, DefaultEdge> importer = new DOTImporter<String, DefaultEdge>(vp, ep);
DirectedPseudograph<String, DefaultEdge> graph = new DirectedPseudograph<String, DefaultEdge>(DefaultEdge.class);
try {
importer.importGraph(graph, new StringReader(input));
} catch (ImportException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
NaiveLcaFinder<String, DefaultEdge> graphFinder = new NaiveLcaFinder<>(graph);
checkLcas(graphFinder, "Joffrey", "Tommen", Arrays.asList("Robert"));
}
์ด ๋ฌธ์ ๋ฅผ ๋๋ฒ๊ทธํ๊ธฐ ์ํด ๋ฌด์์ ํ์ต๋๊น?
NaiveLcaFinder ํด๋์ค ์์ฑ์๋ ๊ทธ๋ํ๊ฐ ๋ฐฉํฅ์ ์ง์ ํด์ผ ํ๋ค๋ ๊ฒ๋ง ํ์ธํ๊ณ ์ฌ์ดํด์ด ํฌํจ๋์ด ์๋์ง ํ์ธํ์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค. LCA๋ DAG์์ ์ฐพ์์ผ ํ์ง๋ง ์ฃผ์ด์ง ํ ์คํธ์ ๋ํด ๋์ค์ ๊ทธ๊ฒ์ด DAG๊ฐ ์๋๋ผ๋ ๊ฒ์ ๊นจ๋ฌ์์ต๋๋ค. DAG๊ฐ ๋์ด์ผ ํ์ง๋ง ๊ทธ๋ ์ง ์์์ต๋๋ค. ๊ณ์ํด์ ์ด ๊ฒ์ฌ๋ฅผ ๊ตฌํํด์ผ ํฉ๋๊น?
์๋์, ์ด๊ฒ์ ์ํ๋ก ์ถ๊ฐํ๋ ๊ฒ์ ์ข์ ์๊ฐ์ด ์๋๋๋ค. ์ ๋ ฅ ์ ํจ์ฑ ๊ฒ์ฌ์ ๊ณ์ฐ ๋ ธ๋ ฅ์ ๊ธฐ์ธ์ด๋ ๊ฒ๊ณผ ์ฌ์ฉ์๊ฐ ์ฌ๋ฐ๋ฅธ ์ ๋ ฅ์ ์ ๊ณตํ๋ค๊ณ ๊ฐ์ ํ๋ ๊ฒ ์ฌ์ด์๋ ํญ์ ์ ์ถฉ์ ์ด ์์ต๋๋ค. ํ์ฌ ์ฝ๋์ ์ก์ธ์คํ ์ ์์ง๋ง ํ ์ ์๋ ์์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ isDirectedAcyclicGraph ํ ์คํธ์ ํด๋นํ๋ ๋ฉ์๋๊ฐ ์ด๋ฏธ ์กด์ฌํ์ง ์๋์ง ๋ค์ ํ์ธํ์ญ์์ค(์ด๊ฑด ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค).
๋ด ํ๋ก์ ํธ์ ๊ฒฝ์ฐ DAG๊ฐ ํ์ํ๋๋ก NaiveLcaFinder
์์ฑ์๋ฅผ ์์ ํ์ต๋๋ค. isDirectedAcyclicGraph
๋ฉ์๋๋ฅผ ์์ฑํ๋ ์์
์ ํ ๊ฒ์
๋๋ค. ๊ทธ๋ํ์ ๋ฐฉํฅ์ด ์๋ ๊ฒฝ์ฐ์ ๊ทธ๋ํ์ ์ฃผ๊ธฐ๊ฐ ํฌํจ๋ ๊ฒฝ์ฐ ๋ ๋ค ์ด๋ฏธ ๊ตฌํ๋์ด ์์ผ๋ฏ๋ก isDirectedAcyclicGraph
๊ตฌํ์ ๊ณ์ํด๋ ๋ฉ๋๊น?
@hulk-baba ์ ๋ ฅ ํ์ผ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. "Robert Cersei"(์ค์ ๋ก ์ ํํ์ง๋ ์์ง๋ง Cersei์์ Robert๋ก์ ๊ฐ์ฅ์๋ฆฌ๊ฐ ์์ต๋๋ค. ์ ๋ ฅ ํ์ผ์์ Robert์์ Cersei๋ก)๋ฅผ ์ ๋ ฅ์ผ๋ก ์ฌ์ฉํ์ฌ ๊ตฌํ์ ์คํํ ๋ Cersei๋ฅผ ์ป์ต๋๋ค. ํ์ผ.
์ ๋ ฅ ํ์ผ์ ๋ค์ ํ์ธํ๊ณ ๋ฌด์ธ๊ฐ๋ฅผ ์ฐพ์ผ๋ฉด ์๋ ค์ฃผ์ญ์์ค(๋๋ Lannister/Baratheon ํ์ ๊ทธ๋ํ์ ์ผ๋ถ๋ฅผ ์๋ฎฌ๋ ์ด์ ํ๊ณ ๋๋ฒ๊ทธํ๊ธฐ ๋ ์ฌ์ด ๋ ์์ ๊ทธ๋ํ๋ฅผ ์ฌ์ฉํด ๋ณด์ญ์์ค).
@AlexandruValeanu Joffrey Tommen
์ฝ๋ checkLcas(graphFinder, "Joffrey", "Tommen", Arrays.asList("Robert"));
์์์ ๊ฐ์ด ๋ค๋ฅธ ์ธ์๋ฅผ ๊ฐ์ง ๋์ผํ ์
๋ ฅ ํ์ผ๋ก ์๋ํ์ญ์์ค
@hulk-baba ๋ง์ต๋๋ค. ๊ทธ๋ฐ ๊ฒฝ์ฐ์๋ ์๋ํ์ง ์์ต๋๋ค.
๊ณตํต ์กฐ์ ์ธํธ๋ [Robert, Cersei, Jaime]
์
๋๋ค. ํ์ง๋ง ์ด๋ฐ ์ผ์ด ๋ฐ์ํฉ๋๋ค. ๊ทธ ์ฝ๋ ์กฐ๊ฐ์ ์กฐ์ ์ธํธ์ ์์์ด ์๋ ๋ชจ๋ ๋
ธ๋๋ฅผ ์ ๊ฑฐํฉ๋๋ค. Cersei์์ Robert์ Jaime๊น์ง, ๊ทธ๋ฆฌ๊ณ Robert์์ Cersei๊น์ง ์์ง๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ธ ๊ฐ ๋ชจ๋ ๊ณตํต ์กฐ์ ์งํฉ์์ ์ ๊ฑฐ๋ ์ ์์ต๋๋ค(๊ทธ๋ฆฌ๊ณ ๊ทธ๋ ๊ฒ ๋ ๊ฒ์
๋๋ค). .
๊ทธ๋ํ๊ฐ DAG๊ฐ ์๋๊ธฐ ๋๋ฌธ์ ์ค์ ๊ตฌํ์์๋ ๋ฌธ์ ๊ฐ ๋์ง ์์ต๋๋ค(Robert์ Cersei ์ฌ์ด์ ์ฃผ๊ธฐ๋ Lannister/Baratheon ํ์ ๊ทธ๋ํ์์ ๋ฌธ์ ๋ฅผ ์์ฑํจ).
๊ฐ๋ฅํ ์์ ์ฌํญ:
@AlexandruValeanu ๊ทธ๋์ ์ฐ๋ฆฌ๋ ์ฃผ์ด์ง ๊ทธ๋ํ๊ฐ ์ฌ๋ฐ๋ฅด์ง ์๋ค๊ณ ๊ฐ์ ํ๊ณ Robert
์์ Cersei
๋ก ๊ฐ์ฅ์๋ฆฌ๋ฅผ ์ ๊ฑฐํฉ๋๊น?
ํ์ฌ ์ฝ๋๊ฐ ์ํํ๋ ์ํ ๊ทธ๋ํ์ ๊ฒฝ์ฐ ์ถ๋ ฅ์ด ์์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ํ์ง๋ง Joffrey
๋ฐ Cersei
๋ฅผ ์
๋ ฅํ๋ฉด ์ถ๋ ฅ์ Cersei
์
๋๋ค. Cersei
๋ ์ฃผ๊ธฐ์ ์ผ๋ถ์ด๋ฏ๋ก ํด๋น ๋
ธ๋๊ฐ LCA์ธ์ง ์ฌ๋ถ๋ฅผ ํ์ธํ ์ ์๊ธฐ ๋๋ฌธ์ ๊ทธ๋ ๊ฒ ํด์๋ ์ ๋๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ฐ๋ผ์ ๋ด๊ฐ ์ ์ํ๋ ๊ฒ์ detectCyclesContainingVertex
ํจ์๋ฅผ ํธ์ถํ์ฌ ์
๋ ฅ ๋
ธ๋๊ฐ ์ฃผ๊ธฐ์ ์ผ๋ถ์ธ์ง ์ฌ๋ถ๋ฅผ ํ์ธํ ์ ์์ผ๋ฉฐ ๊ทธ ์ค ํ๋๊ฐ true์ด๋ฉด LCA ์์ด ๋ฐํํ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ์ด๊ฒ์ ๋ด๊ฐ ์๋ฐ์
์ด๋์์ ํ๊ณ ์๋ ๊ฒ์
๋๋ค.
์ ๊ฐ ์ด๊ฒ์ ์๋ชป ์ดํดํ๋ค๋ฉด ์๋ ค์ฃผ์๊ณ ์ฌ๋ฐ๋ฅด๊ฒ ์ดํดํ๋๋ก ๋์์ฃผ์ธ์.
@tibrewalpratik17
ํด๋น pdf์ ๊ทธ๋ํ๋ DAG๊ฐ ์๋๋ฏ๋ก ๊ฐ์ ํ ํ์๊ฐ ์์ต๋๋ค . NaiveLcaFinder
์ ๋ํ ์ ํจํ ์
๋ ฅ์ด ์๋๋๋ค.
์๋ฐ์
์ฑ๋ฆฐ์ง์ ๊ฒฝ์ฐ ๋ ์ด์ ์ฌ์ดํด์ด ํฌํจ๋์ง ์๋๋ก ๊ทธ๋ํ๋ฅผ ์์ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค. CycleDetector
๋ฅผ ์ฌ์ฉํ์ฌ ๊ทธ๋ํ ๋ฒ์ ์ ์ฃผ๊ธฐ๊ฐ ์๋์ง ํ์ธํ ์ ์์ต๋๋ค.
findLcas
์ ๊ตฌํ์ ์ํ ๊ทธ๋ํ๊ฐ ์ฃผ์ด์ก์ ๋ ํฉ๋ฆฌ์ ์ธ ๋๋ต์ ์์ฑํ๊ธฐ ์ํด ์ํ์ ๊ฐ์งํ๊ฑฐ๋ ํ๋ช
ํ ์กฐ์น๋ฅผ ์ทจํ์ง ์์ต๋๋ค(์ฆ, undefined behaviour
). ๋ฐ๋ผ์ ์ ์ ์กฐ๊ฑด์ด ๊นจ์ก๋ค๋ฉด ์ถ๋ ฅ์ ๋ถ์ํ๋ ๊ฒ์ ์๋ฏธ๊ฐ ์์ต๋๋ค.
@AlexandruValeanu ์ข์์... ํ์ง๋ง ์ฌ์ฉ์๊ฐ ์ํ ๊ทธ๋ํ์ ๋ค์ด๊ฐ์ ์ถ๋ ฅ์ ๊ธฐ๋ํ๋ฉด ์ฃผ์ด์ง ๋ ธ๋์ ์ต๊ทผ ์กฐ์ ์ค ํ๋๊ฐ ์ํ์ ๊ด๋ จ๋๊ฑฐ๋ ๋ ธ๋ ์์ฒด์ผ ์ ์๋ ๊ฒฝ์ฐ ์ ํจํ ์ถ๋ ฅ์ด null์ด์ด์ผ ํฉ๋๋ค. ์ค๋ฅธ์ชฝ?
์ฌ์ฉ์๋ ๋๋ต์ ๊ธฐ๋ํด์๋ ์ ๋ฉ๋๋ค. ์ด ๊ฒฝ์ฐ ์ฌ์ฉ์๋ ์ ๋ ฅ์ ๊ฒ์ฆํด์ผ ํฉ๋๋ค. f์ ๋๋ฉ์ธ์ด ์๋๋ผ ์ ๋ ฅ x์ ๋ํด f(x)๊ฐ ๋ฌด์์ธ์ง ๋งํ๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค. ๋๋ต์ null์ด ์๋์ง๋ง ์ ์๋์ง ์์์ต๋๋ค.
@tibrewalpratik17
NaiveLcaFinder
๋ DAG๊ฐ ์ ๋ฌ๋ ๊ฒฝ์ฐ์๋ง ์ฌ๋ฐ๋ฅธ lcas ๋ชฉ๋ก์ ๋ฐํํฉ๋๋ค.
์
๋ ฅ์ด DAG๊ฐ ์๋๋ฉด ์ถ๋ ฅ์ ์ ๋ขฐํ ์ ์์ต๋๋ค. ๋ง ๊ทธ๋๋ก ๋ฌด์์ด๋ ๋ ์ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ ๋ด ๊ตฌํ์ด ์ฃผ๊ธฐ์ ์ผ๋ถ๊ฐ ์๋ lcas๋ง ๋ฐํํ๋ค๊ณ ์๊ฐํ์ง๋ง ๋ต๋ณ์ด undefined
์ธ์ง ํ
์คํธํ์ง ์์๊ธฐ ๋๋ฌธ์ ํ์คํ์ง ์์ต๋๋ค.
๋ฒ๊ทธ๊ฐ ์๋๋ฏ๋ก ๋๊ตฐ๊ฐ ์ด๊ฒ์ ๋ซ์ ์ ์์ต๋๊น?