Содержание
- 2. Алгоритмизация и программирование. Язык Python § 35. Целочисленные алгоритмы
- 3. Решето Эратосфена Эратосфен Киренский (Eratosthenes, Ερατοσθδνη) (ок. 275-194 до н.э.) Новая версия – решето Аткина. 2
- 4. Решето Эратосфена Задача. Вывести все простые числа от 2 до N. Массив (сначала все не вычеркнуты):
- 5. Решето Эратосфена или так: from math import sqrt for k in range(2, int(sqrt(N))+1): if A[k]: #
- 6. Решето Эратосфена Вывод результата: for i in range(2,N+1): if A[i]: print ( i ) или так:
- 7. «Длинные» числа Ключи для шифрования: ≥ 256 битов. Целочисленные типы данных обычно ≤ 64 битов. Длинное
- 8. «Длинные» числа A = 12345678 неудобно вычислять (с младшего разряда!) неэкономное расходование памяти (одна цифра в
- 9. «Длинные» числа Упаковка элементов: 12345678 = 12·10002 + 345·10001 + 678·10000 система счисления с основанием 1000!
- 10. Вычисление факториала Задача 1. Вычислить точно значение факториала 100! = 1·2·3·…·99·100 1·2·3·…·99·100 201 цифра 6 цифр
- 11. Вычисление факториала основание d = 1 000 000 [A] = 12345678901734567 734 567·3 = 2 203
- 12. Вычисление факториала r = 0 for i in range(len(A)): s = A[i]*k + r A[i] =
- 13. Вывод длинного числа A = 1000002000003 вывести старший ненулевой разряд вывести все следующие разряды, добавляя лидирующие
- 14. Квадратный корень Задача. Извлечь квадратный корень из «длинного» целого числа; если это не целое число, найти
- 15. Квадратный корень Метод Герона в целых числах: x = (x + a // x)// 2 x
- 16. Квадратный корень Метод Герона в целых числах: def isqrt(a): x = a # начальное приближение while
- 17. Алгоритмизация и программирование. Язык Python § 36. Структуры
- 18. Зачем нужны структуры? Книги в библиотеках: автор название количество экземпляров … символьные строки целое число Задачa:
- 19. Структуры Структура – это тип данных, который может включать в себя несколько полей – элементов разных
- 20. Работа со структурами B = TBook() Заполнение: B.author = "Пушкин А.С." B.title = "Полтава" B.count =
- 21. Работа со структурами Обработка: B.author = "Пушкин А.С." fam = B.author.split()[0] # фамилия print ( fam
- 22. Массив структур Books = [TBook()]*100 Создание: Books[5].author = "Пушкин А.С." Books[5].title = "Полтава" Books[5].count = 1
- 23. Запись структур в CSV-файлы Пушкин А.С.,Полтава,12 Лермонтов М.Ю.,Мцыри,8 CSV = Comma Separated Values разделитель Текстовые файлы
- 24. Чтение структур из CSV-файлов Пушкин А.С.,Полтава,12 Лермонтов М.Ю.,Мцыри,8 Books = [] F = open( "library.csv" )
- 25. Сортировка структур Ключ – фамилия автора: # B – массив структур TBook N = len(B) for
- 26. Сортировка структур (в стиле Python) def getAuthor ( B ): return B.author Books.sort ( key =
- 27. Сортировка структур По убыванию (обратный порядок) : Books.sort ( reverse = True, key = lambda x:
- 28. Запись структуры в двоичный файл import pickle B = TBook() B.author = "Тургенев И.С." B.title =
- 29. Запись массива структур pickle.dump ( Books, F ) Сразу все: По одной структуре: for B in
- 30. Чтение структур из файла F = open ( "books.dat", "rb" ) B = pickle.load ( F
- 31. Чтение структур из файла Books = [] while True: try: B = pickle.load ( F )
- 32. Алгоритмизация и программирование. Язык Python § 37. Словари
- 33. Что такое словарь? Задача. В файле находится список слов, среди которых есть повторяющиеся. Каждое слово записано
- 34. Алгоритм (псевдокод) создать пустой словарь while есть слова в файле: прочитать очередное слово if слово есть
- 35. Работа со словарями в Python D = {} # пустой словарь Создание: D = { "бегемот":
- 36. Работа со словарями в Python Изменение с проверкой: if "самолёт" in D: D["самолёт"] += 1 else:
- 37. Основной цикл D = {} F = open ( "input.txt" ) while True: word = F.readline().strip()
- 38. Вывод результата allKeys = D.keys() Получить массив всех ключей: sortKeys = sorted(D.keys()) отсортировать ключи: или так:
- 39. Ещё о словарях for i in D.values(): print ( i ) Перебор значений: for k, v
- 40. Словарь и массив пар Массив (список) пар «ключ-значение»: A = list(D.items()) D = {"бам": 2, "там":
- 41. Словарь и массив пар Сортировка: A.sort() по ключам, если ключи равны – по значениям A.sort( key
- 42. Словарь и массив пар Вывод массива пар for x in A: print( x[0], ": ", x[1],
- 43. Алгоритмизация и программирование. Язык Python § 38. Стек, дек, очередь
- 44. Что такое стек? Стек (англ. stack – стопка) – это линейный список, в котором элементы добавляются
- 45. Реверс массива Задача. В файле записаны целые числа. Нужно вывести их в другой файл в обратном
- 46. Использование списка stack = [] Создать стек: stack.append ( x ) «Втолкнуть» x в стек: x
- 47. Инверсия массива неизвестной длины F = open ( "input.txt" ) stack = [] while True: s
- 48. Инверсия массива неизвестной длины F = open ( "output.txt", "w" ) while len(stack) > 0: x
- 49. Вычисление арифметических выражений (5+15)/(4+7-1) инфиксная форма (знак операции между данными) первой стоит последняя операция (вычисляем с
- 50. Вычисление арифметических выражений (5+15)/(4+7-1) 1950-е: постфиксная форма (знак операции после данных) не нужны скобки вычисляем с
- 51. Использование стека 5 15 + 4 7 + 1 - / 5 15 + 4 7
- 52. Вычисление постфиксной формы data = input().split() stack = [] for x in data: if x in
- 53. Скобочные выражения Задача. Вводится символьная строка, в которой записано некоторое (арифметическое) выражение, использующее скобки трёх типов:
- 54. Скобочные выражения (стек) когда встретили закрывающую скобку, на вершине стека лежит соответствующая открывающая в конце работы
- 55. Скобочные выражения (стек) pairs = {"(": ")", "[": "]", "{": "}"} stack = [] # пустой
- 56. Скобочные выражения (стек) for c in s: if c in pairs: stack.append( pairs[c] ) elif c
- 57. Что такое очередь? Очередь – это линейный список, для которого введены две операции: • добавление элемента
- 58. Управление очередью Queue = [] Подготовка: Queue.append( x ) Добавить элемент (в конец): x = Queue.pop(
- 59. Управление очередью Queue.append( 1 ) Queue.append( 2 ) x = Queue.pop( 0 ) Queue.append( 3 )
- 60. Заливка области Задача. Рисунок задан в виде матрицы A, в которой элемент A[y][x] определяет цвет пикселя
- 61. Заливка: использование очереди добавить в очередь точку (x0,y0) color = цвет начальной точки while очередь не
- 62. Заливка YMAX = len(A) XMAX = len(A[0]) NEW_COLOR = 2 y0 = 0 x0 = 1
- 63. Заливка (основной цикл) while len(Q) > 0: x, y = Q.pop(0) if A[y][x] == color: A[y][x]
- 64. Очередь: статический массив нужно знать размер не двигаем элементы голова хвост Удаление элемента: Добавление элемента:
- 65. Очередь: статический массив Замыкание в кольцо: Очередь заполнена: Очередь пуста:
- 66. Что такое дек? Дек – это линейный список, в котором можно добавлять и удалять элементы как
- 67. Алгоритмизация и программирование. Язык Python § 39. Деревья
- 68. Что такое дерево? «Сыновья» А: B, C. «Родитель» B: A. «Потомки» А: B, C, D, E,
- 69. Рекурсивные определения пустая структура – это дерево дерево – это корень и несколько связанных с ним
- 70. Деревья поиска Ключ – это значение, связанное с узлом дерева, по которому выполняется поиск. слева от
- 71. Обход дерева Обойти дерево ⇔ «посетить» все узлы по одному разу. ⇒ список узлов КЛП –
- 72. Обход дерева ЛПК: КЛП: ЛКП: * + 1 4 – 9 5 1 + 4 *
- 73. Обход КЛП – обход «в глубину» записать в стек корень дерева while стек не пуст: выбрать
- 74. Обход КЛП – обход «в глубину» * + 1 4 – 9 5
- 75. Обход «в ширину» записать в очередь корень дерева пока очередь не пуста: выбрать узел V из
- 76. Обход «в ширину» (1+4)*(9-5) * + - 1 4 9 5 голова очереди
- 77. Вспомогательные структуры ссылки на сыновей class TNode: data = "" left = None right = None
- 78. Создание дерева T = node("*", node("+", node("1"), node("4")), node("-", node("9"), node("5")) )
- 79. Обход дерева в глубину def DFS( T ): if not T: return print(T.data, end=" ") DFS(T.left)
- 80. Обход дерева в ширину def BFS ( T ): queue = [T] while queue: V =
- 81. Вычисление арифметических выражений 40–2*3–4*5 В корень дерева нужно поместить последнюю из операций с наименьшим приоритетом.
- 82. Вычисление арифметических выражений найти последнюю выполняемую операцию if операций нет: создать узел-лист return поместить операцию в
- 83. Вычисление арифметических выражений n1 = значение левого поддерева n2 = значение правого поддерева результат = операция(n1,
- 84. Использование связанных структур Дерево – нелинейная структура ⇒ динамический массив неудобен! class TNode: data = ""
- 85. Основная программа s = input ( "Введите выражение: " ) T = makeTree ( s )
- 86. Построение дерева def makeTree ( s ): k = lastOp(s) # номер последней операции if k
- 87. Вычисление по дереву def calcTree ( Tree ): if Tree.left == None: return int(Tree.data) else: n1
- 88. Вспомогательные функции def priority ( op ): if op in "+-": return 1 if op in
- 89. Двоичное дерево в массиве ? ?
- 90. Алгоритмизация и программирование. Язык Python § 40. Графы
- 91. Что такое граф? Граф – это набор вершин и связей между ними (рёбер). петля Матрица смежности:
- 92. Связность графа Связный граф – это граф, между любыми вершинами которого существует путь.
- 93. Дерево – это граф? дерево ABC ABDC BCD CCC… Дерево – это связный граф без циклов
- 94. Взвешенные графы Весовая матрица: вес ребра
- 95. Ориентированные графы (орграфы) Рёбра имеют направление (начало и конец), рёбра называю дугами.
- 96. Жадные алгоритмы Жадный алгоритм – это многошаговый алгоритм, в котором на каждом шаге принимается решение, лучшее
- 97. Жадные алгоритмы Задача. Найти кратчайший маршрут из А в F.
- 98. Задача Прима-Крускала Задача. Между какими городами нужно проложить линии связи, чтобы все города были связаны в
- 99. Раскраска вершин 4 B 2 1 2 9 7 8 1 3 D E F A
- 100. Раскраска вершин N = 6 INF = 30000 # очень большое число W = [] for
- 101. Раскраска вершин ostov = [] # список выбранных рёбер for k in range(N-1): minDist = INF
- 102. Кратчайший маршрут Алгоритм Дейкстры (1960): ближайшая от A невыбранная вершина кратчайшее расстояние от A выбрана?
- 103. Кратчайший маршрут Алгоритм Дейкстры (1960): W[x,z] + W[z,y] может быть так, что 9
- 104. Кратчайший маршрут Алгоритм Дейкстры (1960): W[x,z] + W[z,y] может быть так, что 5
- 105. Кратчайший маршрут Алгоритм Дейкстры (1960): 7 8 длины кратчайших маршрутов из A в другие вершины
- 106. Как найти сам кратчайший маршрут? A → C → E → F dist[D] + DF =
- 107. Алгоритм Дейкстры N = 6 W = [] for i in range(N): W.append ( [0]*N )
- 108. Алгоритм Дейкстры minDist = 0 while minDist selected[V] = True # проверка маршрутов через вершину V
- 109. Алгоритм Дейкстры V = N - 1 print(V) while V != start: for i in range(N):
- 110. Алгоритм Флойда for k in range(N): for i in range(N): for j in range(N): if W[i][k]
- 111. Списки смежности вершина 1: ( 4 ) вершина 2: ( 1, 3 ) вершина 3: (
- 112. Списки смежности Graph = [[], [4], [1,3], [], [2,3,5], [3]] print ( pathCount (Graph, 1, 3,
- 113. Число путей: функция def pathCount ( graph, vStart, vEnd, visited ): if vStart == vEnd: return
- 114. Задача коммивояжера Коммивояжер (бродячий торговец) должен выйти из города 1 и, посетив по разу в неизвестном
- 115. Некоторые задачи Задача на минимум суммы. Имеется N домов, в каждом из которых живет pi жителей
- 116. Алгоритмизация и программирование. Язык Python § 41. Динамическое программирование
- 117. Что такое динамическое программирование? Числа Фибоначчи: ; . F1 = F2 = 1 Fn = Fn-1
- 118. Динамическое программирование Создание массива: F = [1]*(N+1) # чтобы начать с 1 Заполнение массива: for i
- 119. Динамическое программирование Динамическое программирование – это способ решения сложных задач путем сведения их к более простым
- 120. Количество вариантов Задача. Найти количество KN цепочек, состоящих из N нулей и единиц, в которых нет
- 121. Количество вариантов Задача. Найти количество KN цепочек, состоящих из N нулей и единиц, в которых нет
- 122. Оптимальное решение Задача. В цистерне N литров молока. Есть бидоны объемом 1, 5 и 6 литров.
- 123. Оптимальное решение Сначала выбрали бидон… KN – минимальное число бидонов для N литров KN = 1
- 124. Оптимальное решение (бидоны) 1 1 2 1 3 1 4 1 1 5 1 6 2
- 125. Задача о куче Задача. Из камней весом pi (i=1, …, N) набрать кучу весом ровно W
- 126. Задача о куче Задача. Из камней весом pi (i=1, …, N) набрать кучу весом ровно W
- 127. Задача о куче Добавляем камень с весом 4: для w 0 2 2 для w ≥
- 128. Задача о куче Добавляем камень с весом 5: для w 0 2 2 4 5 6
- 129. Задача о куче Добавляем камень с весом 7: для w 0 2 2 4 5 6
- 130. Задача о куче Добавляем камень с весом pi: для w Рекуррентная формула:
- 131. Задача о куче Оптимальный вес 7 5 + 2
- 132. Задача о куче Заполнение таблицы: W+1 N псевдополиномиальный
- 133. Количество программ Задача. У исполнителя Утроитель есть команды: 1. прибавь 1 2. умножь на 3 Сколько
- 134. Количество программ Как получить число N: N если делится на 3! последняя команда Рекуррентная формула: KN
- 135. Количество программ Заполнение таблицы: Рекуррентная формула: KN = KN-1 если N не делится на 3 KN
- 136. Количество программ Только точки изменения: 12 20 Программа: K = [0]*(N+1) K[1] = 1 for i
- 137. Размен монет Задача. Сколькими различными способами можно выдать сдачу размером W рублей, если есть монеты достоинством
- 138. Размен монет Пример: W = 10, монеты 1, 2, 5 и 10 w pi базовые случаи
- 139. Размен монет Пример: W = 10, монеты 1, 2, 5 и 10 Рекуррентная формула (добавили монету
- 140. Конец фильма ПОЛЯКОВ Константин Юрьевич д.т.н., учитель информатики ГБОУ СОШ № 163, г. Санкт-Петербург kpolyakov@mail.ru ЕРЕМИН
- 142. Скачать презентацию