mirror of
https://github.com/mfocko/blog.git
synced 2024-12-23 12:51:30 +01:00
49 lines
100 KiB
HTML
49 lines
100 KiB
HTML
|
<!doctype html>
|
|||
|
<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-algorithms docs-version-current docs-doc-page docs-doc-id-graphs/iterative-and-iterators" data-has-hydrated="false">
|
|||
|
<head>
|
|||
|
<meta charset="UTF-8">
|
|||
|
<meta name="generator" content="Docusaurus v3.0.0">
|
|||
|
<title data-rh="true">Iterative algorithms via iterators | mf</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://blog.mfocko.xyz/algorithms/graphs/iterative-and-iterators/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-algorithms-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-algorithms-current"><meta data-rh="true" property="og:title" content="Iterative algorithms via iterators | mf"><meta data-rh="true" name="description" content="Iterative DFS using iterators.
|
|||
|
"><meta data-rh="true" property="og:description" content="Iterative DFS using iterators.
|
|||
|
"><link data-rh="true" rel="icon" href="/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://blog.mfocko.xyz/algorithms/graphs/iterative-and-iterators/"><link data-rh="true" rel="alternate" href="https://blog.mfocko.xyz/algorithms/graphs/iterative-and-iterators/" hreflang="en"><link data-rh="true" rel="alternate" href="https://blog.mfocko.xyz/algorithms/graphs/iterative-and-iterators/" hreflang="x-default"><link data-rh="true" rel="preconnect" href="https://0VXRFPR4QF-dsn.algolia.net" crossorigin="anonymous"><link rel="search" type="application/opensearchdescription+xml" title="mf" href="/opensearch.xml">
|
|||
|
|
|||
|
|
|||
|
|
|||
|
<link rel="alternate" type="application/rss+xml" href="/blog/rss.xml" title="mf RSS Feed">
|
|||
|
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="mf Atom Feed">
|
|||
|
<link rel="alternate" type="application/json" href="/blog/feed.json" title="mf JSON Feed">
|
|||
|
|
|||
|
|
|||
|
|
|||
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.13.24/dist/katex.min.css" integrity="sha384-odtC+0UGzzFL/6PNoE8rX/SPcQDXBJ+uRepguP4QkPCm2LBxH3FA3y+fKSiJ+AmM" crossorigin="anonymous"><link rel="stylesheet" href="/assets/css/styles.0f577c26.css">
|
|||
|
<script src="/assets/js/runtime~main.a12e9ebb.js" defer="defer"></script>
|
|||
|
<script src="/assets/js/main.fe64944c.js" defer="defer"></script>
|
|||
|
</head>
|
|||
|
<body class="navigation-with-keyboard">
|
|||
|
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/"><b class="navbar__title text--truncate">mf</b></a><div class="navbar__item dropdown dropdown--hoverable"><a href="#" aria-haspopup="true" aria-expanded="false" role="button" class="navbar__link">Additional FI MU materials</a><ul class="dropdown__menu"><li><a aria-current="page" class="dropdown__link dropdown__link--active" href="/algorithms/">Algorithms</a></li><li><a class="dropdown__link" href="/c/">C</a></li><li><a class="dropdown__link" href="/cpp/">C++</a></li></ul></div><a class="navbar__item navbar__link" href="/contributions/">Contributions</a><a class="navbar__item navbar__link" href="/talks/">Talks</a></div><div class="navbar__items navbar__items--right"><a class="navbar__item navbar__link" href="/blog/">Blog</a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="Switch between dark and light mode (currently light mode)" aria-label="Switch between dark and light mode (currently light mode)" aria-live="polite"><svg viewBox="0 0 24 24" width="24" height="24" class="lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" class="darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search"><span class="DocSearch-Button-Container"><svg width="20" height="20" class="DocSearch-Search-Icon" viewBox="0 0 20 20"><path d="M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.
|
|||
|
<ul>
|
|||
|
<li><a href="/files/algorithms/graphs/iterative-and-iterators.tar.gz" target="_blank" rel="noopener noreferrer">Source code used later on.</a></li>
|
|||
|
</ul>
|
|||
|
<p>As we have talked on the seminar, iterative approach to implementing DFS is not very intuitive and is a very easy way how to create an incorrect implementation.</p>
|
|||
|
<p>On the other hand, we have seen iterative implementation in the exercises and I have also prepared two from which one was similar to recursive implementation without colors from exercises and the other one used features of high-level languages.</p>
|
|||
|
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="different-implementations">Different implementations<a href="#different-implementations" class="hash-link" aria-label="Direct link to Different implementations" title="Direct link to Different implementations"></a></h2>
|
|||
|
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="recursive-dfs-implementation-from-exercises-without-colors">Recursive DFS implementation from exercises without colors<a href="#recursive-dfs-implementation-from-exercises-without-colors" class="hash-link" aria-label="Direct link to Recursive DFS implementation from exercises without colors" title="Direct link to Recursive DFS implementation from exercises without colors"></a></h3>
|
|||
|
<div class="language-ada codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-ada codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm"><span class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token keyword" style="color:rgb(0, 0, 255)">function</span><span class="token plain"> </span><span class="token variable" style="color:rgb(9, 134, 88)">VisitedDFS</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token variable" style="color:rgb(9, 134, 88)">u</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token variable" style="color:rgb(9, 134, 88)">Vertex</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token variable" style="color:rgb(9, 134, 88)">visited</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token variable" style="color:rgb(9, 134, 88)">VertexSet</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">return</span><span class="token plain"> </span><span class="token variable" style="color:rgb(9, 134, 88)">VertexSet</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">is</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"> </span><span class="token variable" style="color:rgb(9, 134, 88)">v</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token variable" style="color:rgb(9, 134, 88)">Vertex</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">begin</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"> </span><span class="token variable" style="color:rgb(9, 134, 88)">visited</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token variable" style="color:rgb(9, 134, 88)">Union</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token variable" style="color:rgb(9, 134, 88)">To_Set</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token variable" style="color:rgb(9, 134, 88)">u</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">for</span><span class="token plain"> </span><span class="token variable" style="color:rgb(9, 134, 88)">v</span
|
|||
|
<p>This implementation is correct, does the DFS traversal as it should, however it has one “smallish” downside and that is the time complexity. The usage of set raises the time complexity, of course it is implementation dependant. However in case of either RB-tree or hash-table implementation, we get look-up in time <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="script">O</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\mathcal{O}(n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em"></span><span class="mord mathcal" style="margin-right:0.02778em">O</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span></span> for hash-table in worst-case or <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="script">O</mi><mo stretchy="false">(</mo><mi>log</mi><mo></mo><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\mathcal{O}(\log n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em"></span><span class="mord mathcal" style="margin-right:0.02778em">O</span><span class="mopen">(</span><span class="mop">lo<span style="margin-right:0.01389em">g</span></span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span></span> for the other in the worst-case. Both are not ideal compared to checking color on vertex.</p>
|
|||
|
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="iterative-dfs-from-the-exercises">Iterative DFS from the exercises<a href="#iterative-dfs-from-the-exercises" class="hash-link" aria-label="Direct link to Iterative DFS from the exercises" title="Direct link to Iterative DFS from the exercises"></a></h3>
|
|||
|
<div class="language-ada codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-ada codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm"><span class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token keyword" style="color:rgb(0, 0, 255)">procedure</span><span class="token plain"> </span><span class="token variable" style="color:rgb(9, 134, 88)">IterDFS</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token variable" style="color:rgb(9, 134, 88)">u</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token variable" style="color:rgb(9, 134, 88)">Vertex</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">is</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"> </span><span class="token variable" style="color:rgb(9, 134, 88)">stack</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token variable" style="color:rgb(9, 134, 88)">StateVector</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"> </span><span class="token variable" style="color:rgb(9, 134, 88)">i</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token variable" style="color:rgb(9, 134, 88)">time</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token variable" style="color:rgb(9, 134, 88)">Integer</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"> </span><span class="token variable" style="color:rgb(9, 134, 88)">v</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token variable" style="color:rgb(9, 134, 88)">Vertex</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">begin</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"> </span><span class="token variable" style="color:rgb(9, 134, 88)">stack</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token variable" style="color:rgb(9, 134, 88)">Append</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token variable" style="color:rgb(9, 134, 88)">VertexState</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token variable" style="color:rgb(9, 134, 88)">u</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token num
|
|||
|
<p>As we can see, there is some ordering in which we search through the successors. Time complexity is OK, stack holds at most all vertices (they must be on the current path).</p>
|
|||
|
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="my-iterative-with-path-in-stack">My iterative with path in stack<a href="#my-iterative-with-path-in-stack" class="hash-link" aria-label="Direct link to My iterative with path in stack" title="Direct link to My iterative with path in stack"></a></h3>
|
|||
|
<div class="language-ada codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-ada codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm"><span class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token keyword" style="color:rgb(0, 0, 255)">procedure</span><span class="token plain"> </span><span class="token variable" style="color:rgb(9, 134, 88)">DFS</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token variable" style="color:rgb(9, 134, 88)">start</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token variable" style="color:rgb(9, 134, 88)">Vertex</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">is</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"> </span><span class="token variable" style="color:rgb(9, 134, 88)">path</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token variable" style="color:rgb(9, 134, 88)">VertexVector</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"> </span><span class="token variable" style="color:rgb(9, 134, 88)">time</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token variable" style="color:rgb(9, 134, 88)">Integer</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"> </span><span class="token variable" style="color:rgb(9, 134, 88)">hasSuccessor</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token variable" style="color:rgb(9, 134, 88)">Bool</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"> </span><span class="token variable" style="color:rgb(9, 134, 88)">successor</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token variable" style="color:rgb(9, 134, 88)">Vertex</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">begin</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"> </span><span class="token variable" style="color:rgb(9, 134, 88)">path</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token variable" style="color:rgb(9, 134, 88)">Append</span><span class="token punctuat
|
|||
|
<p>This approach is similar to the iterative solution from the exercises, but it does not keep the index of the next successor, therefore it always iterates through all of them, which raises the time complexity.</p>
|
|||
|
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="my-iterative-solution-with-iterators">My iterative solution with iterators<a href="#my-iterative-solution-with-iterators" class="hash-link" aria-label="Direct link to My iterative solution with iterators" title="Direct link to My iterative solution with iterators"></a></h3>
|
|||
|
<p>On the other hand, we do not actually have to depend on the representation of the graph. In this case, we just <em>somehow</em> obtain the iterator (which yields all of the succesors) and keep it in the stack.</p>
|
|||
|
<div class="language-ada codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-ada codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm"><span class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token keyword" style="color:rgb(0, 0, 255)">procedure</span><span class="token plain"> </span><span class="token variable" style="color:rgb(9, 134, 88)">DFS</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token variable" style="color:rgb(9, 134, 88)">start</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token variable" style="color:rgb(9, 134, 88)">Vertex</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">is</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"> </span><span class="token variable" style="color:rgb(9, 134, 88)">path</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token variable" style="color:rgb(9, 134, 88)">StateVector</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"> </span><span class="token variable" style="color:rgb(9, 134, 88)">time</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token variable" style="color:rgb(9, 134, 88)">Integer</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"> </span><span class="token variable" style="color:rgb(9, 134, 88)">current</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token variable" style="color:rgb(9, 134, 88)">State</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"> </span><span class="token variable" style="color:rgb(9, 134, 88)">nextVertex</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token variable" style="color:rgb(9, 134, 88)">Vertex</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">begin</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"> </span><span class="token variable" style="color:rgb(9, 134, 88)">path</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token variable" style="color:rgb(9, 134, 88)">Append</span><span class="token punctuation"
|
|||
|
<p>( The way we manipulate with the iterators is closest to the C# implementation. Apart from the <code>Iterator</code> thing :) In case you tried to implement it in C++, you would more than likely need to change the check, since you would get first successor right at the beginning )</p>
|
|||
|
<p>So here we don't keep indices, but the iterators. We can also check existence of other successors easily: by the iterator moving after the last successor.</p>
|
|||
|
<p>Closer explanation of the <em>iterator shenanigans</em> follows. In the beginning, either <code>start</code> or when pushing new vertex, we are pushing an iterator that points <em>just before</em> the first successor. When populating <code>lastVertex</code> and <code>successors</code> in the <code>while</code>-loop, we take the element from the top of the stack. <code>MoveNext</code> returns <code>true</code> if there is an element, i.e. successor in this case. If it returns <code>false</code> we have nothing to do and we pop the vertex from the stack (also set finishing time and color). If we have successor we check if it has been already visited or not. If has not, we set discovery time and color accordingly, also we add it to stack.</p>
|
|||
|
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="implementation">Implementation<a href="#implementation" class="hash-link" aria-label="Direct link to Implementation" title="Direct link to Implementation"></a></h2>
|
|||
|
<p>In case you want to play around with the code. At the beginning there is a link to the C# implementation that can be used. It has a basic representation of graph and includes BFS/DFS implementation in classes.</p>
|
|||
|
<p>In <code>Program.cs</code> you can also find a method that returns graph we used on the seminar.</p></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="theme-doc-footer-tags-row row margin-bottom--sm"><div class="col"><b>Tags:</b><ul class="tags_jXut padding--none margin-left--sm"><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/algorithms/tags/csharp/">csharp</a></li><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/algorithms/tags/graphs/">graphs</a></li><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/algorithms/tags/iterators/">iterators</a></li><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/algorithms/tags/iterative/">iterative</a></li></ul></div></div><div class="theme-doc-footer-edit-meta-row row"><div class="col"><a href="https://github.com/mfocko/blog/tree/main/algorithms/10-graphs/2021-05-18-iterative-and-iterators.md" target="_blank" rel="noopener noreferrer" class="theme-edit-this-page"><svg fill="currentColor" height="20" width="20" viewBox="0 0 40 40" class="iconEdit_Z9Sw" aria-hidden="true"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"></path></g></svg>Edit this page</a></div><div class="col lastUpdated_vwxv"><span class="theme-last-updated">Last updated<!-- --> on <b><time datetime="2021-05-18T00:00:00.000Z">May 18, 2021</time></b></span></div></div></footer></article><nav class="pagination-nav docusaurus-mt-lg" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/algorithms/category/graphs/"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">Graphs</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/algorithms/graphs/bfs-tree/"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">Distance boundaries from BFS tree on undirected graphs</div></a></nav></div></div><div class="col col--3"><div class="tableOfContents_bqdL thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#introduction" class="table-of-contents__link toc-highlight">Introduction</a></li><li><a href="#different-implementations" class="table-of-contents__link toc-highlight">Different implementations</a><ul><li><a href="#recursive-dfs-implementation-from-exercises-without-colors" class="table-of-contents__link toc-highlight">Recursive DFS implementation from exercises without colors</a></li><li><a href="#iterative-dfs-from-the-exercises" class="table-of-contents__link toc-highlight">Iterative DFS from the exercises</a></li><li><a href="#my-iterative-with-path-in-stack" class="table-of-contents__link toc-highlight">My iterative with path in stack</a></li><li><a href="#my-iterative-solution-with-iterators" class="table-of-contents__link toc-highlight">My iterative solution with iterators</a></li></ul></li><li><a href="#implementation" class="table-of-contents__link toc-highlight">Implementation</a></li></ul></div></div></div></div></main></div></div></div><footer class="footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="col footer__col"><div class="footer__title">Git</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://github.com/mfocko" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://gitlab.com/mfocko" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitLab<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07
|
|||
|
</body>
|
|||
|
</html>
|