- •Аннотация
- •Введение
- •Теоретическая часть линейный поиск
- •Описание алгоритма
- •Бинарный поиск
- •Функция временной сложности и её асимптотическая оценка
- •Описание алгоритма
- •Функция временной сложности и её асимптотическая оценка
- •Функция пространственной сложности и её асимптотическая оценка
- •График функции временной сложности для всех случаев
- •Экспоненциальный поиск
- •Функция пространственной сложности и её асимптотическая оценка
- •График функции временной сложности для всех случаев
- •Интерполяционный поиск
- •Описание алгоритма
- •Функция временной сложности и её асимптотическая оценка
- •Функция пространственной сложности и её асимптотическая оценка
- •График функции временной сложности для всех случаев фибоначчиев поиск (Fibonacci Search)
- •Описание алгоритма
- •Функция временной сложности и её асимптотическая оценка
- •Функция пространственной сложности и её асимптотическая оценка
- •График функции временной сложности для всех случаев
- •Сравнение временной сложности всех алгоритмов
- •Практическая часть линейный поиск
- •Бинарный поиск
- •Интерполяционный поиск
- •Экспоненциальный поиск
- •Фибоначчиев поиск
- •Сравнение временной сложности экспериментальных значений.
- •Сравнение теоретических и экспериментальных значений
- •Заключение
- •Код программы
- •Линейный поиск
- •Бинарный поиск
- •Интерполяционный поиск
- •Экспоненциальный поиск
- •Фибоначчиев поиск
Сравнение временной сложности экспериментальных значений.
Для
оценки экспериментальных значений
алгоритмов поиска на общий график были
выведены средние случаи для каждого
метода поиска. Так как бинарный поиск
имеет асимптотику
,
остальные графики «сплющиваются» .
Рисунок - регрессионная кривая экспирементальных значений для средних случаев.
Для сравнения были оставлены графики с логарифмической асимптотикой.
Рисунок - регрессионная кривая экспериментальных значений для средних случаев без линейного поиска.
Как мы видим, самыми быстрыми поисками является интерполяционный и бинарный.
Сравнение теоретических и экспериментальных значений
В теоретической части были сделаны предположения о том, что самым быстрым поиском будет интерполяционный в равномерно-распределенных массивах, а также бинарный поиск в неравномерных массивах. Рассмотрев графики и сравнив их, мы можем сделать вывод, что временная сложность экспериментальных значений совпала с теоретической временной сложностью.
Заключение
В данной курсовой работе был проведен сравнительный анализ различных алгоритмов поиска в массиве: линейного, бинарного, интерполяционного, экспоненциального и Фибоначчиева. Исследование включало теоретическое изучение функций временной и пространственной сложности каждого из алгоритмов, построение теоретических графиков, а также проведение экспериментов для оценки их практической эффективности.
Наиболее универсальными и эффективными алгоритмами поиска оказались бинарный и интерполяционный поиск. Бинарный поиск превосходит по стабильности и подходит для большинства задач, где массивы заранее отсортированы. Интерполяционный поиск является оптимальным выбором для массивов с равномерным распределением данных.
Экспериментальные и теоретические значения времени выполнения алгоритмов полностью совпали, что подтверждает корректность теоретического анализа.
Код программы
Ссылка на гугл коллаб
https://colab.research.google.com/drive/1KTzQ7YchiMELhkIwHI4kg4tAl3D9L0WM?usp=sharing
Линейный поиск
import random
import time
import matplotlib.pyplot as plt
import numpy as np
def best_time(n):
return (n)**0
def aver_time(n):
return (n/2)
def worst_time(n):
return (n)
n_values = np.arange(1, 101) # от 1 до 1000
best = best_time(n_values)
aver = aver_time(n_values)
worst = worst_time(n_values)
plt.figure(figsize=(10, 7))
plt.plot(n_values, best, label='Лучший случай', color='green')
plt.plot(n_values, aver, label='Средний случай', color='blue')
plt.plot(n_values, worst, label='Худший случай', color='red')
plt.title('Временная сложность линейного поиска')
plt.xlabel('Размер массива (n)')
plt.ylabel('Время поиска')
plt.legend()
plt.grid()
plt.show()
def linear_search(arr, x):
for index in range(len(arr)):
if arr[index] == x:
return index
return 0
def measure_time(func, data_sizes):
num_trials = 100
times1, times2, times3 = [],[],[]
for size in data_sizes:
t1, t2, t3 = 0, 0, 0
if size == 0:
times1 +=[0]
times2 += [0]
times3 += [0]
else:
for _ in range(num_trials):
arr = [random.randint(-100000, 100000) for _ in range(size)]
elem_B = arr[0] #best
elem_A = random.choice(arr) #average
elem_W = arr[-1] #worst
t_B1 = time.perf_counter()
func(arr,elem_B)
t_B2 =time.perf_counter()
t1 += (t_B2 - t_B1)
t_A1 = time.perf_counter()
func(arr, elem_A)
t_A2 = time.perf_counter()
t2 += (t_A2 - t_A1)
t_W1 = time.perf_counter()
func(arr, elem_W)
t_W2 = time.perf_counter()
t3 += (t_W2 - t_W1)
avg_time1 = t1 / num_trials
avg_time2 = t2 / num_trials
avg_time3 = t3 / num_trials
times1.append(avg_time1)
times2.append(avg_time2)
times3.append(avg_time3)
return times1,times2,times3
X = []
for n in range(1,25002,2500):
X += [n]
print(X)
Y1,Y2,Y3 = measure_time(linear_search, X)
plt.figure(figsize=(10, 7))
plt.plot(X, Y1,color='green', label='Первый элемент')
plt.plot(X, Y2,color='blue', label='Случайный элемент')
plt.plot(X, Y3,color='red', label='Последний элемент')
plt.title('Линейный поиск')
plt.xlabel('Размер массива')
plt.ylabel('Время в секундах', rotation=90)
plt.legend()
plt.grid()
plt.show()
x = np.array(X)
y1 = np.array(Y1)
y2 = np.array(Y2)
y3 = np.array(Y3)
coefficients1 = np.polyfit(x, y1, 1)
print(coefficients1)
coefficients2 = np.polyfit(x, y2, 1)
print(coefficients2)
coefficients3 = np.polyfit(x, y3, 1)
print(coefficients3)
polynomial1 = np.poly1d(coefficients1)
polynomial2= np.poly1d(coefficients2)
polynomial3 = np.poly1d(coefficients3)
# Генерируем значения для линии регрессии
x_fit = np.linspace(min(x), max(x), 100)
y1_fit = polynomial1(x_fit)
y2_fit = polynomial2(x_fit)
y3_fit = polynomial3(x_fit)
plt.figure(figsize=(10, 7))
plt.scatter(X, Y1,color='green')
plt.scatter(X, Y2,color='blue')
plt.scatter(X, Y3,color='red')
plt.plot(x_fit, y1_fit, color='lightgreen',label='Лучший случай')
plt.plot(x_fit, y2_fit, color='darkblue',label='Средний случай')
plt.plot(x_fit, y3_fit, color='darkred',label='Худший случай')
plt.title('Регрессионная кривая')
plt.xlabel('Размер массива')
plt.ylabel('Время в секундах', rotation=90)
plt.legend()
plt.grid()
plt.show()
