Лабораторные 1-5 для Вариант 19 / Лаб 2
.docxФедеральное агентство связи
Ордена Трудового Красного Знамени
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Московский технический университет связи и информатики»
Кафедра Математической Кибернетики и Информационных Технологий
Отчет по лабораторной работе
по предмету «СиАОД»
на тему:
«Методы поиска»
Выполнил: студент группы УБСТ2204
Становов Роман Андреевич
Руководитель:
Кутейников Иван Алексеевич
Москва 2023
Цель работы
Реализовать заданный метод поиска в соответствии с индивидуальным заданием. Организовать генерацию начального набора случайных данных. Для всех вариантов добавить реализацию добавления, поиска и удаления элементов. Оценить время работы каждого алгоритма поиска и сравнить его со временем работы стандартной функции поиска, используемой в выбранном языке программирования.
Вариант 19
Метод поиска Фибоначчи
Код программы
import random
import time
# Реализация метода поиска Фибоначчи
def fibonacci_search(arr, x):
n = len(arr)
fib_m_minus_2 = 0
fib_m_minus_1 = 1
fib_current = fib_m_minus_1 + fib_m_minus_2
while (fib_current < n):
fib_m_minus_2 = fib_m_minus_1
fib_m_minus_1 = fib_current
fib_current = fib_m_minus_1 + fib_m_minus_2
offset = -1
while (fib_current > 1):
i = min(offset + fib_m_minus_2, n - 1)
if (arr[i] < x):
fib_current = fib_m_minus_1
fib_m_minus_1 = fib_m_minus_2
fib_m_minus_2 = fib_current - fib_m_minus_1
offset = i
elif (arr[i] > x):
fib_current = fib_m_minus_2
fib_m_minus_1 = fib_m_minus_1 - fib_m_minus_2
fib_m_minus_2 = fib_current - fib_m_minus_1
else:
return i
if (fib_m_minus_1 and arr[offset + 1] == x):
return offset + 1
return -1
# Функция добавления элемента в массив
def add_element(arr, x):
arr.append(x)
arr.sort()
# Функция поиска элемента в массиве с использованием метода поиска Фибоначчи
def find_element_fibonacci(arr, x):
return fibonacci_search(arr, x)
# Функция поиска элемента в массиве с использованием встроенного поиска Python
def find_element_builtin(arr, x):
if x in arr:
return arr.index(x)
else:
return -1
# Функция удаления элемента из массива
def delete_element(arr, x):
if x in arr:
arr.remove(x)
return True
else:
return False
# Генерация случайных данных
random.seed(0)
arr = [random.randint(1, 10000000) for _ in range(10000000)]
arr.sort()
while True:
print("\nМеню:")
print("1. Добавить элемент")
print("2. Найти элемент (метод Фибоначчи)")
print("3. Найти элемент (встроенный поиск Python)")
print("4. Удалить элемент")
print("5. Выйти")
choice = input("Выберите действие: ")
if choice == '1':
x = int(input("Введите элемент для добавления: "))
add_element(arr, x)
print(f"Элемент {x} добавлен в массив.")
elif choice == '2':
x = int(input("Введите элемент для поиска (метод Фибоначчи): "))
start_time = time.time()
result = find_element_fibonacci(arr, x)
end_time = time.time()
if result != -1:
print(f"Элемент {x} найден на позиции {result}.")
else:
print(f"Элемент {x} не найден.")
print(f"Время выполнения поиска Фибоначчи: {end_time - start_time} секунд.")
elif choice == '3':
x = int(input("Введите элемент для поиска (встроенный поиск Python): "))
start_time = time.time()
result = find_element_builtin(arr, x)
end_time = time.time()
if result != -1:
print(f"Элемент {x} найден на позиции {result}.")
else:
print(f"Элемент {x} не найден.")
print(f"Время выполнения встроенного поиска Python: {end_time - start_time} секунд.")
elif choice == '4':
x = int(input("Введите элемент для удаления: "))
if delete_element(arr, x):
print(f"Элемент {x} удален из массива.")
else:
print(f"Элемент {x} не найден в массиве.")
elif choice == '5':
break
else:
print("Некорректный выбор. Пожалуйста, выберите действие из меню.")
Вывод
В замерах скорости выполнения сортировки можно точно сказать, что работал быстрее: метод поиска Фибоначчи.