K&R exercise 3.1 - C (СИ)
Формулировка задачи:
Упражнение 3.1. В нашей программе бинарного поиска внутри цикла осуществляются две проверки, хотя
могла быть только одна (при увеличении числа проверок вне цикла). Напишите программу, предусмотрев в
ней одну проверку внутри цикла. Оцените разницу во времени выполнения.
Как решить не знаю.
Как оценить разницу во времени выполнения, если в пройденном материале нет инфы по работе со временем и датой? С помощью IDE какой-то может быть, которая выводит время выполнения программы, не знаю.
Использую Pelles C.
/* binsearch: найти х в v[0] <= v[1] <= … <= v[n-1] */ 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 /* совпадение найдено */ return mid; } return -1; /* совпадения нет */ }
Решение задачи: «K&R exercise 3.1»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> #include <inttypes.h> #include <x86intrin.h> #define N 200 int main() { time_t start, stop; int i, x = (N+N/10)/2, n = N - N/10, b1, b2, b3; int a[N]; for (i=0; i < N; i++) { a[i] = i + 9; printf("%d ", a[i]); } printf("\nArray length: %d (x=%d, n=%d)\n", N, x, n); uint64_t t; t = __rdtsc(); b1 = binsearch(x, a, n); t = __rdtsc()-t; printf("binsearch: ticks: %" PRIu64 "\n",t); printf("Position of element: %d\n", b1); t = __rdtsc(); b2 = binsearch2(x, a, n); t = __rdtsc()-t; printf("binsearch2: ticks: %" PRIu64 "\n",t); printf("Position of element: %d\n", b2); t = __rdtsc(); b3 = binsearch3(x, a, n); t = __rdtsc()-t; printf("binsearch3: ticks: %" PRIu64 "\n",t); printf("Position of element: %d\n", b3); return 0; } int binsearch (int x, int a[], int n) { int l = 0, h = n, m; while (l < h) { m = (l+h)/2; if (x <= a[m]) h = m; else l = m+1; } if (h<n && a[l] == x) return l; return -1; } int binsearch2 (int x, int a[], int n) { int l=0, h=n, m; while (l <= h) { m = (l+h)/2; if (x < a[m]) h = m - 1; else if(x > a[m]) l = m + 1; else return m; } return -1; } int binsearch3 (int x, int v[], int n) { int low, high, mid; low = 0; high = n - 1; mid = (low+high)/2; while (low <= high && x != v[mid]) { if (x < v[mid]) high = mid - 1; else low = mid + 1; mid = (low+high)/2; } if (x == v[mid]) return mid; else return -1; }
Объяснение кода листинга программы
- Включаются необходимые заголовочные файлы
- Объявляются переменные: time_t start, stop; int i, x, n, b1, b2, b3; uint64_t t; int a[N];
- Заполняется массив a[N] значениями от 0 до 99
- Выводится на экран длина массива N и найденные значения x, n
- Выполняется бинарный поиск с помощью функции binsearch
- Выполняется бинарный поиск с помощью функции binsearch2
- Выполняется бинарный поиск с помощью функции binsearch3
- Все функции имеют одинаковый прототип: int x, int a[], int n
- В функции binsearch происходит бинарный поиск элемента x в массиве a с использованием переменных l, h, m
- В функции binsearch2 происходит бинарный поиск элемента x в массиве a с использованием переменных l, h, m, и проверкой на равенство a[m] элементу x
- В функции binsearch3 происходит бинарный поиск элемента x в массиве v с использованием переменных low, high, mid
- Если элемент x найден, то возвращается его позиция, иначе возвращается -1
- Если элемент x не найден ни в одной из функций, то выводится на экран сообщение об ошибке
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д