From 96783f8e36e930892870fee60500dde0a7090aea Mon Sep 17 00:00:00 2001 From: Robert Hodel Date: Mon, 25 Mar 2019 09:01:17 -0700 Subject: [PATCH 1/5] Added 8-4-Power-Set.cpp --- .../8-4-Power-Set.cpp | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 chapter-8-recursion-and-Dynamic-Programming/8-4-Power-Set.cpp diff --git a/chapter-8-recursion-and-Dynamic-Programming/8-4-Power-Set.cpp b/chapter-8-recursion-and-Dynamic-Programming/8-4-Power-Set.cpp new file mode 100644 index 0000000..3c13803 --- /dev/null +++ b/chapter-8-recursion-and-Dynamic-Programming/8-4-Power-Set.cpp @@ -0,0 +1,47 @@ +#include +#include +#include + +std::set> subsets; + +void print(const std::vector& vec) { + for (const auto& i : vec) { + std::cout << i << " "; + } +} + +void findSubsets(const std::vector& set) { + + subsets.emplace(set); + + if (set.size() == 2) { + subsets.emplace(std::vector{set[0]}); + subsets.emplace(std::vector{set[1]}); + return; + } + + + + for (int i = 0; i < set.size(); ++i) { + std::vector newSubset; + for (int j = 0; j < set.size() - 1; ++j) { + newSubset.push_back(set[(i + j) % set.size()]); + } + findSubsets(newSubset); + } + +} + +int main(int argc, char** argv) { + std::vector vec{ 0, 1, 2, 3 }; + findSubsets(vec); + + for (const auto& set : subsets) { + print(set); + std::cout << std::endl; + } + + std::cin.get(); + + return 0; +} \ No newline at end of file From 219660127dc2fc8ce549456dc7bb51110ac53dc0 Mon Sep 17 00:00:00 2001 From: Robert Hodel Date: Mon, 25 Mar 2019 13:41:49 -0700 Subject: [PATCH 2/5] Fixed bug where some subsets where repeated with a different order --- .../8-4-Power-Set.cpp | 32 ++++++++----------- 1 file changed, 13 insertions(+), 19 deletions(-) diff --git a/chapter-8-recursion-and-Dynamic-Programming/8-4-Power-Set.cpp b/chapter-8-recursion-and-Dynamic-Programming/8-4-Power-Set.cpp index 3c13803..a32676c 100644 --- a/chapter-8-recursion-and-Dynamic-Programming/8-4-Power-Set.cpp +++ b/chapter-8-recursion-and-Dynamic-Programming/8-4-Power-Set.cpp @@ -1,31 +1,25 @@ #include -#include #include +#include -std::set> subsets; +std::set> subsets; -void print(const std::vector& vec) { - for (const auto& i : vec) { +void print(const std::set& set) { + for (const auto& i : set) { std::cout << i << " "; } } -void findSubsets(const std::vector& set) { +void findSubsets(const std::set& set) { subsets.emplace(set); - if (set.size() == 2) { - subsets.emplace(std::vector{set[0]}); - subsets.emplace(std::vector{set[1]}); - return; - } - - - - for (int i = 0; i < set.size(); ++i) { - std::vector newSubset; - for (int j = 0; j < set.size() - 1; ++j) { - newSubset.push_back(set[(i + j) % set.size()]); + for (unsigned int i = 0; i < set.size(); ++i) { + std::set newSubset; + for (unsigned int j = 0; j < set.size() - 1; ++j) { + std::set::iterator it = set.begin(); + std::advance(it, (j + i) % set.size()); + newSubset.emplace(*it); } findSubsets(newSubset); } @@ -33,8 +27,8 @@ void findSubsets(const std::vector& set) { } int main(int argc, char** argv) { - std::vector vec{ 0, 1, 2, 3 }; - findSubsets(vec); + std::set set{ 0, 1, 2, 3 }; + findSubsets(set); for (const auto& set : subsets) { print(set); From e2c30ad579dceba899e179dfaaafb494993886d3 Mon Sep 17 00:00:00 2001 From: Robert Hodel Date: Mon, 25 Mar 2019 13:48:41 -0700 Subject: [PATCH 3/5] Fixed bug where an empty set was considered a subset --- chapter-8-recursion-and-Dynamic-Programming/8-4-Power-Set.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/chapter-8-recursion-and-Dynamic-Programming/8-4-Power-Set.cpp b/chapter-8-recursion-and-Dynamic-Programming/8-4-Power-Set.cpp index a32676c..f5e3276 100644 --- a/chapter-8-recursion-and-Dynamic-Programming/8-4-Power-Set.cpp +++ b/chapter-8-recursion-and-Dynamic-Programming/8-4-Power-Set.cpp @@ -21,7 +21,9 @@ void findSubsets(const std::set& set) { std::advance(it, (j + i) % set.size()); newSubset.emplace(*it); } - findSubsets(newSubset); + + if ( newSubset.size() > 0 ) + findSubsets(newSubset); } } From ee3da70b1fada84529a1ba2143f11baa2f832c5c Mon Sep 17 00:00:00 2001 From: Robert Hodel Date: Mon, 25 Mar 2019 14:02:11 -0700 Subject: [PATCH 4/5] Refactored to improve performance --- .../8-4-Power-Set.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/chapter-8-recursion-and-Dynamic-Programming/8-4-Power-Set.cpp b/chapter-8-recursion-and-Dynamic-Programming/8-4-Power-Set.cpp index f5e3276..a3d1cdf 100644 --- a/chapter-8-recursion-and-Dynamic-Programming/8-4-Power-Set.cpp +++ b/chapter-8-recursion-and-Dynamic-Programming/8-4-Power-Set.cpp @@ -12,6 +12,11 @@ void print(const std::set& set) { void findSubsets(const std::set& set) { + if (set.size() == 1) { + subsets.emplace(set); + return; + } + subsets.emplace(set); for (unsigned int i = 0; i < set.size(); ++i) { @@ -22,8 +27,8 @@ void findSubsets(const std::set& set) { newSubset.emplace(*it); } - if ( newSubset.size() > 0 ) - findSubsets(newSubset); + findSubsets(newSubset); + } } From 5166069b5308eda52ec1627f7673e1129fd3ed6e Mon Sep 17 00:00:00 2001 From: Robert Hodel Date: Mon, 25 Mar 2019 14:07:24 -0700 Subject: [PATCH 5/5] Updated to accomodate the empty set edge case --- .../8-4-Power-Set.cpp | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/chapter-8-recursion-and-Dynamic-Programming/8-4-Power-Set.cpp b/chapter-8-recursion-and-Dynamic-Programming/8-4-Power-Set.cpp index a3d1cdf..33df65e 100644 --- a/chapter-8-recursion-and-Dynamic-Programming/8-4-Power-Set.cpp +++ b/chapter-8-recursion-and-Dynamic-Programming/8-4-Power-Set.cpp @@ -11,13 +11,10 @@ void print(const std::set& set) { } void findSubsets(const std::set& set) { + subsets.emplace(set); - if (set.size() == 1) { - subsets.emplace(set); + if (set.size() <= 1) return; - } - - subsets.emplace(set); for (unsigned int i = 0; i < set.size(); ++i) { std::set newSubset; @@ -34,7 +31,7 @@ void findSubsets(const std::set& set) { } int main(int argc, char** argv) { - std::set set{ 0, 1, 2, 3 }; + std::set set{ 0, 1, 2 }; findSubsets(set); for (const auto& set : subsets) {