Введение. Примеры использования различных структур данных
В этом уроке вы узнаете про некоторые базовые структуры данных, применяемые в программировании для хранения информации.
Структурой данных называется программная единица, которая позволяет хранить и обрабатывать множество однотипных или логически связанных данных.
В большинстве языков программирования есть ограничение — в структуре данных можно хранить только элементы фиксированного типа. Но, например, в Python или JavaScript такого требования нет.
В школе у Аллы была та же классная руководительница, что у её брата Васи сейчас. Иногда учитель обращается к Алле за помощью. В этот раз классная руководительница хочет собрать статистику посещаемости дополнительных кружков. Вася учится в частной школе, где в каждом классе не более десяти учеников. В его классе восемь человек. Нужно где-то хранить их имена и фамилии. Какая структура данных подойдёт для этой задачи?
Рассмотрим массив. Эта структура данных хранит набор значений, к которым можно обращаться по индексу.
Эта операция выполняется за О(1). Если первый элемент в массиве имеет индекс 0, то адрес конкретной ячейки, в которой лежит элемент вычисляют по формуле:
AddressOfElementN = AddressOfArray + (N * sizeof(ElementType))
Но не во всех языках программирования индексация в массиве начинается с нуля. Например, в Lua или Pascal индекс первого элемента — 1.
В таком случае формула определения адреса элемента примет вид:
AddressOfElementN = AddressOfArray + ((N - 1) * sizeof(ElementType))
Пример массива:
Скопировать кодPYTHON
programming_lanquages = ["Python", "Java", "C++", "Ruby", "Scala"]
Массивы бывают статические и динамические. Размер статического массива задаётся при создании и не изменяется. Динамический же массив может изменяться во время исполнения программы. В некоторых языках программирования доступна реализация обоих типов, как в С++. А в некоторых языках — только одного. Например, в Pascal есть только статические массивы.
Эту структуру данных легко представить в виде ряда. У каждого элемента ряда есть номер. По этому номеру можно получить значение элемента.
Скопировать кодPYTHON
programming_lanquages[0]
Элементы массива расположены в последовательных ячейках памяти.
Массив удобно применять, когда нужно сохранить набор элементов в определённом порядке.
Длина массива равна количеству элементов, которые в нём хранятся.
Поэтому чтобы посчитать длину массива, нужно пройтись по всем элементам и посчитать их количество. В общем случае понадобится О(n) операций.
Но, к примеру, в языке Python можно определить длину массива за O(1). Это число хранится в структуре, привязанной к каждому объекту, у которого можно посчитать эту величину.
Итак, массив Алле отлично подходит. В каждом элементе массива может быть строка, содержащая фамилию и имя ученика:
Скопировать кодPYTHON
pupils = ['Бутылкин Василий', 'Петров Борис', 'Чашкина Василиса', 'Зайцев Макар', 'Яблоков Геннадий', 'Заборчиков Михаил', 'Котовасин Роман', 'Забывакина Раиса']
Например, вот списки кружков Бутылкина Васи и Чашкиной Василисы:
Скопировать кодPYTHON
vasya_butylkin_optional_courses = [
'вышивание крестиком',
'рисование мелками на парте',
'настольный керлинг',
]
vasilisa_chashkina_optional_courses = [
'настольный керлинг',
'кухня африканского племени ужасмай',
'тяжелая атлетика',
'таракановедение',
]
Нужно определить, какие кружки посещает хотя бы один ученик в классе. Можно создать массив и поместить в него сначала кружки для первого ученика, затем для второго и продолжать, пока не переберём всех. Потом поискать в списке повторяющиеся элементы и удалить лишние вхождения.
Этот алгоритм можем записать так:
Скопировать кодPYTHON
visited_optional_courses = list()
for course in vasya_butylkin_optional_courses:
visited_optional_courses.append(course)
for course in vasilisa_chashkina_optional_courses:
visited_optional_courses.append(course)
...
В примере рассматриваем двух учеников, Васю и Василису. Общий список их кружков:
Скопировать кодPYTHON
visited_optional_courses =
['вышивание крестиком',
'рисование мелками на парте',
'настольный керлинг',
'настольный керлинг',
'кухня африканского племени ужасмай',
'тяжелая атлетика',
'таракановедение']
Убираем дубликаты:
Скопировать кодPYTHON
unique_courses = []
for course in visited_optional_courses:
if course not in unique_courses:
unique_courses.append(course)
Получаем нужный результат. Но, кажется, были проделаны лишние действия.