Guest User

Untitled

a guest
Jun 24th, 2018
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.81 KB | None | 0 0
  1. def subsets(array)
  2. subsets = []
  3. array.each do |elem|
  4. new = subsets.inject([]) { |accum, n| accum << n.dup.push(elem) }
  5. subsets.concat(new)
  6. subsets << [elem]
  7. end
  8. subsets
  9. end
  10.  
  11. def filter_subsets(subsets, array)
  12. lookup = array.inject({}) { |hash, elem| hash[elem] = true && hash }
  13. subsets.inject([]) do |accum, subset|
  14. if (subset.length > 1) && lookup[subset.inject(:+)]
  15. accum << subset
  16. end
  17. accum
  18. end
  19. end
  20.  
  21. array = [3, 4, 9, 14, 15, 19, 28, 37, 47, 50, 54, 56, 59, 61, 70, 73, 78, 81, 92, 95, 97, 99]
  22. sets = subsets(array)
  23.  
  24. puts "generated #{sets.length} subsets"
  25.  
  26. puts "filtering subsets"
  27. fsets = filter_subsets(sets, array)
  28. puts "#{fsets.length} matching subsets"
  29.  
  30.  
  31. # $ time ruby find_subsets.rb
  32. # => Generated 4194303 subsets
  33. # filtering subsets
  34. # 179 matching subsets
  35. # 42.422 secs
Add Comment
Please, Sign In to add comment