Скачать презентацию Чернышев Георгий Линейные списки Список Динамическая структура Скачать презентацию Чернышев Георгий Линейные списки Список Динамическая структура

Линейные списки.pptx

  • Количество слайдов: 44

Чернышев Георгий Линейные списки Чернышев Георгий Линейные списки

Список Динамическая структура данных Позволяет неограниченный рост размера Требует специальных механизмов обращения Состоит из Список Динамическая структура данных Позволяет неограниченный рост размера Требует специальных механизмов обращения Состоит из Указателя на первый элемент Каждый элемент указывает на следующий и хранит данные Последний элемент указывает на NIL

Динамические структуры данных Указатель Адрес в куче Позволяет использовать более 64 KByte сегмента: ▪ Динамические структуры данных Указатель Адрес в куче Позволяет использовать более 64 KByte сегмента: ▪ VAR Buffer : ARRAY [1. . $FFF 0] OF CHAR; Позволяет работать с динамическими типами данных Значение любого указателя – АДРЕС

Операции с указателями Объявление с помощью символа “^” Так: TYPE P 1 Ptr = Операции с указателями Объявление с помощью символа “^” Так: TYPE P 1 Ptr = ^INTEGER Или так: VAR P 1 : ^INTEGER Присваивание Другому указателю NIL Объекту по адресу (@), переменной например Запись по адресу простого типа: P 1^ : = 7; - после выделения Операции с памятью Выделение памяти NEW(P) Освобождение DISPOSE(P)

Примеры VAR P 1, P 2 : ^INTEGER; P 3: INTEGER BEGIN NEW(P 1); Примеры VAR P 1, P 2 : ^INTEGER; P 3: INTEGER BEGIN NEW(P 1); NEW(P 2); P 1^ : = 7; P 2^ : = 10; P 1^ : = P 2^*P 1^; P 3 : = 2; P 2 : = @P 3; END;

Сложности Необходимо следить за выделяемой памятью Не выделять повторно память выделенную с помощью NEW, Сложности Необходимо следить за выделяемой памятью Не выделять повторно память выделенную с помощью NEW, без вызова DISPOSE Инициализировать указатели при объявлении В конце программы возвращать память ставшую ненужной DISPOSE только освобождает память, сам указатель надо вручную приравнивать к NIL Всегда иметь ссылку на выделенную память.

Объявление списка TYPE PELEM = ^ELEM; ELEM = record val: INTEGER; p. Next: PELEM; Объявление списка TYPE PELEM = ^ELEM; ELEM = record val: INTEGER; p. Next: PELEM; end;

Добавление элемента VAR p. Begin: ^ELEM; // исходный список cur: ^ELEM; // временный элемент Добавление элемента VAR p. Begin: ^ELEM; // исходный список cur: ^ELEM; // временный элемент BEGIN FOR i: = 1 TO 10 BEGIN NEW(cur); cur^. p. Next : = p. Begin; cur^. val : = i; p. Begin : = cur; END;

Добавление элемента Добавление элемента

Поиск элемента в списке VAR p. Begin: ^ELEM; // Список где ищем cur: ^ELEM; Поиск элемента в списке VAR p. Begin: ^ELEM; // Список где ищем cur: ^ELEM; BEGIN cur : = p. Begin; while (cur <> NIL) DO BEGIN IF (cur^. val = 5) BEGIN WRITELN(“EXIST!”); BREAK; END; cur : = cur^. p. Next; END; IF (cur = NIL) WRITELN(“NOT EXIST!”); END;

Удаление элемента VAR p. Begin: ^ELEM; // основной список cur: ^ELEM; temp: ^ELEM; BEGIN Удаление элемента VAR p. Begin: ^ELEM; // основной список cur: ^ELEM; temp: ^ELEM; BEGIN cur : = find. Prev(p. Begin, 12); // функция возвращает указатель на предыдущий элемент с значением 12, в списке p. Begin if (cur = NIL) RETURN; temp : = cur^. next; cur^. next : = cur^. next; DISPOSE(temp); END; // Когда не будет работать? // Две причины

Удаление элемента Удаление элемента

В кратце (+) Добавление за O(1) Динамическая структура данных: не фиксирован размер, дешева вставка В кратце (+) Добавление за O(1) Динамическая структура данных: не фиксирован размер, дешева вставка на любую позицию, удаление (-): Отсутствие произвольного доступа (плохо подходит для хранения упорядоченной информации) Дорогой поиск Динамическая структура данных: необходимо следить за выделенной памятью

Эффективность Добавление Удаление Поиск Линейный список O(1) Поиск+O(1) O(n) Сортированный Массив O(logn) + сдвиг Эффективность Добавление Удаление Поиск Линейный список O(1) Поиск+O(1) O(n) Сортированный Массив O(logn) + сдвиг O(1) + сдвиг O(logn) Бинарное дерево O(logn) Поиск+O(1) O(logn)

Задачи Для зачета за эту тему надо набрать 3 балла Задачи без * считаются Задачи Для зачета за эту тему надо набрать 3 балла Задачи без * считаются за 1 балл Задачи со * и ** считаются соответственно за 2 и 3 балла Некоторые задачи имеют дополнения в условиях, при которых их ценность повышается. Для зачета этого типа задач необходимо предъявить оба варианта (и простой вариант тоже)

Задача – “Телефонная книга” Поддерживать упорядоченный список фамилий с телефонами Реализовать вставку, удаление, поиск, Задача – “Телефонная книга” Поддерживать упорядоченный список фамилий с телефонами Реализовать вставку, удаление, поиск, печать всего списка по порядку Все эти операции должны не нарушать свойство упорядоченности

Задача – “Реорганизация” Дан список списков групп, где каждый список группы содержит фамилию и Задача – “Реорганизация” Дан список списков групп, где каждый список группы содержит фамилию и балл за экзамен по предмету информатика Необходимо: создать 3 потока – сильный, слабый и очень слабый А) при этом потоки должны быть равны Б) могут быть не равны, но состав групп должен быть однороден

Задача – “Балансировщик” Даны P 1, P 2, … Pm – список игроков, каждый Задача – “Балансировщик” Даны P 1, P 2, … Pm – список игроков, каждый игрок имеет определенную силу, целое число N команд Составить (по возможности) равные команды, выведя их списки

Задача – “Map. Reduce” Дан список списков вещественных чисел Реализовать сортировку слиянием Нельзя пользоваться Задача – “Map. Reduce” Дан список списков вещественных чисел Реализовать сортировку слиянием Нельзя пользоваться массивами Вернуть единый список Этот алгоритм применяется для распределенной сортировки больших массивов чисел

Задача – “Поворот” Дан список списков целочисленных элементов Необходимо его перевернуть При этом, повернуть Задача – “Поворот” Дан список списков целочисленных элементов Необходимо его перевернуть При этом, повернуть каждый из списков Не использовать конвертацию в массивы

Задача – “Закупка” Даны Список магазинов S 1, S 2, S 3 … каждый Задача – “Закупка” Даны Список магазинов S 1, S 2, S 3 … каждый из которых указывает на список товаров Список товаров магазина Si: Wi 1, Wi 2, Wi 3, … с ценами Ci 1, Ci 2, … Список товаров которые необходимо приобрести При этом, не все товары могут присутствовать с магазине, порядок магазинов, товаров произволен Найти минимальную стоимость покупки Вывести описывающий набор триплетов (Si, Wj, Сj) Сделать это оптимально за дополнительные баллы (* или даже **)

Задача – “Последовательность” Дан список с целочисленными элементами Найти возрастающую последовательность наибольшей длины Задача – “Последовательность” Дан список с целочисленными элементами Найти возрастающую последовательность наибольшей длины

Задача – “Ошибка оператора” Дан линейный список (построить самому из массива) состоящий из элементов Задача – “Ошибка оператора” Дан линейный список (построить самому из массива) состоящий из элементов целочисленного типа В процессе построения, оператор, по ошибке, ввел некоторые элементы несколько раз Удалить все дубликаты, вернуть список Работая только со списками (конвертировать обратно в массив нельзя)

Задача – “Поиск” Дано два списка целых чисел: Данные D Запрос q Необходимо найти Задача – “Поиск” Дано два списка целых чисел: Данные D Запрос q Необходимо найти в данных все вхождения запроса: Числа из запроса идут непрерывно в D Числа из запроса могут прерываться Например при D = {1, 3, 6, 4, 6, 7} и q = {1, 3, 6} в первом случае будет найдено одно вхождение во втором - два

Задача – “Шпионы” Дано Список жителей P 1, P 2, …, Pn Список организаций Задача – “Шпионы” Дано Список жителей P 1, P 2, …, Pn Список организаций O 1, O 2, …, Om. Каждый такой список содержит жителя, каждый из которых может состоять в нескольких организациях Известно что в город пробралось k шпионов Найти их, упорядочить по вероятности, если известно, что шпионы пытаются оставаться максимально незаметными и никуда не вступать

Задача – “Обмен” Даны два списка, и две пары чисел Вернуть два списка, у Задача – “Обмен” Даны два списка, и две пары чисел Вернуть два списка, у которых части ограниченные этими числами переставлены местами. Если таких чисел в каком-либо списке нет, то вернуть исходные

Задача – “Свертка списка” Вычислить левую свертку списка и вернуть список из одного элемента Задача – “Свертка списка” Вычислить левую свертку списка и вернуть список из одного элемента Свертка это f(…f(f(e 1, e 2, …, en 1), en 1+1, en 2+2, … e 2*n 11)…)

Задача – “Умное разделение” Дан список элементов l и два целых числа Mиn Вернуть Задача – “Умное разделение” Дан список элементов l и два целых числа Mиn Вернуть M списков, где k-тый список вида ln*k, ln*k+1, …ln*(k+m)-1, ln*2 k+1

Задача – “Умножение матриц” Реализовать умножение матриц на списках Транспонирование, вычисление детерминанта по гауссу Задача – “Умножение матриц” Реализовать умножение матриц на списках Транспонирование, вычисление детерминанта по гауссу и вычисление следа даст *

Задача* – “Инквизиция” Дан список горожан p = {c 1, … , cm} и Задача* – “Инквизиция” Дан список горожан p = {c 1, … , cm} и список еретиков l = {h 1, …, hn}. Каждый из них обладает какой-либо собственностью в городе, она задана с помощью списка (владение – список указателей на них). Собственность может находиться в коллективном владении. По закону, собственность нельзя реквизировать, если владеющие ей еретики в меньшинстве Найти всю собственность подлежащую конфискации

Задача* – “Транзакции” Транзакция R(Xi), W(Xi) – чтение и запись в переменную Xi C(i), Задача* – “Транзакции” Транзакция R(Xi), W(Xi) – чтение и запись в переменную Xi C(i), A(i) – успешное и неуспешное завершение, конец транзакции Распутать список (в теории транзакций этот список называется расписание ) представляющий N транзакций (N - неизвестно), вернув список списков, каждый из которых содержит только операции из своей транзакции. Сделать это за 1 проход Нельзя конвертировать в массив Нельзя создавать элементы

Задача* – “Функциональная библиотека” Реализовать библиотеку со следующими функциями Обращение списка Фильтрация списка по Задача* – “Функциональная библиотека” Реализовать библиотеку со следующими функциями Обращение списка Фильтрация списка по условию на элемент Конкатенация списков Поиск в списке Для простоты можно считать что все элементы списка – целые числа

Задача* – “Функциональная библиотека-2” Объект список списков целых чисел Реализовать операции Поиск подсписка Удаление, Задача* – “Функциональная библиотека-2” Объект список списков целых чисел Реализовать операции Поиск подсписка Удаление, Вставка Слияние, разбиение Клонирование

Задача* – “Функциональная библиотека-3” Объект – список целых чисел, реализовать Multisplit – вернуть список Задача* – “Функциональная библиотека-3” Объект – список целых чисел, реализовать Multisplit – вернуть список списков состоящих из исходных элементов разделенных указанным числом Замена по шаблону: q – исходное выражение вида li, li+1, li+2…, li+n -> lj, lj+1, … lj+m; lj in A. . Z Необходимо применить последовательно к линейному списку. Примеры: ▪ Список 1, 5, 7, 3, 14, 6, 2 ▪ Q: ABC ->CA, RESULT: 7, 5, 6, 14 ▪ Q: AB -> BA, RESULT: 5, 1, 3, 7, 6, 14, 2

Задача* – “Контейнер” Реализовать контейнер “Множество” на списках Проверка наличия элемента Пересечение Объединение Разность Задача* – “Контейнер” Реализовать контейнер “Множество” на списках Проверка наличия элемента Пересечение Объединение Разность множеств Удовлетворяло основному свойству множества (не мультимножества)

Задача* – “Поисковая машина” Даны: Набор S = {d 1, d 2, …, dn} Задача* – “Поисковая машина” Даны: Набор S = {d 1, d 2, …, dn} текстовых документов, состоящих из набора слов Набор слов, являющийся запросом q (считаем что между ними AND) Требуется вывести наиболее релевантные документы к данному запросу с использованием инвертированных списков Функция релевантности – общее количество слов из запроса встречающихся в документе. Дополнительные очки за придумывание и реализацию лучшей функции, с обоснованием. Инвертированные списки – структура данных в которой каждому слову из S сопоставлен набор документов где оно встречается (и возможно другая информация, такое как место в документе итд)

Задача* – “Классы” Существует набор объектов O 1, O 2, … Дан список классов, Задача* – “Классы” Существует набор объектов O 1, O 2, … Дан список классов, каждый класс задан списком объектов в него входящих Однако, выяснилось что если объект принадлежит двум классам, то эти два класса есть один Найти и вывести получившиеся таким образом классы (замыкание)

Задача* – “Саботаж” Дан список городов P 1, P 2, …, Pn Дан список Задача* – “Саботаж” Дан список городов P 1, P 2, …, Pn Дан список железнодорожных маршрутов R 1, R 2, …, Rm. Каждый маршрут задан последовательностью населенных пунктов Ri 1, Ri 2, …, Ri(i_j) (маршруты произвольной длины) Необходимо: Выбрать минимальное количество городов для проведения саботажа, так чтобы разрушить все маршруты (маршрут считается разрушенным если нельзя проехать из Ri 1 в Rii для всех i). Если есть несколько вариантов – вывести любой Дополнительные баллы за ту же задачу, но при облегчении саботажа (известно население городов), проводить легче там, где больше народа

Задача* – “Распутывание” Даны N пар (вершина 1, вершина 2) Параметры – наборы стартовых Задача* – “Распутывание” Даны N пар (вершина 1, вершина 2) Параметры – наборы стартовых и конечных вершин S и F “Развязать” данный граф, представив пользователю все возможные списки путей Усложнение(доп. баллы): в вершинах записаны операции (+, *, -, /) и число, применяемых к предыдущему результату. Есть так же аккумулятор (стартует с 0 из любого S). Найти путь дающий максимальное значение, циклов нет

Задача** – “Выборочный Саботаж” Тоже самое что в простом саботаже, но Мэры некоторых городов Задача** – “Выборочный Саботаж” Тоже самое что в простом саботаже, но Мэры некоторых городов наши люди, их нельзя обижать Задача – сделать тоже самое, но оставить нетронутыми Nij “верных” городов для каждого региона i или сказать что это невозможно

Задача** – “Региональный Саботаж” Как и в Саботаже заданы города и дороги Известна принадлежность Задача** – “Региональный Саботаж” Как и в Саботаже заданы города и дороги Известна принадлежность города к региону В регионе есть столицы (несколько штук) Разрушить связность между регионами Связь разрушена если из любой столицы одного региона нельзя попасть во все Данные и все остальное на списках

Задача** – “Шпионы-2” То же самое что в шпионах, но Есть список шпионских организаций, Задача** – “Шпионы-2” То же самое что в шпионах, но Есть список шпионских организаций, которыми можно пренебречь Известно что у шпиона мало друзей (меньше 3 х), чем меньше тем более вероятнее что он шпион Найти их, упорядочить по убыванию вероятности Аггрегирующая функция?

Задача** – “Вагоны” Дан закольцованный список, каждый элемент которого содержит Указатель на следующий элемент Задача** – “Вагоны” Дан закольцованный список, каждый элемент которого содержит Указатель на следующий элемент Указатель на предыдущий элемент “Лампочку” – булеву переменную, инициализированную произвольно, можно менять Ходя по списку определить его длину Нельзя выходить за пределы модели – конвертировать в массивы итд. Можно использовать константный объем памяти

Задача** – “Копирование” Дан список из элементов, каждый из которых Хранит некоторое целочисленное значение Задача** – “Копирование” Дан список из элементов, каждый из которых Хранит некоторое целочисленное значение Имеет указатель на следующий элемент Имеет дополнительный указатель, указывающий на произвольный элемент списка Необходимо откопировать за O(n)