Skip to content

Commit 51c5cfb

Browse files
spadarjauhienegonSchiele
authored andcommitted
Add Elixir example for greedy algorithms
1 parent 434fb62 commit 51c5cfb

File tree

1 file changed

+48
-0
lines changed

1 file changed

+48
-0
lines changed
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
defmodule SetCovering do
2+
def find_stations(states_needed, stations) do
3+
stations_list = for station <- stations, do: station
4+
do_find_stations(states_needed, MapSet.new(), stations_list)
5+
end
6+
7+
defp do_find_stations(states_needed, final_stations, stations) do
8+
cond do
9+
MapSet.size(states_needed) == 0 ->
10+
final_stations
11+
12+
true ->
13+
{station, states_covered} = find_best_station(states_needed, stations)
14+
15+
do_find_stations(
16+
MapSet.difference(states_needed, states_covered),
17+
MapSet.put(final_stations, station),
18+
stations
19+
)
20+
end
21+
end
22+
23+
defp find_best_station(states_needed, [{station_name, station_states} | []]) do
24+
{station_name, MapSet.intersection(states_needed, station_states)}
25+
end
26+
27+
defp find_best_station(states_needed, [{station_name, station_states} | tail]) do
28+
(best_station = {_, best_states_covered}) = find_best_station(states_needed, tail)
29+
30+
states_covered = MapSet.intersection(states_needed, station_states)
31+
32+
if MapSet.size(states_covered) > MapSet.size(best_states_covered),
33+
do: {station_name, states_covered},
34+
else: best_station
35+
end
36+
end
37+
38+
states_needed = MapSet.new(["mt", "wa", "or", "id", "nv", "ut", "ca", "az"])
39+
40+
stations = %{
41+
"kone" => MapSet.new(["id", "nv", "ut"]),
42+
"ktwo" => MapSet.new(["wa", "id", "mt"]),
43+
"kthree" => MapSet.new(["or", "nv", "ca"]),
44+
"kfour" => MapSet.new(["nv", "ut"]),
45+
"kfive" => MapSet.new(["ca", "az"])
46+
}
47+
48+
IO.inspect(SetCovering.find_stations(states_needed, stations))

0 commit comments

Comments
 (0)