From 6a83cf8a5d454b26e3048aa4ca73e44eafca0ed3 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Sat, 5 Sep 2020 08:47:59 -0400 Subject: [PATCH 1/2] feat(book/graph): add schedule exercise and solution --- book/D-interview-questions-solutions.asc | 191 ++++++++++++++++++ book/content/part03/graph-search.asc | 143 ++++++++++++- book/images/course-schedule-examples.png | Bin 0 -> 22504 bytes .../critical-connections-sol-examples.png | Bin 0 -> 35639 bytes book/images/critical-path-examples.png | Bin 0 -> 40870 bytes book/interview-questions/course-schedule.js | 61 ++++++ .../course-schedule.spec.js | 54 +++++ .../critical-connections-in-a-network.js | 76 +++++++ .../critical-connections-in-a-network.spec.js | 37 ++++ .../interview-questions/network-delay-time.js | 28 +++ .../network-delay-time.spec.js | 5 + 11 files changed, 587 insertions(+), 8 deletions(-) create mode 100644 book/images/course-schedule-examples.png create mode 100644 book/images/critical-connections-sol-examples.png create mode 100644 book/images/critical-path-examples.png create mode 100644 book/interview-questions/course-schedule.js create mode 100644 book/interview-questions/course-schedule.spec.js create mode 100644 book/interview-questions/critical-connections-in-a-network.js create mode 100644 book/interview-questions/critical-connections-in-a-network.spec.js create mode 100644 book/interview-questions/network-delay-time.js create mode 100644 book/interview-questions/network-delay-time.spec.js diff --git a/book/D-interview-questions-solutions.asc b/book/D-interview-questions-solutions.asc index 180a6222..d7228268 100644 --- a/book/D-interview-questions-solutions.asc +++ b/book/D-interview-questions-solutions.asc @@ -655,3 +655,194 @@ We could also have used a Map and keep track of the indexes, but that's not nece - Time: `O(n)`. We visit each letter once. - Space: `O(W)`, where `W` is the max length of non-repeating characters. The maximum size of the Set gives the space complexity. In the worst-case scenario, all letters are unique (`W = n`), so our space complexity would be `O(n)`. In the avg. case where there are one or more duplicates, it uses less space than `n`, because `W < n`. + + + + + + + +:leveloffset: +1 + +=== Solutions for Graph Questions +(((Interview Questions Solutions, Graph))) + +:leveloffset: -1 + + +[#graph-q-course-schedule] +include::content/part03/graph-search.asc[tag=graph-q-course-schedule] + +Basically, we have to detect if the graph has a cycle or not. +There are multiple ways to detect cycles on a graph using BFS and DFS. + +One of the most straightforward ways to do it is using DFS one each course (node) and traverse their prerequisites (neighbors). If we start in a node, and then we see that node again, we found a cycle! (maybe) + +A critical part of solving this exercise is coming up with good test cases. Let's examine these two: + +[graphviz, course-schedule-examples, png] +.... +digraph G { + subgraph cluster_1 { + a0 -> a1 -> a2 + a0 -> a2 [color=gray] + label = "Example A" + } + + subgraph cluster_2 { + b0 -> b1 -> b2 -> b3 + b3 -> b1 [color=red] + label = "Example B"; + } +} +.... + +Let's say we are using a regular DFS, where we visit the nodes and keep track of visited nodes. If we test the example A, we can get to the course 2 (a2) in two ways. So, we can't blindly assume that "seen" nodes are because of a cycle. To solve this issue, we can keep track of the parent. + +For example B, if we start in course 0 (b0), we can find a cycle. However, the cycle does not involve course 0 (parent). When we visit course 1 (b1) and mark it as the parent, we will see that reach to course 1 (b1) again. Then, we found a cycle! + +[source, javascript] +---- +include::interview-questions/course-schedule.js[tags=brute1] +---- + +We built the graph on the fly as an adjacency list (Map + Arrays). +Then we visited each node, checking if there it has cycles. If none has cyles, then we return true. + +The cycle check uses DFS. We keep track of seen nodes and also who the parent is. If we get to the parent more than once, we have a cycle like examples A and B. + +What's the time complexity? + +We visite every node/vertex: `O(|V|)` and then for every node, we visite all it's edges, so we have `O(|V|*|E|)`. + +Can we do better? + +There's no need to visit nodes more than once. Instead of having a local `seen` variable for each node, we can move it outside the loop. However, it won't be a boolean anymore (seen or not seen). We could see nodes more than once, without being in a cycle (example A). One idea is to have 3 states: `unvisited` (0), `visiting` (1) and `visited` (2). Let's devise the algorithm: + +*Algorithm*: + +* Build a graph as an adjacency list (map + arrays). +* Fill in every prerequisite as an edge on the graph. +* Visit every node and if there's a cycle, return false. +** When we start visiting a node, we mark it as 1 (visiting) +** Visit all its adjacent nodes +** Mark current node as 2 (visited) when we finish visiting neighbors. +** If we see a node in visiting state more than once, it's a cycle! +** If we see a node in a visited state, skip it. + +*Implementation*: + +[source, javascript] +---- +include::interview-questions/course-schedule.js[tags=description;solution] +---- + +In the first line, we initialize the map with the course index and an empty array. +This time the `seen` array is outside the recursion. + +*Complexity Analysis*: + +- Time: `O(|V| + |E|)`. We go through each node and edge only once. +- Space: `O(|V| + |E|)`. The size of the adjacency list. + + + + +// +[#graph-q-critical-connections-in-a-network] +include::content/part03/graph-search.asc[tag=graph-q-critical-connections-in-a-network] + +On idea to find if a path is critical is to remove it. If we visit the graph and see that some nodes are not reachable, then, oops, It was critical! + +We can code precisely that. We can remove one link at a time and check if all other nodes are reachable. It's not very efficient, but it's a start. + +[source, javascript] +---- +include::interview-questions/critical-connections-in-a-network.js[tags=criticalConnectionsBrute1] +---- + +We are using a function `areAllNodesReachable`, which implements a BFS for visiting the graph, but DFS would have worked too. The runtime is `O(|E| + |V|)`, where `E` is the number of edges and `V` the number of nodes/servers. In `criticalConnectionsBrute1`, We are looping through all `connections` (`E`) to remove one connection at a time and then checking if all servers are still reachable with `areAllNodesReachable`. + +The time complexity is `O(|E|^2 * |V|)`. Can we do it on one pass? Sure we can! + +*Tarjan's Strongly Connected Components Algorithms* + +A connection is critical only if it's not part of the cycle. + +In other words, a critical path is like a bridge that connects islands; if you remove it you won't cross from one island to the other. + +Connections that are part of the cycle (blue) have redundancy. If you eliminate one, you can still reach other nodes. Check out the examples below. + +[graphviz, critical-connections-sol-examples, png] +.... +graph G { + subgraph cluster_0 { + a0 -- a1 [color=blue] + a1 -- a2 [color=blue] + a2 -- a0 [color=blue] + a1 -- a3 [color=blue] + a3 -- a2 [color=blue] + label = "Example A"; + } + + subgraph cluster_3 { + b0 -- b1 [color=blue] + b1 -- b2 [color=blue] + b2 -- b0 [color=blue] + b1 -- b3 [color=red] + b3 -- b2 [color=transparent] // removed + label = "Example B"; + } + + subgraph cluster_1 { + c0 -- c1 -- c2 -- c3 [color=red] + label = "Example C"; + } +} +.... + +The red connections are critical; if we remove any, some servers won't be reachable. + +We can solve this problem in one pass using DFS. But for that, we keep track of the nodes that are part of a loop (strongly connected components). To do that, we use the time of visit (or depth in the recursion) each node. + +For example C, if we start on `c0`, it belongs to group 0, then we move c1, c2, and c3, increasing the depth counter. Each one will be on its own group since there's no loop. + +For example B, we can start at `b0`, and then we move to `b1` and `b2`. However, `b2` circles back to `b0`, which is on group 0. We can update the group of `b1` and `b2` to be 0 since they are all connected in a loop. + +For an *undirected graph*, If we found a node on our dfs, that we have previously visited, we found a loop! We can mark all of them with the lowest group number. We know we have a critical path when it's a connection that links two different groups. For example A, they all will belong to group 0, since they are all in a loop. For Example B, we will have `b0`, `b1`, and `b2` on the same group while `b3` will be on a different group. + +*Algorithm*: + +* Build the graph as an adjacency list (map + array) +* Run dfs on any node. E.g. `0`. +** Keep track of the nodes that you have seen using `group` array. But instead of marking them as seen or not. Let's mark it with the `depth`. +** Visit all the adjacent nodes that are NOT the parent. +** If we see a node that we have visited yet, do a dfs on it and increase the depth. +** If the adjacent node has a lower grouping number, update the current node with it. +** If the adjacent node has a higher grouping number, then we found a critical path. + +*Implementation*: + +[source, javascript] +---- +include::interview-questions/critical-connections-in-a-network.js[tags=description;solution] +---- + +This algorithm only works with DFS. + +*Complexity Analysis*: + +- Time: `O(|E| + |V|)`. We visit each node and edge only once. +- Space: `O(|E| + |V|)`. The graph has all the edges and nodes. Additionally, we use the `group` variable with a size of `|V|`. + + + + + + + +// + + + + diff --git a/book/content/part03/graph-search.asc b/book/content/part03/graph-search.asc index 48bf5308..08356768 100644 --- a/book/content/part03/graph-search.asc +++ b/book/content/part03/graph-search.asc @@ -7,9 +7,9 @@ endif::[] Graph search allows you to visit search elements. -WARNING: Graph search is very similar to <>. So, if you read that sections some of the concepts here will be familiar to you. +WARNING: Graph search is very similar to <>. So, if you read that section, some of the concepts here will be familiar to you. -There are two ways to navigate the graph, one is using Depth-First Search (DFS) and the other one is Breadth-First Search (BFS). Let's see the difference using the following graph. +There are two ways to navigate the graph, one is using Depth-First Search (DFS), and the other one is Breadth-First Search (BFS). Let's see the difference using the following graph. image::directed-graph.png[directed graph] @@ -44,10 +44,10 @@ image::directed-graph.png[directed graph] ==== Depth-First Search for Graphs -With Depth-First Search (DFS) we go deep before going wide. +With Depth-First Search (DFS), we go deep before going wide. Let's say that we use DFS on the graph shown above, starting with node `0`. -A DFS, will probably visit 5, then visit `1` and continue going down `3` and `2`. As you can see, we need to keep track of visited nodes, since in graphs we can have cycles like `1-3-2`. +A DFS will probably visit 5, then visit `1` and continue going down `3` and `2`. As you can see, we need to keep track of visited nodes, since in graphs, we can have cycles like `1-3-2`. Finally, we back up to the remaining node `0` children: node `4`. So, DFS would visit the graph: `[0, 5, 1, 3, 2, 4]`. @@ -56,13 +56,13 @@ So, DFS would visit the graph: `[0, 5, 1, 3, 2, 4]`. ==== Breadth-First Search for Graphs -With Breadth-First Search (BFS) we go wide before going deep. +With Breadth-First Search (BFS), we go wide before going deep. // TODO: BFS traversal Let's say that we use BFS on the graph shown above, starting with the same node `0`. -A BFS, will visit 5 as well, then visit `1` and will not go down to it's children. +A BFS will visit 5 as well, then visit `1` and not go down to its children. It will first finish all the children of node `0`, so it will visit node `4`. -After all the children of node `0` are visited it continue with all the children of node `5`, `1` and `4`. +After all the children of node `0` are visited, it will continue with all the children of node `5`, `1`, and `4`. In summary, BFS would visit the graph: `[0, 5, 1, 4, 3, 2]` @@ -86,4 +86,131 @@ You might wonder what the difference between search algorithms in a tree and a g The difference between searching a tree and a graph is that the tree always has a starting point (root node). However, in a graph, you can start searching anywhere. There's no root. -NOTE: Every tree is a graph, but not every graph is a tree. +NOTE: Every tree is a graph, but not every graph is a tree. Only acyclic directed graphs (DAG) are trees. + + +==== Practice Questions +(((Interview Questions, graph))) + + + + +// tag::graph-q-course-schedule[] +===== Course Schedule + +*gr-1*) _Check if it's possible to take a number of courses while satisfying their prerequisites._ + +// end::graph-q-course-schedule[] + +// _Seen in interviews at: Amazon, Facebook, Bytedance (TikTok)._ + + +*Starter code*: + +[source, javascript] +---- +include::../../interview-questions/course-schedule.js[tags=description;placeholder] +---- + + +*Examples*: + +[source, javascript] +---- +canFinish(2, [[1, 0]]); // true +// 2 courses: 0 and 1. One prerequisite: 0 -> 1 +// To take course 1 you need to take course 0. +// Course 0 has no prerequisite, so you can take 0 and then 1. + +canFinish(2, [[1, 0], [0, 1]]); // false +// 2 courses: 0 and 1. Two prerequisites: 0 -> 1 and 1 -> 0. +// To take course 1, you need to take course 0. +// To Course 0, you need course 1, so you can't any take them! + +canFinish(3, [[2, 0], [1, 0], [2, 1]]); // true +// 3 courses: 0, 1, 2. Three prerequisites: 0 -> 2 and 0 -> 1 -> 2 +// To take course 2 you need course 0, course 0 has no prerequisite. +// So you can take course 0 first, then course 1, and finally course 2. + +canFinish(4, [[1, 0], [2, 1], [3, 2], [1, 3]]); // false +// 4 courses: 0, 1, 2, 3. Prerequisites: 0 -> 1 -> 2 -> 3 and 3 -> 1. +// You can take course 0 first since it has no prerequisite. +// For taking course 1, you need course 3. However, for taking course 3 +// you need 2 and 1. You can't finish then! +---- + + +_Solution: <>_ + + + + + + + +// tag::graph-q-critical-connections-in-a-network[] +===== Critical Network Paths + +*gr-2*) _Given `n` servers and the connections between them, return the critical paths._ + +// end::graph-q-critical-connections-in-a-network[] + +// _Seen in interviews at: Amazon, Google._ + +Examples: + +[graphviz, critical-path-examples, png] +.... +graph G { + subgraph cluster_1 { + a0 -- a1 -- a2 [color=firebrick1] + label = "Example A"; + } + + subgraph cluster_0 { + b0 -- b1 [color=blue] + b1 -- b2 [color=blue] + b2 -- b0 [color=blue] + b1 -- b3 [color=blue] + b3 -- b2 [color=blue] + label = "Example B"; + b0, b1, b2, b3 [color=midnightblue] + } + + subgraph cluster_3 { + c0 -- c1 [color=blue] + c1 -- c2 [color=blue] + c2 -- c0 [color=blue] + c1 -- c3 [color=firebrick1] + c3 -- c2 [color=transparent] // removed + label = "Example C"; + c0, c1, c2 [color=midnightblue] + // c3 [color=red] + } +} +.... + +[source, javascript] +---- +// Example A +criticalConnections(3, [[0, 1], [1, 2]]);// [[0, 1], [1, 2]] +// if you remove any link, there will be stranded servers. + +// Example B +criticalConnections(4, [[0, 1], [1, 2], [2, 0], [1, 3], [3, 2]]);// [] +// you can remove any connection and all servers will be reachable. + +// Example C +criticalConnections(4, [[0, 1], [1, 2], [2, 0], [1, 3]]); // [[1, 3]] +// if you remove [1, 3], then server 3 won't be reachable. +// If you remove any other link. It will be fine. +---- + +Starter code: + +[source, javascript] +---- +include::../../interview-questions/critical-connections-in-a-network.js[tags=description;placeholder] +---- + +_Solution: <>_ diff --git a/book/images/course-schedule-examples.png b/book/images/course-schedule-examples.png new file mode 100644 index 0000000000000000000000000000000000000000..348fe3de7a232c03bd2ebc49c263b43e2b5accfb GIT binary patch literal 22504 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 literal 0 HcmV?d00001 diff --git a/book/images/critical-connections-sol-examples.png b/book/images/critical-connections-sol-examples.png new file mode 100644 index 0000000000000000000000000000000000000000..eb3e568f4303b57b49aa362e4ce237f7d4c9066d GIT binary patch literal 35639 zcmbrm2VBqZ-!}Y>XlQS3l}fv`G=#oQ?Wh!5N;HH@X)g_wBrPfpNt>jl9YVAu4H~pm zilW_p^!s1e^*qmgU)Oct&+GpDUcVQ<<1^0leZJqv`#6sC8)ammMNP?0NgxoYb+m~l z1OiDf{?8`ghF7?(vOMs|PP?O8M8f9Qe;F@w;|T;_f)4TUG4FfRgFd`>`ZpEl{<7V0 zdZJ*T$07cBH}TEwXCD2}GOBc)I=p_El?i{GIbVJ5vS_-8Rrax}&S1sX%IAYm+PKR2EpHWWUh)v$=D0md1k%HF z=OP%SLwLy>jQBL^NcXVmHsd`~^(eN(bYV8a^!(%@bX0ro@VSrdWiN2KmV(vu!0 zzxKcTl3ux0`a$nGn@g9T+&XeN?EGMr=iR$^XKEAf-Se9pI(%>Ru$1k&bCqs`RXi_# zOie|fmD0W*)BoLfkb_=GNGLZu+he~#n0H)U-173W+EoQLH8mL-h7aC!df9kOMJoEn z4KZQidU5Ws;x4b{(|eUJ^l)ZSqL!Xb$!TiWL7@4d#>nIwb!5N&x)j> zWpqPC(o_8Z)pOoRA`VnvxnL5Jrs}JyZFA~*;ATL;qpGSZi-hF+_x1VW#Kgo(MCi^w zI$>3|ns0RMn5?`!9+5ZkZHvfIntI`%7v0^*3=IucRbQNbaWyY5PdZue?Ah_nwQ)5b zwSeaAwV(9ykNacXM#qTZ|>|KT8;DjTgG` zrKX|8Vj#oOb$-1#v#M(4&rCmIXms>x!1`4xyB6~E&w5f)Q$H13UvO~v`251x-rn9f zZ{8FX6sSkg95**FwkWl0&p52FudiDC-FKoh?2(h38_lj=`=zCWH{ZUF6nJ2gS6*KJ zDwc;V=+>=UFJEeA@*n9d_59JZzWSGpjO=Is^9vL0511&!HM4H=sBPft@q+pcr(a|y zMT&}ww!M278ME!emDz!~gap-#Bcz0T%2y1ut!qeczjt(Ps;?&y&O1BjKYkn;lXEot z@y9Q<{?%80eu?APk~r}syUps1jL(mr!p3~dGKSJ;&pe%+ggcDsMi(Z#($dl#9UV0_ zHTUk_D=jTe)C${u&aFrO%L`vJLP|;sJ3Bk^RVT$hmuHMZ2C@nYn-dqQjvhVA9V;Z- zKNB%jb)<~pB1cb8kN6d;u@C9AgqWBZ@#14{9F=1wA=HldJU}RK|sVpn=Se*K}eJ9ne#KceC-S_02d)_8WDzEE^iio&< zshJ!eCLx?YeVX9DvM|ZLHbzWYkac#Jlar&Mpm=*%-1OM7Z`K)flAZ16W4Tqg5%~GD z(l)EAW>(++=5oKdbxii`QERMIn|rbU?EA8fUYtAO&Yc@KZz7z$RZjc+zo@KSZn@5C zbCanY4_ww^M)p>ul!<7kA&OHTZKcs!^?hXqNC#lcYiGOIA zzA@6WOFp&jC!6!9B3J)ArKP2}Z{N`vg4QZfQ%fuNdz~1| zkKFWt%nqlHjt&=jWnAF>dxOJ=_w3u3H~RG@W|@9`K&Aae0)`_iF5pqPAG32XJcbKS$Rq0)>ju_rI}c+=f1BV=-TF=J9mzxK3>RB zY5k_BUXY58JD=O-EU$M-(yo1JuSQSR`Xzt8)YjI<&CQ*vaKUYTwk=g*W@g5!P9|`} z@4$h|$B!T1HD7Y&;o=(nMH$*a2wGZNx@*3$us}scWtrGiN3lB6a{aFP>AC=F!poO0 z3)Q-+W|r0a=H}+^nny=R3p2fW9mlV{bbQWR#niN`q@?8T=KFgG7zuxVe*HRcd@ABH zpJv+%mSt(_Jk~Lmicp;PQ^&URPEHd;y%LS`^jT)3LL<2t+KKI_1P-M!O&(?RD=I3o zDtC#Bj($>JE+HvNOHS^zKHHsV%A?}lzQSy8KZ-kf_wJqi_p;jYjKadfF=j38>d*<8vt|2$1rG5EXw>djD#=^|J_{loZbN)~q-{-=YvDtWY z@JhI@Fl*Y5KUgGQ*0{ZjD?d-0m~?)Ade-60#`xQ;$B(D#gSVR(pB5Ju9hzxYR&my+mX97iD)Y&?@U<4Pf@ocn{LrJwNwaC@U2Q7) z^y$+;+5R;wcNcjp9i6N^xr)f@R zDo?q8|CFU=-;Ynl;Yy~3r|hKob_PYz@|YbzzMGxB$f9%v15@}lMc&o&(4l%P*e`W~ zUk3)>jn30>DUlLXxQoXZ?A^` zaoPkUbMuJf0*i}_C>i3L`i6#QOD%8@Ujw)QZcCBN$E$5^18SRVPXjkM)KXaeu)?XS zsYONe<%=aP%g6~5r)wgIW7Wm-&iBv=2nZ1B9~oy=`SR{T-n~Y(`-%VRA1rx)wX>6h z)mQfH+4J=52W}+~rw;)!f1>R8+zKB)bbNVZHwKdXpx;su$#y<|{u5$%uV3G_*&ra3 z>~i6P^~sZ*Y-|>0W@hH*e}@{jQ;qN3Cn|~pb>P5(Wd#3+G}TnKz}lJ`KO>{|*n@Sr zTJUxw0s`M+)i!!Dov{yj(hgj99BvH%TKE2pj8-i7spH2HIN={- z`IQ7}Pt+lME-e2Z{~EZt-Wa}1Nl9t2PfLrat)9QUx_Y6n?A+%k4yp34S2s8O)z#H) zZHE#5$Tl}_+%UMWgp+icJ$IY2m2)0h{qewcZoIkRWaX3Z30V4ff1a)l3Lc8q0aBD5K z1kal+WxFjwcjjY$;{E%BqpxC@f9~A5vwUCj=2ah`kpN`2>uRb1Sw=2?orwavr}*V=N?7B8C-j9g-c!ylm=iA~D(7AKN4UZ&Bg@9!grq zR$N9nAi*UhBzSsy;@Qi~5qfuZb8feu!8`0XHM2TipONXXDeBRS_+)=u2Hz~MI~@Ug@5Z9#li^>5624S;?WR{KPQ_~TYE6R z^^8n1fJ&C;O%o%ddLhSbQJfw%Q)d7EuCA`9PoDhx^{X~uy>HSOYXGQ<=b&H3g9m#; z8>AEzayy(9iK6qkMO+nF<337ka`N*0=qpL%{o_YDDJdJ7WU8G_-Q6Bb zbHf4*6zNIflzZ(6K?4H=D19$mTJ{PE+(}3<7QSQKbWNI#N>Z{Ik&XI!4)`lCZ=bNR zkuZ~nMhg-O@YC4X80y>Y+YBt%TkJ}Ks{W3(r6L`gA3J6we5WHztG~bBFiqw2z`#kF z4YTI=NRoE;_CE)!S$TLi|IAo1M9JFJ6LyA5pXdw=}+F()SnlZashvf90SHn$Q8B5yu?2>dA>6|fnC<(oo8UESu?$9%0A&dKTN8k>e~c%nTU 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 IhRzZH2Wo5Jk^lez literal 0 HcmV?d00001 diff --git a/book/images/critical-path-examples.png b/book/images/critical-path-examples.png new file mode 100644 index 0000000000000000000000000000000000000000..63b0e330e430fa49e294f765cded36b4cbff8158 GIT binary patch literal 40870 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�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 N@O1TaS?83{1OUm0Kpp@9 literal 0 HcmV?d00001 diff --git a/book/interview-questions/course-schedule.js b/book/interview-questions/course-schedule.js new file mode 100644 index 00000000..c3e8b354 --- /dev/null +++ b/book/interview-questions/course-schedule.js @@ -0,0 +1,61 @@ +// tag::description[] +/** + * Check if you can finish all courses with their prerequisites. + * @param {number} n - The number of courses + * @param {[number, number][]} prerequisites - Array of courses pairs. + * E.g. [[200, 101]], to take course 202 you need course 101 first. + * @returns {boolean} - True = can finish all courses, False otherwise + */ +function canFinish(n, prerequisites) { + // end::description[] + // tag::placeholder[] + // write your code here... + // end::placeholder[] + // tag::solution[] + const graph = new Map(Array(n).fill().map((_, i) => ([i, []]))); + prerequisites.forEach(([u, v]) => graph.get(v).push(u)); + + const seen = []; + const hasCycle = (node) => { + if (seen[node] === 1) return true; // if visiting, it's a cycle! + if (seen[node] === 2) return false; // if visited, skip it. + + seen[node] = 1; // mark as visiting. + for (const adj of graph.get(node)) if (hasCycle(adj)) return true; + seen[node] = 2; // mark as visited. + return false; + }; + + for (let i = 0; i < n; i++) if (hasCycle(i)) return false; + return true; + // end::solution[] + // tag::description[] +} +// end::description[] + + +// tag::brute1[] +function canFinishBrute1(n, prerequisites) { + const graph = new Map(); // inialize adjacency list as map of arrays + for (let i = 0; i < n; i++) graph.set(i, []); // build nodes + prerequisites.forEach(([u, v]) => graph.get(v).push(u)); // edges + + const hasCycles = (node, parent = node, seen = []) => { + for (const next of graph.get(node)) { + if (next === parent) return true; + if (seen[next]) continue; + seen[next] = true; + if (hasCycles(next, parent, seen)) return true; + } + return false; + }; + + for (let i = 0; i < n; i++) { + if (hasCycles(i)) return false; + } + + return true; +} +// end::brute1[] + +module.exports = { canFinish, canFinishBrute1 }; diff --git a/book/interview-questions/course-schedule.spec.js b/book/interview-questions/course-schedule.spec.js new file mode 100644 index 00000000..61bb9a5f --- /dev/null +++ b/book/interview-questions/course-schedule.spec.js @@ -0,0 +1,54 @@ +const { canFinish, canFinishBrute1 } = require('./course-schedule'); +// const { } = require('../../src/index'); + +[canFinish, canFinishBrute1].forEach((fn) => { + describe(`TOPIC: ${fn.name}`, () => { + it('should work with null/empty', () => { + const actual = []; + const expected = true; + expect(fn(0, actual)).toEqual(expected); + }); + + it('should work basic case', () => { + const actual = [[1, 0]]; + const courses = 2; + const expected = true; + expect(fn(courses, actual)).toEqual(expected); + }); + + it('should detect cycle', () => { + const actual = [[0, 1], [1, 0]]; + const courses = 2; + const expected = false; + expect(fn(courses, actual)).toEqual(expected); + }); + + it('multiple links to a node without cycle', () => { + const actual = [[2, 1], [1, 0], [2, 0]]; + const courses = 3; + const expected = true; + expect(fn(courses, actual)).toEqual(expected); + }); + + it('multiple links to a node without cycle (different order)', () => { + const actual = [[2, 0], [1, 0], [2, 1]]; + const courses = 3; + const expected = true; + expect(fn(courses, actual)).toEqual(expected); + }); + + it('indirect cycle', () => { + const actual = [[1, 0], [2, 1], [0, 2]]; + const courses = 3; + const expected = false; + expect(fn(courses, actual)).toEqual(expected); + }); + + it('indirect cycle with nodes without indegrees', () => { + const actual = [[1, 0], [2, 1], [3, 2], [1, 3]]; + const courses = 4; + const expected = false; + expect(fn(courses, actual)).toEqual(expected); + }); + }); +}); diff --git a/book/interview-questions/critical-connections-in-a-network.js b/book/interview-questions/critical-connections-in-a-network.js new file mode 100644 index 00000000..bd7bfe37 --- /dev/null +++ b/book/interview-questions/critical-connections-in-a-network.js @@ -0,0 +1,76 @@ +const { Queue } = require('../../src/index'); + +// tag::description[] +function criticalConnections(n, connections) { + // end::description[] + // tag::placeholder[] + // write your code here... + // end::placeholder[] + // tag::solution[] + const critical = []; + const graph = new Map(Array(n).fill(0).map((_, i) => [i, []])); + connections.forEach(([u, v]) => { + graph.get(u).push(v); + graph.get(v).push(u); + }); + + const dfs = (node, parent = null, depth = 0, group = []) => { + group[node] = depth; + for (const adj of (graph.get(node) || [])) { + if (adj === parent) continue; // skip parent node + if (group[adj] === undefined) dfs(adj, node, depth + 1, group); + group[node] = Math.min(group[node], group[adj]); // update group. + if (group[adj] >= depth + 1) critical.push([node, adj]); + } + }; + + dfs(0); + return critical; + // end::solution[] + // tag::description[] +} +// end::description[] + +// tag::criticalConnectionsBrute1[] +function areAllNodesReachable(n, graph) { + const seen = Array(n).fill(false); + const queue = new Queue([0]); + + while (queue.size) { + const node = queue.dequeue(); + if (seen[node]) continue; + seen[node] = true; + + for (const adj of (graph.get(node) || [])) { + queue.enqueue(adj); + } + } + + return !seen.some((s) => !s); +} + +function criticalConnectionsBrute1(n, connections) { + const critical = []; + const graph = new Map(Array(n).fill(0).map((_, i) => [i, []])); + connections.forEach(([u, v]) => { + graph.get(u).push(v); + graph.get(v).push(u); + }); + + for (const [u, v] of connections) { + // remove edge + graph.set(u, (graph.get(u) || []).filter((e) => e !== v)); + graph.set(v, (graph.get(v) || []).filter((e) => e !== u)); + + if (!areAllNodesReachable(n, graph)) critical.push([u, v]); + + // add it back + graph.get(u).push(v); + graph.get(v).push(u); + } + + return critical; +} +// end::criticalConnectionsBrute1[] + +module.exports = { criticalConnections, criticalConnectionsBrute1 }; diff --git a/book/interview-questions/critical-connections-in-a-network.spec.js b/book/interview-questions/critical-connections-in-a-network.spec.js new file mode 100644 index 00000000..003374d7 --- /dev/null +++ b/book/interview-questions/critical-connections-in-a-network.spec.js @@ -0,0 +1,37 @@ +const { criticalConnections, criticalConnectionsBrute1 } = require('./critical-connections-in-a-network'); +// const { } = require('../../src/index'); + +[criticalConnections, criticalConnectionsBrute1].forEach((fn) => { + describe(`Graph: ${fn.name}`, () => { + it('should work with null/empty', () => { + const actual = fn(0, []); + const expected = []; + expect(actual).toEqual(expected); + }); + + it('should work with critical path', () => { + const actual = fn(4, [[0, 1], [1, 2], [2, 0], [1, 3]]); + const expected = [[1, 3]]; + expect(actual).toEqual(expected); + }); + + it('should work without critical path', () => { + const actual = fn(4, [[0, 1], [1, 2], [2, 0], [1, 3], [3, 2]]); + const expected = []; + expect(actual).toEqual(expected); + }); + + it('should work with other case', () => { + const actual = fn(3, [[0, 1], [1, 2]]); + const expected = [[0, 1], [1, 2]]; + expect(actual).toEqual(expect.arrayContaining(expected)); + }); + + + it('should work with 2 SCC', () => { + const actual = fn(6, [[0, 1], [1, 2], [2, 0], [1, 3], [3, 4], [4, 5], [5, 3]]); + const expected = [[1, 3]]; + expect(actual).toEqual(expected); + }); + }); +}); diff --git a/book/interview-questions/network-delay-time.js b/book/interview-questions/network-delay-time.js new file mode 100644 index 00000000..99f8c108 --- /dev/null +++ b/book/interview-questions/network-delay-time.js @@ -0,0 +1,28 @@ +// https://leetcode.com/problems/network-delay-time/solution/ +function networkDelayTime(times: number[][], N: number, K: number): number { + const graph = new Map(Array(N).fill(0).map((_, i) => [i + 1, []])); + times.forEach(([u, v, w]) => graph.get(u)?.push([v, w])); + + const queue = new Queue([[K, 0]]); + const seen = Array(N + 1).fill(Infinity); + + while (queue.size()) { + const [node, dist] = queue.dequeue(); + seen[node] = Math.min(seen[node], dist); + + for (const [adj, w] of graph.get(node) || []) { + if (seen[adj] > dist + w) queue.enqueue([adj, dist + w]); + } + } + + const max = Math.max(...seen.slice(1)); + return max === Infinity ? -1 : max; +}; + +/* +[[2,1,1],[2,3,1],[3,4,1]] +4 +2 + + +*/ diff --git a/book/interview-questions/network-delay-time.spec.js b/book/interview-questions/network-delay-time.spec.js new file mode 100644 index 00000000..c56ff203 --- /dev/null +++ b/book/interview-questions/network-delay-time.spec.js @@ -0,0 +1,5 @@ +describe('', () => { + it('', () => { + + }); +}); From f248e4276fa32cbf3b93140f77f0010c596a4d71 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Mon, 7 Sep 2020 20:41:50 +0000 Subject: [PATCH 2/2] :bookmark: chore(release): 1.18.0 # [1.18.0](https://github.com/amejiarosario/dsa.js/compare/1.17.0...1.18.0) (2020-09-07) ### Features * **book/graph:** add schedule exercise and solution ([6a83cf8](https://github.com/amejiarosario/dsa.js/commit/6a83cf8a5d454b26e3048aa4ca73e44eafca0ed3)) --- CHANGELOG.md | 7 +++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4bd0eb14..e48741f9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [1.18.0](https://github.com/amejiarosario/dsa.js/compare/1.17.0...1.18.0) (2020-09-07) + + +### Features + +* **book/graph:** add schedule exercise and solution ([6a83cf8](https://github.com/amejiarosario/dsa.js/commit/6a83cf8a5d454b26e3048aa4ca73e44eafca0ed3)) + # [1.17.0](https://github.com/amejiarosario/dsa.js/compare/1.16.0...1.17.0) (2020-09-04) diff --git a/package-lock.json b/package-lock.json index 7d5d9509..bf7a41de 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "1.17.0", + "version": "1.18.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index feaa51db..5e130a84 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dsa.js", - "version": "1.17.0", + "version": "1.18.0", "description": "Data Structures & Algorithms in JS", "author": "Adrian Mejia (https://adrianmejia.com)", "homepage": "https://github.com/amejiarosario/dsa.js",