Skip to content

Commit 21e58e1

Browse files
committed
Add Elixir BFS and DFS
0 parents  commit 21e58e1

File tree

4 files changed

+111
-0
lines changed

4 files changed

+111
-0
lines changed

elixir/bfs.ex

+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
defmodule Bfs do
2+
@moduledoc """
3+
Breadth First Search
4+
"""
5+
6+
@type t :: Keyword.t
7+
@type n :: non_neg_integer
8+
9+
@doc """
10+
Visit all nodes in breadth first order and return a list of the nodes in the
11+
order they were visited.
12+
13+
## Examples
14+
15+
iex> Bfs.visit(1, [{1,[2,3]}, {2,[1]}, {3,[1]}])
16+
[1,2,3]
17+
18+
"""
19+
@spec visit(n, t) :: t
20+
def visit(start, nodes) do
21+
visit(start, nodes, [])
22+
end
23+
24+
defp visit(node, nodes, visited) do
25+
visit_frontier([node], nodes, visited)
26+
end
27+
28+
defp visit_frontier([]=_, _, visited) do
29+
visited
30+
end
31+
32+
defp visit_frontier([_|_]=frontier, nodes, visited) do
33+
v = visited ++ frontier
34+
x = Enum.filter(frontier_adj(frontier, nodes), fn(n) ->
35+
!Enum.member?(visited, n)
36+
end)
37+
visit_frontier(x, nodes, v)
38+
end
39+
40+
defp frontier_adj(frontier, nodes) do
41+
Enum.reduce(frontier, [], fn(n, acc) ->
42+
acc ++ nodes[n]
43+
end)
44+
end
45+
end

elixir/bfs_test.exs

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
# To run: `elixirc bfs.ex && elixir bfs_test.exs`
2+
IO.inspect(Bfs.visit(1, [
3+
{1, [2, 3, 4]},
4+
{2, [1, 5, 6]},
5+
{3, [1]},
6+
{4, [1, 7, 8]},
7+
{5, [2, 9, 10]},
8+
{6, [2]},
9+
{7, [4, 11, 12]},
10+
{8, [4]},
11+
{9, [5]},
12+
{10, [5]},
13+
{11, [7]},
14+
{12, [7]}
15+
]))

elixir/dfs.ex

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
defmodule Dfs do
2+
@moduledoc """
3+
Depth First Search
4+
"""
5+
6+
@type t :: Keyword.t
7+
@type n :: non_neg_integer
8+
9+
@doc """
10+
Visit all nodes in depth first order and return a list of the nodes in the
11+
order they were visited.
12+
13+
## Examples
14+
15+
iex> Dfs.visit(1, [{1,[2,3]}, {2,[1]}, {3,[1]}])
16+
[1,2,3]
17+
18+
"""
19+
@spec visit(n, t) :: t
20+
def visit(start, nodes) do
21+
visit(start, nodes, [])
22+
end
23+
24+
defp visit(node, nodes, visited) do
25+
Enum.reduce(nodes[node], visited ++ [node], fn(n, acc) ->
26+
visit_recur(n, nodes, acc)
27+
end)
28+
end
29+
30+
defp visit_recur(node, nodes, visited) do
31+
case Enum.member?(visited, node) do
32+
true -> visited
33+
false -> visit(node, nodes, visited)
34+
end
35+
end
36+
end

elixir/dfs_test.exs

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
# To run: `elixirc dfs.ex && elixir dfs_test.exs`
2+
IO.inspect(Dfs.visit(1, [
3+
{1, [2, 7, 8]},
4+
{2, [1, 3, 6]},
5+
{3, [2, 4, 5]},
6+
{4, [3]},
7+
{5, [3]},
8+
{6, [2]},
9+
{7, [1]},
10+
{8, [1, 9, 12]},
11+
{9, [8, 10, 11]},
12+
{10, [9]},
13+
{11, [9]},
14+
{12, [8]}
15+
]))

0 commit comments

Comments
 (0)