чернякова г.в

Preview:

Citation preview

Чернякова Ганна

Валентинівна

Дата народження: 10 грудня 1950 року. Кредо: “ Понимать , что справедливо ,чувствовать.” Освіта: вища. Дніпропетровський державний університет. 1973 рік

випуску. Спеціальність: математик,математик-обчислювач. Посада:вчитель інформатики, вища категорія, старший вчитель. Педагогічний стаж:20 років. Нагороди:знак -” Відмінник освіти України ”,ПОЧЕСНА ГРАМОТА-

управління освіти та науки Дніпропетровської міської ради 2002рік, ПОДЯКА - Самарська района у м. Дніпропетровську Рада-№61 від 26.06.2006р.,ГРАМОТА-головне управління освіти і науки Дніпропетровської обласної державної адміністрації-жовтень 2008року.

Сертифікат №38/Д4РТ . Курс-Intel навчання для майбутнбого

Кваліфікаційне посвідчення: №2502 від 21.06.2003 р.   

Тема самоосвіти:”Розвиток та формування логічного мислення учнів, розкриття творчого потенціалу учнів.”

Використання сучасних методик та технологій навчання:метод проектів, інтерактивні методи, диференційовано-індивідуальну систему завдань, пошукові. Результативність роботи: Хащин Андрій - 2008 р. переможець в олімпіаді з програмування.

Форми узагальнення досвіду роботи:розробки практичних робіт для 10класів, розробки лекцій та практичних робіт для 11 класів

Классификация алгоритмов по структуре:Линейный (следование)Разветвленный (ветвление, выбор,

альтернатива)Циклический (повтор)ВспомогательныйКомбинированный

Алгоритм – это строго определенная последовательность действий при решении задачи.

Алгоритм содержит несколько шагов.

Шаг  алгоритма – это каждое отдельное действие алгоритма.

Исполнитель – это объект, умеющий выполнять определенный набор действий. Исполнителем может быть человек, робот, животное, компьютер.

Система команд исполнителя (СКИ) – это все команды, которые исполнитель умеет выполнять.

Среда исполнителя – обстановка, в которой функционирует исполнитель.

Задание: Назови исполнителей следующих видов работы:

Уборка мусора во двореОбучение детей в школеВождение автомобиляОтвет у доскиПриготовление пищиПечатание документа на принтере

АЛГОРИТМ

Результативность

Детерминированность

Дискретность

Конечность

Массовость

Свойства алгоритмаСвойства алгоритма

Дискретность Дискретность (прерывность, раздельность) – разбиение алгоритма на шаги

Результативность Результативность – получение результата за конечное количество шагов

Массовость Массовость – использование алгоритма для решения однотипных задач

Детерминированность Детерминированность (определенность, точность) – каждое действие должно строго и недвусмысленно определено

Конечность Конечность – каждое действие в отдельности и алгоритм в целом должны иметь возможность завершения

Классификация алгоритмов по форме представления:

СловесныеТабличныеГрафические (блок-схемы)Программные

Таблица основных условных обозначений в блок-схемах

Условное обозначение

Назначение блока

Начало или конец алгоритма

Ввод или вывод данных.

Внутри блока перечисляются данные через запятую.

Процесс.Внутри блока записываются

матем. формулы и операции для обработки данных.

Проверка условия.Внутри блока записываются

логические условия. Имеет два выхода Да(+) и Нет(-).

Направление.

Линейный алгоритм – это алгоритм, шаги которого выполняются последовательно друг за другом. (Пример: алгоритм сбора портфеля).

Задача

Вычислить периметр произвольного треугольника по его трем сторонам.

Решение:

1 этап: Постановка задачи.

Исходные данные: А, B, C – стороны произвольного треугольника

Выходные данные: P – периметр треугольника.

2 этап: Математическая модель.

P=A+B+С

3 этап: Алгоритм.Начало

Ввод A, B, C

P=A+B+C

ВыводP

Конец

3 этап: Составление алгоритма

Базовая структура линейного алгоритма:

Начало

Серия команд 1

Серия команд N

Серия команд 2

Конец

Задание:

Нарисовать в Приложении PAINT ракету и описать алгоритм построения (словесно).

Вспомните:Что такое алгоритм?Приведите примеры алгоритмов.Что такое исполнитель?Приведите примеры исполнителей.

Формы записи алгоритмов

Будем рассматривать алгоритмы, исполнителем которых является человек.

Запись алгоритмов при решении задачи

Нумерованныйсписок

Блок -схема

Таблица

Блок - схема

Геометрические фигуры,обозначающие шаги

алгоритма:

Овал

Начало или конец

ИзображениеОбозначаемый шаг алгоритма

Параллелограмм

Ввод или вывод

ИзображениеОбозначаемый шаг алгоритма

Ромб

Принятие решения

ИзображениеОбозначаемый шаг алгоритма

Да

Нет

Прямоугольник

Выполнение действия

ИзображениеОбозначаемый шаг алгоритма

Стрелки

Связывают фигуры, задают порядок выполнения соответствующих шагов

Пример алгоритма:действия человека при переходе улицы

Начало

Подойти к переходу

Дождаться зеленого света

Перейти улицу

Конец

Правильный алгоритм:

1.Налить в чайник воду. 2. Зажечь спичку. 3. Открыть кран газовой горелки. 4. Поднести спичку к горелке. 5. Поставить чайник на плиту. 6. Ждать, пока вода закипит. 7. Выключить газ.

1. Алгоритм Евклида2. Решето Эратосфена3. Длинные числа4. Целочисленная оптимизация

Тема 1. Алгоритм Евклида

33

Вычисление НОД

НОД = наибольший общий делитель двух натуральных чисел – это наибольшее число, на которое оба исходных числа делятся без остатка.

Перебор:k = a; // или k = b;while ( a % k != 0 || b % k != 0 ) k --;printf ("НОД(%d,%d)=%d", a, b, k);

k = a; // или k = b;while ( a % k != 0 || b % k != 0 ) k --;printf ("НОД(%d,%d)=%d", a, b, k);

много операций для больших чисел

ИЛИИЛИ

34

Алгоритм Евклида

Евклид(365-300 до. н. э.)

НОД(a,b)= НОД(a-b, b) = НОД(a, b-a)НОД(a,b)= НОД(a-b, b) = НОД(a, b-a)

Заменяем большее из двух чисел разностью большего и меньшего до тех пор, пока они не станут равны. Это и есть НОД.

НОД (14, 21) = НОД (14, 21-14) = НОД (14, 7)

НОД (1998, 2) = НОД (1996, 2) = … = 2

Пример:

много шагов при большой разнице чисел:

= НОД (7, 7) = 7

35

Модифицированный алгоритм Евклида

НОД(a,b)= НОД(a%b, b) = НОД(a, b%a)НОД(a,b)= НОД(a%b, b) = НОД(a, b%a)

Заменяем большее из двух чисел остатком от деления большего на меньшее до тех пор, пока меньшее не станет равно нулю. Тогда большее — это НОД.

НОД (14, 21) = НОД (14, 7) = НОД (0, 7) = 7Пример:

Еще один вариант:

НОД(2·a,2·b)= 2·НОД(a, b) НОД(2·a,b)= НОД(a, b) // при нечетном bНОД(2·a,2·b)= 2·НОД(a, b) НОД(2·a,b)= НОД(a, b) // при нечетном b

36

Реализация алгоритма Евклида

Рекурсивный вариант: Без рекурсии:

int NOD ( int a, int b ){ if ( a == b ) return a; if ( a < b ) return NOD ( a, b-a ); else return NOD ( a-b, b );}

int NOD ( int a, int b ){ if ( a == b ) return a; if ( a < b ) return NOD ( a, b-a ); else return NOD ( a-b, b );}

int NOD ( int a, int b ){ while ( a != b ) if ( a > b ) a -= b; else b -= a;return a;}

int NOD ( int a, int b ){ while ( a != b ) if ( a > b ) a -= b; else b -= a;return a;}

int NOD ( int a, int b ){ if ( a*b == 0 ) return a + b; if ( a < b ) return NOD ( a, b%a ); else return NOD ( a%b, b );}

int NOD ( int a, int b ){ if ( a*b == 0 ) return a + b; if ( a < b ) return NOD ( a, b%a ); else return NOD ( a%b, b );}

int NOD ( int a, int b ){ while ( a*b != 0 ) if ( a > b ) a = a % b; else b = b % a; return a + b;}

int NOD ( int a, int b ){ while ( a*b != 0 ) if ( a > b ) a = a % b; else b = b % a; return a + b;}

Почему return a+b? Почему return a+b??

Тема 2. Решето Эратосфена

38

Поиск простых чиселПростые числа – это числа, которые делятся только на себя и на 1.Применение:

1) криптография;2) генераторы псевдослучайных чисел.

Наибольшее известное (сентябрь 2006):232582657 − 1 (содержит 9 808 358 цифр).

Задача. Найти все простые числа в интервале от 1 до заданного N.Простое решение:

for ( i = 1; i <= N; i++ ) { isPrime = 1; for ( k = 2; k < i ; k++ ) if ( i % k == 0 ) { isPrime = 0; break; } if ( isPrime ) printf("%d\n", i); }

for ( i = 1; i <= N; i++ ) { isPrime = 1; for ( k = 2; k < i ; k++ ) if ( i % k == 0 ) { isPrime = 0; break; } if ( isPrime ) printf("%d\n", i); }

k*k <= i

Как уменьшить число шагов внутреннего цикла? Как уменьшить число шагов внутреннего цикла??

Как оценить число операций? Как оценить число операций??

<=k i k*k <= i k*k <= i

O(N2) O(N2) растет не быстрее N2

39

Решето Эратосфена

Эратосфен Киренский(Eratosthenes, Ερατοσθδνη)

(ок. 275-194 до н.э.)

Новая версия – решето Аткина .

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

Алгоритм:1) начать с k = 2;2) «выколоть» все числа через k, начиная с 2·k;3) перейти к следующему «невыколотому» k;4) если k·k <= N, то перейти к шагу 2;5) напечатать все числа, оставшиеся «невыколотыми».

высокая скорость, количество операций

нужно хранить в памяти все числа от 1 до N

O((N·log N)·log log N )O((N·log N)·log log N )

22 33

40

Реализация

// сначала все числа не выколоты

for ( i = 1; i <= N; i ++ ) A[i] = 1;

// основной цикл

for ( k = 2; k*k <= N; k ++ ) if ( A[k] != 0 ) for ( i = k+k; i <= N; i += k ) A[i] = 0;

// выводим оставшиеся числа

for ( i = 1; i <= N; i ++ )

if ( A[i] == 1 ) printf ( "%d\n", i );

// сначала все числа не выколоты

for ( i = 1; i <= N; i ++ ) A[i] = 1;

// основной цикл

for ( k = 2; k*k <= N; k ++ ) if ( A[k] != 0 ) for ( i = k+k; i <= N; i += k ) A[i] = 0;

// выводим оставшиеся числа

for ( i = 1; i <= N; i ++ )

if ( A[i] == 1 ) printf ( "%d\n", i );

Массив A[N+1], где A[i]=1, если число i не «выколото», A[i]=0, если число i «выколото».

Тема 3. Длинные числа

42

Что такое длинные числа?

Задача. Вычислить (точно)100! = 1·2·3·...·99·100

Проблема: это число содержит более 100 цифр…

Решение: хранить цифры в виде массива, по группам (например, 6 цифр в ячейке).

Сколько нулей в конце этого числа? Сколько нулей в конце этого числа?? Какая последняя ненулевая цифра? Какая последняя ненулевая цифра??

Сколько ячеек нужно? Сколько ячеек нужно?? 100! < 100100

201 цифра201/6 ≈ 34 ячейки201/6 ≈ 34 ячейки

43

Хранение длинных чисел

1234 568901 734567 = = 1234·10000002 + 568901·10000001 + 734567·10000000

Хранить число по группам из 6 цифр – это значит представить его в системе счисления с основанием d = 1000000.

{A} = 1;for ( k = 2; k <= 100; k ++ )

{ A} = {A} * k;

... // вывести { A}

{A} = 1;for ( k = 2; k <= 100; k ++ )

{ A} = {A} * k;

... // вывести { A}

Алгоритм: {A} – длинное число, хранящееся как массив{A} – длинное число, хранящееся как массив

умножение длинного числа на

«короткое»

умножение длинного числа на

«короткое»

На что это похоже? На что это похоже??

44

Умножение длинного числа на короткое

1234 568901 734567× 3 3703 706705 203701

kk

a0a0a1a1a2a2

c0c0c1c1c2c2

734567·3 = 2 203701c0c0перенос, r1перенос, r1

568901·3 + 2 = 1 706705c1c1r2r2

1234·3 + 1 = 3703 c2c2

c0 = ( a0·k + 0) % dr1 = ( a0·k + 0) / d

c1 = ( a1·k + r1) % dr2 = ( a1·k + r1) / d

c2 = ( a2·k + r2) % dr3 = ( a2·k + r2) / d...

c0 = ( a0·k + 0) % dr1 = ( a0·k + 0) / d

c1 = ( a1·k + r1) % dr2 = ( a1·k + r1) / d

c2 = ( a2·k + r2) % dr3 = ( a2·k + r2) / d...

45

Вычисление 100!

const long d = 1000000L; // основание системыlong A[40] = {1}, // A[0]=1, остальные A[i]=0 s, r; // произведение, остаток int i, k, len = 1; // len – длина числа

for ( k = 2; k <= 100; k ++ ) { i = 0; r = 0; while ( i < len || r > 0 ) { s = A[i]*k + r; A[i] = s % d; // остается в этом разряде r = s / d; // перенос i ++; } len = i; // новая длина числа }

const long d = 1000000L; // основание системыlong A[40] = {1}, // A[0]=1, остальные A[i]=0 s, r; // произведение, остаток int i, k, len = 1; // len – длина числа

for ( k = 2; k <= 100; k ++ ) { i = 0; r = 0; while ( i < len || r > 0 ) { s = A[i]*k + r; A[i] = s % d; // остается в этом разряде r = s / d; // перенос i ++; } len = i; // новая длина числа }

пока не кончились цифры числа {A} или

есть перенос

пока не кончились цифры числа {A} или

есть перенос

Где результат? Где результат?? Можно ли брать другое d? Можно ли брать другое d??

46

Как вывести длинное число?«Первая мысль»:

for ( i = len-1; i >= 0; i -- ) printf ( "%ld", A[i] );for ( i = len-1; i >= 0; i -- ) printf ( "%ld", A[i] );

Что плохо? Что плохо??Проблема:

как не потерять первые нули при выводе чисел, длина которых менее 6 знаков?

Решение:1) составить свою процедуру;2) использовать формат "%.6ld"!

for ( i = len-1; i >= 0; i -- ) if ( i == len-1 ) printf ( "%ld", A[i] ); else printf ( "%.6ld", A[i] );

for ( i = len-1; i >= 0; i -- ) if ( i == len-1 ) printf ( "%ld", A[i] ); else printf ( "%.6ld", A[i] );

47

Задания

"4": Составить программу для вычисления

99!! = 1·3·...·97·99

"5": То же самое, но написать свою процедуру для вывода (не использовать формат "%.6ld").

“6": Написать программу для умножения двух длинных чисел (ввод из файла).

“7": Написать программу для извлечения квадратного корня из длинного числа (ввод из файла).

Тема 4. Целочисленная оптимизация

49

Задачи целочисленной оптимизацииОптимизация:

min)( →xf при заданных ограниченияхЦелочисленная оптимизация:

x – вектор (массив) целых чисел

Комбинаторная оптимизация:

x – вектор (массив) целых чисел, причем все его элементы принадлежат заданному набору чисел

при малом количестве вариантов можно решить простым перебором

при большом количестве вариантов на решение перебором может потребоваться огромное время (для ряда задач другие алгоритмы неизвестны)

50

Задача коммивояжераЗадача коммивояжера. Коммивояжер (бродячий торговец) должен

выйти из первого города и, посетив по разу в неизвестном порядке города 2,3,...N, вернуться обратно в первый город. В каком порядке надо обходить города, чтобы замкнутый путь (тур) коммивояжера был кратчайшим?

Это NP-полная задача, которая строго решается только перебором вариантов (пока)!

Это NP-полная задача, которая строго решается только перебором вариантов (пока)!!!Точные методы:

1) простой перебор;2) метод ветвей и границ;3) метод Литтла;4) …

Приближенные методы:1) метод случайных перестановок (Matlab);2) генетические алгоритмы;3) метод муравьиных колоний;4) …

большое время счета для больших N O(N!)O(N!)

не гарантируется оптимальное решение

51

Метод случайных перестановокЧто представляет собой решение?

перестановка чисел 2,3,...N.комбинаторна

я задачакомбинаторна

я задача

1111 33 55 22 44 1111

Алгоритм:1) записать в массив x перестановку

2 3 … Nнайти длину маршрута 1 2 3 … N 1 и записать ее в Lmin;

2) выбрать случайно два элемента массива x и поменять их местами;

3) найти длину маршрута, соответствующего x и, если она меньше Lmin, записать ее в Lmin и запомнить перестановку;

4) если число шагов меньше заданного, перейти к шагу 2.