- •Передачу параметров в функцию по значению, а не по ссылке (при этом передача по ссылке эмулируется с помощью указателей);
- •Области действия имён; (область видимости переменной).
- •Достоинства:
- •Представление целых чисел в эвм
- •Основные типы данных, операции над ними.
- •Операции
- •Преобразование типов
- •Особенности операций для вещественных чисел
- •3.1. Операторы и блоки.
- •3.2. Оператор if – else
- •3.3. Конструкция else-if.
- •3.4. Оператор switch
- •3.5. Циклы while и for
- •3.6. Цикл do-while
- •3.7. Операторы break и continue
- •3.8. Оператор goto и метки
- •3.9. Оператор return
- •Инвариант
- •Указатели
- •Массивы
- •Связь между указателями и массивами
- •Представление в эвм
- •Создание указателя на массив
- •Инициализация массивов
- •Операции над указателями
- •Замечание! 2 указателя нельзя суммировать, но можно прибавлять константу. Сравнивать допустимо только с указателями того же типа или с null
- •Метод барьера в линейном поиске
- •Метод барьера при быстрой сортировке массива
- •Сортировка методом вставки. В отсортированной части массива последний элемент – барьер.
- •Процедуры
- •Локальные и глобальные переменные
- •Локальные переменные
- •Глобальные переменные
- •Средний и наихудший случай
- •Дополнительно (то же самое)
- •Анализ эффективности алгоритмов не должен зависеть от:
- •Временная сложность алгоритма
- •Некоторые свойства временной сложности алгоритма (функции f(n) )
- •Характеристики рекурсии
- •Виды рекурсии
- •Когда не нужно применять рекурсию
- •Применение эвристик.
- •Метод ветвей и границ (доп. Из Wikipedia)
- •Алгоритм Неймана.
- •Линейный конгруэнтный метод
- •Выбор параметров, выбор модуля и множителя.
- •Сдвиг на несколько символов: Если не совпадает , то сдвигаем образ вправо до последнего его стоп-символа. Если «стоп-символа» вообще нет в образе, то образ смещается за этот символ.
- •Вопросы на экзамен по информатике:
- •Перевести отрицательное целое число (он любое может назвать) в дополнительный код.
- •Есть ли смысл применять метод барьера в поиске подстроки в строке?
- •Задачи на экзамене:
- •Задача о Ханойских башнях
- •Бинарный поиск элемента в массиве
- •Сумма цифр в числе
- •Число различных элементов в символьном массиве
- •Сгенерировать все перестановки в целочисленном массиве (Билет 1).
- •Функция, возвращающая I и j такие, чтобы сумма эл-тов в I-ой строке равнялась сумме в j-ом столбце.
- •Есть одномерный массив целых чисел и нужно построить функцию, получающую на вход вещественное число X и возвращающую индекс элемента, который ближе всего к этому числу.
- •Функция strcpy (char *s1, char *s2) , билет 12.
- •Реализация strcat(); Билет 7.
- •Билет 5. Функция, выдаёт частное и остаток от деления X на y, нельзя пользоваться / и % .
- •Метод генерации случайной перестановки ( Тасование Фишера-Йетса).(не ок)
Метод барьера в линейном поиске
Если нет дополнительной информации о данных, то используется простой последовательный просмотр массива .
Условие окончания поиска:
Элемент найден, а[i]=x;
Весь массив просмотрен и нет совпадения.
Линейный поиск имеет сложность О(n). В связи с малой эффективностью по сравнению с другими алгоритмами линейный поиск обычно используют только если отрезок поиска содержит очень мало элементов, тем не менее линейный поиск не требует дополнительной памяти или обработки/анализа функции, так что может работать в потоковом режиме при непосредственном получении данных из любого источника. Так же, линейный поиск часто используется в виде линейных алгоритмов поиска максимума/минимума.
Метод фиктивного элемента (метод барьера) в линейном поиске – метод, позволяющий сократить количество сравнений за счет расположения в конце массива искомого элемента:
Следует обратить внимание, что если элемент найден, то он найден вместе с минимально возможным индексом, т. е. это первый из таких элементов. Равенство i=N свидетельствует, что совпадения не существует. Очевидно, что окончание цикла гарантировано, поскольку на каждом шаге значение i увеличивается, и, следовательно, оно достигнет за конечное число шагов предела N; фактически же, если совпадения не было, это произойдет после N шагов. На каждом шаге алгоритма осуществляется увеличение индекса и вычисление логического выражения. Можно упростить шаг алгоритма, если упростить логическое выражение, которое состоит из двух членов. Это упрощение осуществляется путем формулирования логического выражения из одного члена, но при этом необходимо гарантировать, что совпадение произойдет всегда. Для этого достаточно в конец массива поместить дополнительный элемент со значением x. Такой вспомогательный элемент называется барьером. Нельзя применять, когда передаётся массив фиксированной длины. Без барьера:
int A[N]; int x,i=0;
while (i<N&&A[i]!=x) i++;
if (i<N) элемент найден
else элемента в массиве нет
Поиск прекращается, если : элемент найден, т.е. A[i]=x, или просмотрен массив и элемент не найден. На каждом шаге приходится проверять условие и сдвигать счётчик на 1. Можно упростить, упростив условие цикла. Для этого нужно составить одно условие, из которого будут вытекать оба. В данном поиске это возможно если элемент Х будет гарантированно найден в массиве А. Это можно обеспечить, поместив Х в последний дополнительный элемент массива. Такой элемент называется барьером, т.к. он предотвращает выход поиска за границы массива. Из i=N следует, что искомого значения нет, кроме барьера.
С барьером:
int A[N+1]; int x, i=0; A[N]=x;
while (A[i]!=x) i++:
if (i<N) элемент найден
else элемента в массиве нет
Бинарный поиск
Массив отсортирован.
Идея
поиска заключается в том, чтобы брать
элемент посередине, между границами, и
сравнивать его с искомым. Если искомое
больше(в случае правостороннего — не
меньше), чем элемент сравнения, то сужаем
область поиска так, чтобы новая левая
граница была равна индексу середины
предыдущей области. В противном случае
присваиваем это значение правой границе.
Проделываем эту процедуру до тех пор,
пока правая граница больше левой более
чем на
.
В случае правостороннего бинарного
поиска ответом будет индекс
,
а в случае левостороннего —
.
int binsearch(int x, int v[], int n)
{
int low, high, mid;
low = 0;
high = n - 1;
while (low <= high) {
mid = (low+high)/2;
if (x < v[mid])
high = mid + 1;
else if (x > v[mid])
low = mid + 1;
else /* found match */
return mid;
}
return -1; /* no match */
1). Если сумма указателей не помещается в тип
2). Вернёт -1 при н=0
Правосторонний
бинарный поиск (англ. rightside
binary search)
— бинарный поиск, с помощью которого
мы ищем |
Определение: |
Левосторонний
бинарный поиск (англ. leftside
binary search)
— бинарный поиск, с помощью которого
мы ищем |
Использовав
эти два вида двоичного поиска, мы можем
найти отрезок позиций
таких,
что
и
Например:
Задан
отсортированный массив
.
Правосторонний
поиск двойки выдаст в результате
,
в то время как левосторонний
выдаст
(нумерация
с единицы).
От
сюда следует, что количество подряд
идущих двоек равно длине отрезка
,
то есть
.
Если искомого элемента в массиве нет, то правосторонний поиск выдаст минимальный элемент, больший искомого, а левосторонний наоборот, максимальный элемент, меньший искомого.
Анализ
Каждый раз делим массив пополам, тогда деление K раз равно n/2^k =1, k = log(2)n, что лучше, чем N.
