Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
курсач по алгоритмам поиска - 3 сем АИСД.docx
Скачиваний:
3
Добавлен:
08.07.2025
Размер:
1 Мб
Скачать
☆

Сравнение временной сложности экспериментальных значений.

Для оценки экспериментальных значений алгоритмов поиска на общий график были выведены средние случаи для каждого метода поиска. Так как бинарный поиск имеет асимптотику , остальные графики «сплющиваются» .

Рисунок - регрессионная кривая экспирементальных значений для средних случаев.

Для сравнения были оставлены графики с логарифмической асимптотикой.

Рисунок - регрессионная кривая экспериментальных значений для средних случаев без линейного поиска.

Как мы видим, самыми быстрыми поисками является интерполяционный и бинарный.

Сравнение теоретических и экспериментальных значений

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

Заключение

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

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

Экспериментальные и теоретические значения времени выполнения алгоритмов полностью совпали, что подтверждает корректность теоретического анализа.

Код программы

Ссылка на гугл коллаб

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()