Skip to content

Commit 87f2a3b

Browse files
committed
Added tickets 12-15 (not full)
1 parent 5969041 commit 87f2a3b

File tree

4 files changed

+271
-8
lines changed

4 files changed

+271
-8
lines changed

slides/ticket12.md

+82-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,85 @@
11
# Экзаменационный билет №12
22

3+
## 1.Сборка мусора (Повторное использование памяти).
34

4-
## 1. Сборка мусора.
5-
## 2. Оценка сложности обработки деревьев поиска. Понятие сбалансированных и идеально сбалансированных деревьев поиска.
5+
При удалении разделов текста для освобождения звеньев следует учитывать следующие моменты:
6+
7+
- обход всех звеньев удаляемого текста может потребовать длительного времени
8+
- при множественности ссылок на разделы текста (для устранения дублирования одинаковых частей) удаляемый текст нельзя исключить – этот текст может быть задействован в других фрагментах текста.
9+
10+
Память, занимаемая удаляемым текстом, не освобождается, а удаление текста фиксируется установкой указателей в состояние NULL (например, `pFirst=NULL`).
11+
12+
- Подобный способ выполнения операций удаления текста может привести к ситуации, когда в памяти, используемой для хранения текста, могут присутствовать звенья, на которые нет ссылок в тексте и которые не возвращены в систему управления памятью для повторного использования
13+
- Элементы памяти такого вида носят наименование "**мусора**"
14+
- Наличие "мусора" в системе может быть допустимым, если имеющейся свободой памяти достаточно для работы программ
15+
- В случае нехватки памяти необходимо выполнить "**сборку мусора**".
16+
17+
Возможный подход доступа к системе управления памятью – разработка специальной системы управления при помощи перегрузки операторов `new` и `delete`.
18+
19+
### Общая схема подхода
20+
21+
- Для системы управления память выделяется полностью при начале работы программы
22+
- вся память форматируется и представляется в виде линейного списка свободных звеньев
23+
- Для фиксации состояния памяти в классе `TTextLink` создается статическая переменная `MemHeader` типа `TTextMem`.
24+
25+
```C++
26+
class TTextMem{
27+
PTTextLink pFirst; // первое звено
28+
PTTextLink pLast; // последнее звено
29+
PTTextLink pFree; // первое свободное
30+
```
31+
32+
- Для выделения и форматирования памяти определяется статический метод `InitMemSystem` класса `TTextLink`.
33+
34+
```C++
35+
void TTextLink::InitMemSystem(int size) // инициализация памяти
36+
{
37+
char Line[100];
38+
char *tmp = new char[sizeof(TTextLink)*size];
39+
MemHeader.pFirst = (PTTextLink)new char[sizeof(TTextLink)*size];
40+
MemHeader.pFree = MemHeader.pFirst;
41+
MemHeader.pLast = (PTTextLink)tmp + size - 1;
42+
PTTextLink pLink = MemHeader.pFirst;
43+
for (int i = 0; i < size - 1; i++, pLink++) // размер памяти
44+
pLink->pNext = pLink + 1;
45+
pLink->pNext = nullptr;
46+
}
47+
```
48+
49+
- При запросе памяти в операторе new выделяется первое свободное звено.
50+
51+
```C++
52+
void * TTextLink::operator new(size_t size) // выделение звена
53+
{
54+
PTTextLink pLink = MemHeader.pFree;
55+
if (MemHeader.pFree != nullptr)
56+
MemHeader.pFree = pLink->pNext;
57+
return pLink;
58+
}
59+
```
60+
61+
- При освобождение звена в операторе `delete` звено включается в список свободных звеньев.
62+
63+
```C++
64+
void operator delete (void *pM)
65+
{
66+
PTTTextLink pLink=(PTTTextLink)pM;
67+
pLink->pNext=MemHeader.pFree;
68+
MemHeader.pFree=pLink;
69+
}
70+
```
71+
72+
- Для различения звеньев «мусора» и текста – маркировка текстовых звеньев и звеньев списка свободных звеньев.
73+
74+
## 2. Оценка сложности обработки деревьев поиска.
75+
76+
```
77+
Тmin=1
78+
Tmax=log2N(при сбалансированном дереве)
79+
Tmax=N(при вырожденном дереве)
80+
```
81+
82+
`ПИКЧИ`
83+
84+
<!-- TODO:
85+
- Add more info -->

slides/ticket13.md

+57-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,60 @@
11
# Экзаменационный билет №13
22

3+
## 1.Представление текста связным списком.
34

4-
## 1. Представление текста связным списком.
5-
## 2. Таблицы с вычислимым входом. Метод цепочек.
5+
Текст – линейная последовательность символов
6+
7+
`ПИКЧА`
8+
9+
Текст – линейная последовательность слов (слово - линейная последовательность символов)
10+
11+
`ПИКЧА`
12+
13+
Текст – линейная последовательность строк, строки состоят из слов, слова – из символов и т.д.
14+
15+
`ПИКЧА`
16+
17+
Математическая модель текста – иерархическая структура представления (дерево).
18+
19+
`ПИКЧА`
20+
21+
- На всех уровнях представления (кроме символов) значение задается указателем на соответствующую структуру ниже расположенного уровня
22+
- Разработанная структура хранения называется **связным (иерархическим) списком**
23+
- Абстрактная структура типа дерева представима в виде **связного списка**
24+
- В списке существуют делимые и неделимые (атомарные, терминальные) элементы
25+
- Визуальное представление текста содержит только атомарные элементы, структура хранения должна включать все элементы - Разные типы звеньев – трудности при управлении памятью, дублирование программ обработки
26+
27+
Единый тип звена:
28+
29+
```C++
30+
typedef Tlink *PTLink;
31+
class TLink
32+
{
33+
PTLink pNext;
34+
int Atom; // =1 – звено-атом
35+
union {PTLink pDown; char Symb;}
36+
```
37+
38+
## 2. Таблицы с вычислимым входом.
39+
40+
**Таблица с вычисляемым входом (хеш-таблица)** – это таблица, элементы которой располагаются в соответствии с некоторой функцией расстановки (**хеш-функцией**)
41+
42+
Функция расстановки f (ключ) вычисляет для каждого элемента таблицы по его ключу номер (позицию) элемента в массиве.
43+
44+
- диапазон значений функции f (ключ) – `0…N–1` или `1…N`
45+
- Хеш-таблица должна быть инициализирована, т. е. элементы таблицы вначале должны получить значение “пусто”, что позволяет определить, есть в данной позиции элемент или нет.
46+
47+
`ПИКЧИ`
48+
49+
**Метод цепочек**.
50+
51+
Замечания к открытому перемешиванию как способу размешения коллизий:
52+
53+
- Размер памяти для таблиц фиксирован
54+
- Хранение записей без упорядоченности по ключам.
55+
56+
Широко используемый подход для разрешения коллизий - **метод цепочек**, когда все записи, для которых функция хеширования определяет одно и тоже значение,представляются в виде линейного списка.
57+
58+
Открытое перемешивание еще называют **закрытым хэшированием**, метод цепочек - **открытое хэширование**.
59+
60+
`ПИКЧА`

slides/ticket14.md

+103-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,106 @@
11
# Экзаменационный билет №14
22

3+
## 1.Алгоритм обхода иерархического списка (итератор).
34

4-
## 1. Алгоритм обхода иерархического списка (итератор).
5-
## 2. Пример использования стеков: преобразование арифметических выражений в польскую форму записи.
5+
Печать текста: схема обхода
6+
7+
- текст текущей строки
8+
- текст подуровня
9+
- текст следующего раздела текста того же уровня (top-down-next).
10+
11+
```C++
12+
while (1)
13+
{
14+
if ( pLink != NULL )
15+
{
16+
cout << pLink->Str; // обработка звена
17+
St.push(pLink); // запись в стек
18+
pLink = pLink->pDown; // переход на подуровень
19+
}
20+
else if ( St.empty() )
21+
break;
22+
else
23+
{
24+
pLink = St.top();
25+
St.pop(); // выборка из стека
26+
pLink = pLink->pNext; // переход по тому же уровню
27+
}
28+
}
29+
```
30+
31+
**Ввод текста из файла**: уровень текста в файле можно выделить строками специального вида (например, скобками '{' и '}')
32+
33+
Общая схема алгоритма:
34+
35+
```
36+
повторить:
37+
ввод строки
38+
ЕСЛИ '}' ТО Завершить
39+
ЕСЛИ '{' ТО Выполнить рекурсивно Ввод_текста
40+
Добавить строку на том же уровне
41+
```
42+
43+
Реализация итератор:
44+
45+
- схема обхода TDN нерекурсивный вариант
46+
- корневые звенья необработанных разделов текста запоминаются в стеке
47+
- текущая строка в стеке не хранится(кроме звена всего текста)
48+
49+
```C++
50+
int TText::Reset(void) // Установка на корневое звено текста
51+
{
52+
pCurrent = pFirst;
53+
if (pCurrent != nullptr)
54+
{
55+
St.push(pCurrent);
56+
if (pCurrent->pNext != nullptr)
57+
St.push(pCurrent->pNext);
58+
if (pCurrent->pDown != nullptr)
59+
St.push(pCurrent->pDown);
60+
}
61+
}
62+
63+
bool TText::IsTextEnded(void) const // Стек пуст?
64+
{
65+
return St.empty();
66+
}
67+
68+
bool TText::GoNext(void) // Переход к следующему звену текста
69+
{
70+
if (!IsTextEnded())
71+
{
72+
pCurrent = St.top();
73+
St.pop();
74+
if (pCurrent != pFirst)
75+
{
76+
if (pCurrent->pNext != nullptr)
77+
St.push(pCurrent->pNext);
78+
if (pCurrent->pDown != nullptr)
79+
St.push(pCurrent->pDown);
80+
}
81+
82+
}
83+
return IsTextEnded();
84+
}
85+
```
86+
87+
## 2. Пример использования стеков: преобразование арифметических выражений в польскую форму записи.
88+
89+
Формат записи выражения.
90+
91+
- Выражение синтаксически правильно (без ошибок)
92+
- Допускаются только однобуквенные идентификаторы для операндо
93+
- В записи выражения нет пробелов
94+
- Dыражение заканчивается знаком `'='`: `A+(B-C)*D-F/(G+H)=`.
95+
96+
Алгоритм:
97+
98+
1. Для операций вводится приоритет:`'*' '/' (3), '+' '-' (2), '(' (1), '=' (0)`,
99+
2. Для хранения данных используется 2 стека (1 – для результата, 2 – для операций),
100+
3. Исходное выражение просматривается слева направо,
101+
4. Операнды по мере их появления помещаются в стек 1 ,
102+
5. Символы операций и левые скобки помещаются в стек 2,
103+
6. При появлении правой скобки последовательно изымаются элементы из стека 2 и переносятся в стек 1. Данные действия продолжаются либо до опустошения стека 2 либо до попадания в стеке 2 на левую скобку,
104+
7. Если текущая операция, выделенная при обходе выражения, имеет меньший (более низкий) приоритет, чем операция на вершине стека 2, то такие операции из стека 2 переписываются в стек 1.
105+
106+
`ПИКЧА`

slides/ticket15.md

+29-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,31 @@
11
# Экзаменационный билет №15
22

3-
## 1. Изменение структуры текста (вставка и удаление строк)
4-
## 2. Деревья поиска. Алгоритм удаления.
3+
## 1.Изменение структуры текста (вставка и удаление строк)
4+
5+
```C++
6+
void TText::DelDownLine(void) // Удаление строки в подуровне
7+
{
8+
if (pCurrent == nullptr)
9+
SetRetCode(TextErr);
10+
else if (pCurrent->pDown == nullptr)
11+
SetRetCode(TextNoDown);
12+
else if (pCurrent->pDown->IsAtom())
13+
pCurrent->pDown = pCurrent->pDown->pNext;
14+
}
15+
16+
void TText::InsDownLine(string str) // Вставка строки в подуровень
17+
{
18+
if (pCurrent == nullptr)
19+
SetRetCode(TextErr);
20+
else
21+
{
22+
TStr buf; // typedef char TStr[TextLineLength];
23+
strcpy(buf, str.c_str());
24+
pCurrent->pDown = new TTextLink(buf, pCurrent->pDown, nullptr);
25+
}
26+
}
27+
```
28+
29+
## 2. Деревья поиска. Алгоритм удаления.
30+
31+
`ПИКЧИ`

0 commit comments

Comments
 (0)