Программирование на языке Ruby
Программирование на языке Ruby читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Есть, конечно, более сложные и интересные структуры данных, чем массивы и хэши. Некоторые из тех, с которыми мы познакомимся в этой главе, имеют прямую или косвенную поддержку в Ruby, другие приходится программировать самостоятельно. К счастью, Ruby упрощает создание нестандартных структур данных.
Математические множества можно, как мы видели, моделировать с помощью массивов. Но в последних версиях Ruby есть также класс
SetСтеки и очереди — две весьма распространенные в информатике структуры данных. В первом издании этой книги им было уделено чрезмерно много внимания. Для тех, кого интересуют общие вопросы, я оставил кое-какой материал; для остальных есть немало великолепных книг по структурам данных и алгоритмам.
Деревья полезны для сортировки, поиска и просто представления иерархических данных. Мы рассмотрим двоичные деревья и сделаем несколько замечаний о деревьях более высокой степени.
Граф — это обобщение понятия дерева. Граф представляет собой множество вершин, соединенных ребрами, причем с каждым ребром может быть связан вес или направление. Они полезны для решения многих задач, в том числе при анализе сетей и организации знаний.
Но самыми простыми структурами являются множества. С них мы и начнем.
9.1. Множества
Мы уже видели, что некоторые методы класса
ArraySetЧтобы получить в свое распоряжение класс
Setrequire 'set'При этом также добавляется метод
to_setEnumerableСоздать новое множество нетрудно. Метод
[]newmaps1 = Set[3,4,5] # В математике обозначается {3,4,5}.arr = [3,4,5]s2 = Set.new(arr) # То же самое.s3 = Set.new(arr) {|x| x.to_s } # Множество строк, а не чисел.9.1.1. Простые операции над множествами
Для объединения множеств служит метод
union|+x = Set[1,2,3]y = Set[3,4,5]а = x.union(y) # Set[1,2,3,4,5]b = x | y # То же самое.с = x + y # То же самое.Пересечение множеств вычисляется методом
intersection&x = Set[1,2,3]y = Set[3,4,5]а = x.intersection(y) # Set[3]b = x & y # То же самое.Унарный минус обозначает разность множеств; мы обсуждали эту операцию в разделе 8.1.9.
diff = Set[1,2,3] - Set[3,4,5] # Set[1,2]Принадлежность элемента множеству проверяют методы
member?include?Set[1,2,3].include?(2) # trueSet[1,2,3].include?(4) # falseSet[1,2,3].member?(4) # falseЧтобы проверить, является ли множество пустым, мы вызываем метод
empty?clears = Set[1,2,3,4,5,6]s.empty? # falses.clears.empty? # trueМожно проверить, является ли одно множество подмножеством, собственным подмножеством или надмножеством другого.
x = Set[3,4,5]y = Set[3,4]x.subset?(y) # falsey.subset?(x) # truey.proper_subset?(x) # truex.subset?(x) # truex.proper_subset?(x) # falsex.superset?(y) # trueМетод
add<<add?nilreplaceНаконец, два множества можно сравнить на равенство интуитивно очевидным способом:
Set[3,4,5] == Set[5,4,3] # true9.1.2. Более сложные операции над множествами
Разумеется, можно обойти множество, но (как и для хэшей) не ожидайте какого-то определенного порядка появления элементов, потому что множества по сути своей неупорядочены, и Ruby не гарантирует никакой последовательности. (Временами можно получить повторяющиеся, ожидаемые результаты, но полагаться на это неразумно.)
s = Set[1,2,3,4,5]s.each {|x| puts x; break } # Выводится: 5Метод
classifypartitionclassifyfiles = Set.new(Dir ["*"])hash = files.classify do |f| if File.size(f) <= 10_000 :small elsif File.size(f) <= 10_000_000
