Добавил:
СПбГУТ * ИКСС * Программная инженерия Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Коды основных функций / [Код основных функций] Лаб. 2. Часть 1

.pdf
Скачиваний:
41
Добавлен:
03.08.2020
Размер:
60.88 Кб
Скачать

[Код основных функций] Лабораторная работа №2. Часть 1. Поиск чисел

//Get the current time.

//This function should be used only for measuring time

//(first call, algorithm, second call; then the difference between the values) double getProcTime() {

#if defined(_WIN32) // If Windows:

FILETIME createTime, exitTime, kernelTime, userTime;

if (GetProcessTimes(GetCurrentProcess(), &createTime, &exitTime, &kernelTime, &userTime) != -1)

return (ULARGE_INTEGER { {userTime.dwLowDateTime, userTime.dwHighDateTime } }).QuadPart / 10000000.L;

return 0;

#else // If Linux or MacOS:

return double(clock()) / CLOCKS_PER_SEC; #endif

}

//Inline search

template <class T = int>

int inlineSearch(const std::vector<T> & v, T elem) { auto f = std::find(v.begin(), v.end(), elem); return (f != v.end()) ? (f - v.begin()) : -1;

}

//Binary search template <class T = int>

int binarySearch(const std::vector<T> & v, T elem) { int left = 0, right = v.size() - 1;

while (left <= right) {

const int mid = ((right - left) >> 1) + left; if (v[mid] > elem)

right = mid - 1; else if (v[mid] < elem)

left = mid + 1; else return mid;

}

return -1;

}

//Fibonacci search

template <class T = int>

int fibSearch(const std::vector<T> & v, T elem) { const int n = v.size();

int i = 0, j = 0, k = 1, offset = -1; while (k < n) i = j, j = k, k = i + j; while (k > 1) {

const int temp = std::min(offset + i, n - 1); if (v[temp] < elem)

k = j, j = i, i = k - j, offset = temp; else if (v[temp] > elem)

k = i, j -= i, i = k - j; else return temp;

}

return (offset + 1 < static_cast<int>(v.size()) && v[offset + 1] == elem) ? offset + 1 : -1;

}

Алгоритмы поиска «Бинарный поиск» и «Фибоначчиев поиск» требуют отсортированного массива в качестве входных данных, а «Прямой поиск» не требует.

Пройденное тестирование:

1.Пустой массив (поиск числа в пустом массиве возвращает результат «-1»).

2.Массив из одного элемента.

3.Массив большого размера с единственным уникальным элементом.

4.Простой отсортированный по возрастанию массив.

5.Простые тесты (отсортированные массивы, неповторяющиеся элементы). Реализуется созданием массива с последовательными значениями.

6.Сложные тесты (отсортированные массивы, повторяющиеся элементы). Реализуется созданием массива со значениями, которые либо больше предыдущего, либо равны предыдущему (выбор определяется случайным образом).

Проверка осуществляется сравнением числа по результативному индексу и числа по результативному индексу стандартного поиска C++ std::find.