Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Билеты АиСД.docx
Скачиваний:
5
Добавлен:
08.12.2023
Размер:
8.06 Mб
Скачать

5.Нотации алгебраических выражений.

Существует 3 нотации записи алгебраических выражений:

  • инфиксная: (2 + 2) * 2= 8

  • префиксная (польская нотация): * + 2 2 2= 8

  • постфиксная (обратная польская нотация): 2 2 + 2 * = 8

Инфиксная нотация понятна человеку. В то же время, машине ее трудно обработать (из-за скобок). Поэтому для вычисления алгебраических выражений их обычно преобразуют из инфиксной в префиксную или в постфиксную нотацию.

Вычисление с помощью постфиксной нотации гораздо проще и эффективнее префиксной нотации, и потому часто используется на практике.

Преобразование из инфиксной в постфиксную форму происходит с помощью алгоритма Дейкстры.

  • число в результирующую строку

  • оператор в стек

  • Выталкиваем в выходную строку из стека все операторы, имеющие приоритет выше рассматриваемого;

  • открывающую скобку в стек

  • закрывающая скобка переносит операторы (до первой открывающей скобки) в результирующую строку

Вычисление постфиксной нотации:

  • число - заносим в стек

  • бинарный оператор - убираем 2 элемента из стека, выполняем операцию, результат заносим в стек.

  • унарный оператор - убираем 1 элемент из стека, выполняем операцию, результат заносим в стек.

  • последнее значение является решением выражения

6. Поиск в линейных структурах данных (последовательный поиск, барьеры, бинарный поиск, метод интерполяций)

линейный поиск всем итак понятен.

Барьерный поиск - улучшение линейного поиска. вместо лишней проверки не вышли ли мы за границы массива добавляется “барьер” равный искомому элементу в конец массива. Если мы в него уперлись, то мы проверяем не является ли этот барьер - искомым элементом.

Бинарный поиск работает только для сортированных массивов. Ищем элемент в середине. Если он найден, то возвращаем индекс. Если элемент меньше искомого, ищем в левой половине массива, иначе в правой.

Интерполяционный поиск похож на бинарный. Он тоже работает только для сортированных массивов. Быстро работает при равномерном распределении данных. Медленнее всего работает если каждый элемент растет экспоненциально

int search_linear(int* arr, int size, int elem) {

for(int i = 0; i < size; ++i)

if(arr[i] == elem)

return i;

return -1;

}

int search_barrier(int* arr, int size, int elem) {

if(size > 0) {

int last = arr[size - 1];

arr[size - 1] = elem; // гарантируем существование элемента elem

int i = 0;

for(i = 0; i != elem; ++i) {} // обходим массив

arr[size - 1] = last;

if(i != (size - 1) || elem == last) // не уткнулись в барьер

// или последний элемент - искомый

{

return i;

}

}

return -1;

}

int search_binary(int* arr, int size, int elem) {

int l = 0; // левая граница

int r = size; // правая граница

while(l <= r) {

int m = l + (r - l) / 2; // срединный элемент

if(arr[m] == elem) return m; //элемент найден

if(arr[m] < x) l = m + 1 //элемент справа

else r = m - 1 // элемент слева

}

return -1

}

int search_interpolation(int* arr, int first, int last, int elem) {

int pos;

if(first <= last && elem >= arr[first] && elem <= arr[last])

{

pos = first + (((double) (last - first) / (arr[last] - arr[first])) * (elem - arr[last]));

if(arr[pos] == elem) return pos;

if(arr[pos] < elem) return search_interpolation(arr, pos + 1; last, elem)

if(arr[pos] > elem) return search_interpolation(arr,first; pos - 1, elem)

}

return -1;

}

Соседние файлы в предмете Алгоритмы и структуры данных