и алгоритмы
обработки данных
Слайд 2Литература
Вирт Н. Алгоритмы+структуры данных = программы: Пер. с англ.-М.Мир,1985.-406
с., ил.
Вирт Н. Алгоритмы и структуры данных: Пер. с
англ.-М.Мир,1989.-360 с., ил.
Кнут Д. Искусство программирования для ЭВМ. В семи томах. т.1. Основные алгоритмы. М.: Мир, 1976
Кнут Д. Искусство программирования для ЭВМ. В семи томах. т.3. Сортировка и поиск. М.: Мир, 1978
Ахо А., Хопкрофт,Д., Ульман Д. Структуры данных и алгоритмы. Вильямс, С-П, 2000
Слайд 3 Введение
Структура данных – общее свойство информационного объекта,
с которым взаимодействует та или иная программа. Это общее свойство
характеризуется:
множеством допустимых значений данной структуры;
набором допустимых операций;
характером организованности.
Слайд 4 Введение
Любая структура на абстрактном уровне может быть
представлена в виде двойки
где D – конечное множество элементов,
которые могут быть типами данных, либо структурами данных,
R – множество отношений, свойства которого определяют различные типы структур данных на абстрактном уровне.
Слайд 5 Введение
Основные виды (типы) структур данных:
Множество – конечная
совокупность элементов, у которой R=∅.
Последовательность – абстрактная структура, у которой
множество R состоит из одного отношения линейного порядка (т. е. для каждого элемента, кроме первого и последнего, имеются предыдущий и последующий элементы).
Слайд 6 Введение
Матрица – структура, у которой множество R состоит из
двух отношений линейного порядка.
Дерево – множество R состоит из одного
отношения иерархического порядка.
Граф – множество R состоит из одного отношения бинарного порядка.
Слайд 7 Введение
Вырожденные (простейшие) структуры данных называются также типами данных.
Различают
следующие уровни описания данных:
абстрактный (математический) уровень
логический уровень
физический уровень
Классификация СД
Слайд 9 Категории типов данных
Встроенные типы данных, т.е. типы,
предопределенные в языке программирования или языке баз данных.
уточняемые типы данных
перечисляемый
тип данных
конструируемый тип (составной)
Слайд 10 Категории типов
Указательные типы дают
возможность работы с
типизированными множествами
абстрактных адресов переменных,
содержащих значения некоторого типа
Слайд 11
Встроенные типы данных
В современных компьютерах к таким "машинным"
типам относятся
целые числа разного размера
(2-8 байтов)
Слайд 12
Встроенные типы данных
числа с плавающей точкой
одинарной и двойной точности
( 4 и 8 байт соответственно)
Слайд 13
Встроенные типы данных
Тип CHARACTER (или CHAR)
в разных языках - это
либо набор печатных символов из
алфавита, зафиксированного в описании языка (ASCII),
либо произвольная комбинация нулей и единиц, размещаемых в одном байте или 2 байтах
Слайд 14
Уточняемые типы данных
Type T = min..max;
ПРИМЕРЫ
Type year =
(1900 .. 2001);
digit = (‘0’
..’9’);
Var y : year;
d : digit;
Слайд 15
Перечисляемые типы данных
TYPE T = (C1,C2,...,Cn)
где Т — идентификатор нового типа,
Ci — идентификаторы новых констант
Слайд 16
Перечисляемые типы данных
ПРИМЕРЫ:
Type color =
(red, yellow, green);
destination = (hell, purgatory,
heaven);
Var c: color;
d: destination;
…
C := red;
D := heaven;
Слайд 17
Массивы
Type t = array [Ti] of To ;
Type
row = array [1.. 5] of real;
Type card = array
[1.. 80] of char;
Type alfa = array [0.. 15] of char;
…
Var x: row;
С:
int x[4]
int x[] = { 0, 2, 8, 22}
Слайд 18
Массивы
: array [n..k] of < тип >;
Слайд 19
Массивы
var m1:array[-2..2] of real;
Слайд 20
Массивы
Количество байтов непрерывной области памяти, занятых одновременно
вектором, определяется по формуле:
ByteSise = ( k - n
+ 1 ) * Sizeof (тип)
Слайд 21
Массивы
Обращение к i-тому элементу вектора выполняется по адресу
вектора плюс смещение к данному элементу.
Смещение i-ого элемента вектора
определяется по формуле:
ByteNumer = ( i- n ) * Sizeof (тип),
а адрес его:
@ ByteNumber = @ имя + ByteNumber.
где @ имя - адрес первого элемента вектора.
Слайд 22
Массивы
Информация, содержащаяся в дескрипторе вектора, должна позволять,
сократить
время доступа,
(A0 = @Имя - n*Sizeof(тип) )
обеспечивает проверку
правильности обращения (верхняя и нижняя границы массива).
Слайд 23 Массивы (многомерные)
Var Mas2D : Array [n1..k1 , n2..k2] of
< Тип >
Слайд 24
Массивы
Количество байтов памяти, занятых двумерным массивом, определяется по
формуле :
ByteSize = (k1-n1+1)*(k2-n2+1) *SizeOf(Тип)
Адресом массива является адрес
первого байта начального компонента массива.
Слайд 25
Массивы
Смещение к элементу массива
Mas[i1,i2] определяется по
формуле:
ByteNumber = [(i1-n1)*(k2-n2+1)+(i2-n2)] *SizeOf(Тип)
его адрес :
@ByteNumber =
@mas + ByteNumber
Слайд 26
Массивы
Например:
var Mas : Array [3..5] [7..8] of
Word;
Этот массив будет занимать в памяти:
(5-3+1)*(8-7+1)*2=12 байт;
а
адрес элемента Mas[4,8]:
@Mas+((4-3)*(8-7+1)+(8-7)*2 = @Mas+6
Слайд 27
Массивы
для двумерного массива c границами изменения индексов:
[B(1)..E(1)][B(2)..E(2)], размещенного в памяти по строкам, адрес элемента с индексами
[I(1),I(2)] может быть вычислен как:
Addr[I(1),I(2)] = Addr[B(1),B(2)] +
{ [I(1)-B(1)] * [E(2)-B(2)+1] + [I(2)-B(2)] } *SizeOf(Тип)
Слайд 28
Массивы
для массива произвольной размерности: Mas[B(1)..E(2)][B(2)..E(2)]...[B(n)..E(n)] получим:
Addr[I(1),I(2),...,I(n)]=Addr[B(1),B(2),...B(n)]
+ Sizeof(Тип)*∑ [B(m)*D(m)] +
Sizeof(Тип)* ∑ [I(m)*D(m)]
(m=1..n)
где Dm зависит от способа размещения массива. При размещении по строкам:
D(m)=[E(m+1)-B(m+1)+1]*D(m+1),
где m = n-1,...,1 и D(n)=1
Слайд 29
Массивы
При вычислении адреса элемента наиболее сложным является
вычисление третьей составляющей формулы, т.к. первые две не зависят от
индексов и могут быть вычислены заранее.
Для ускорения вычислений множители D(m) также могут быть вычислены заранее и сохраняться в дескрипторе массива
Слайд 30
Массивы
Дескриптор массива, таким образом, содержит:
начальный
адрес массива - Addr[I(1),I(2),...,I(n)];
число измерений в массиве - n;
постоянную составляющую формулы линеаризации (первые две составляющие формулы);
для каждого из n измерений массива:
значения граничных индексов - B(i), E(i);
множитель формулы линеаризации - D(i).
Слайд 31 Массивы
Представление массивов с помощью векторов Айлиффа
Для
массива любой мерности формируется набор дескрипторов: основного и несколько уровней
вспомогательных дескрипторов, называемых векторами Айлиффа
Каждый вектор Айлиффа определенного уровня содержит указатель на нулевые компоненты векторов Айлиффа следующего, более низкого уровня, а векторы Айлиффа самого нижнего уровня содержат указатели групп элементов отображаемого массива.
Слайд 32 Массивы
В Java имеется большое
количество классов и интерфейсов
для массивов и массивоподобных
структур:
Arrays, Vector, Collection, Map,
Hashtable,
LinkedList, ArrayList
Слайд 33 Массивы
В JDK 5.0 ArrayList был преобразован в универсальный
класс с параметром типа.
Массив, предназначенный для хранения объектов
Employee.
ArrayList staff = new ArrayList();
Слайд 34 Записи
Запись - конечное упорядоченное
множество полей, характеризующихся
различным типом
данных.
type complex = record re: real;
im: real
end ;
var x: complex;
C:
struct complex { float re;
float im;
}
struct complex x;
Слайд 35
Записи
struct { float re;
float im;
} x, y;
x=y; …
struct { float r;
float i;
} z;
Слайд 36
Записи
var rec:record
num :byte; { номер студента }
name :string[20]; { Ф.И.О. }
fac, group:string[7];
math,comp,lang:byte;{оценки}
end;
Слайд 37
Записи
Представление в виде последовательности полей, занимающих непрерывную область
памяти
АВТФ
8B50
Слайд 38
Записи
в виде связного списка с указателями на значения
полей записи
Слайд 39
Множества
Множество - такая структура, которая
представляет собой набор
неповторяющихся данных одного и того
же типа.
type T =set
of To
Примеры
type bitset = set of (0..15);
type tapestatus = set of exception;
var B : bitset;
t : array [1.. 6] of tapestatus;
Слайд 40
Множества
Множество в памяти хранится как массив битов, в
котором каждый бит указывает является ли элемент принадлежащим объявленному множеству
или нет.
Слайд 41
Множества
где @S - адрес данного типа множество.
Слайд 42
Множества
Число байтов, выделяемых для данных типа множество, вычисляется по
формуле:
ByteSize = (max div 8)-(min div 8) + 1,
где max и min - верхняя и нижняя
границы базового типа данного
множества.
Номер байта для конкретного элемента Е вычисляется по формуле:
ByteNumber = (E div 8)-(min div 8),
номер бита внутри этого байта по
формуле: BitNumber = E mod 8
Слайд 43
Множества
Например, S : set of byte;
S:=[15,19];
Содержимое памяти при этом будет следующим:
@S+0 - 00000000
@S+1 - 10000000
@S+2
- 00001000
. . . . . .
@S+31 – 0000000
Слайд 44
Указатели
Понятие указателя в языках программирования является абстракцией понятия машинного
адреса.
Подобно тому, как зная машинный адрес можно обратиться к
нужному элементу памяти, имея значение указателя, можно обратиться к соответствующей переменной.
var ipt : ^integer; cpt : ^char;
C:
int *ipt; char *cpt;
Слайд 45Динамическая память ( указатели )
Статическое распределение памяти
Динамическое распределение памяти
Os, Finder
библиотеки Паскаля
Исходный текст
Объектный код
Область динамического распределения
Рекурсивный
стек
Heap
Слайд 46Указатели
Описание переменных типа указатель
Type c = array [1..100]
of real;
Var p1 : ^integer ;
p2 : ^real ;
p3,p4 : ^c;
a, b : integer ;
p1 a
p2 b
p3
p4
p1 := nil ;.. p4 := nil; a := 5; b := 7;
Слайд 47Указатели
Процедуры работы с указателями:
New ( p )- выделить память в
Heap для переменной, на которую указывает p
Dispose ( p )-освободить
память в Heap, выделенную для переменной, на которую указывает p
Var p1, p2, p3: ^integer;
begin
New ( p1 );
p1^ := 10;
New ( p2 );
p2^ := 53;
p1
p1^
10
p2
p2^
53
p1
p2
Слайд 48Указатели
p1 := p2;
Dispose ( p1 );
Dispose (
p2 );
p1
p2
10
53
p1
p2
p1
p2
Слайд 49Указатели
Обмен данными массивов
Program DemoPointer;
Const n=1000;
Type mas = array [ 1..n] of integer;
Var p1,p2,p3 : ^mas;
i : integer;
Слайд 50Указатели
begin New (
p1 ); New ( p2 );
for i :=1 to n do
begin Write (‘Введи ’,i, ‘эл-т 1-го массива’ );
Readln (p1^[i]);
Write (‘Введи ’,i, ‘эл-т 2-го массива’ );
Readln (p2^[i])
end;
{ обмен данными }
p3 :=
p1;
p1:= p2;
p2 := p3;
...
Dispose ( p1 );
...