
Коды основных функций / [Код основных функций] Лаб. 2. Часть 1
.pdf
[Код основных функций] Лабораторная работа №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.