diff --git a/labs/lab_01/37/Var_5/Vec_matrix.py b/labs/lab_01/37/Var_5/Vec_matrix.py new file mode 100644 index 0000000..3e533da --- /dev/null +++ b/labs/lab_01/37/Var_5/Vec_matrix.py @@ -0,0 +1,80 @@ +import timeit +import random +import matplotlib.pyplot as plt + +def get_element_by_index(vector, index): + return vector[index] + +def product_of_elements(vector): + product = 1 + for element in vector: + product *= element + return product + +def find_min_element(vector): + min_element = vector[0] + for element in vector[1:]: + if element < min_element: + min_element = element + return min_element + +def harmonic_mean(vector): + sum_of_inverses = 0.0 + for x in vector: + sum_of_inverses += 1.0 / x + + # Вычисляем длину вектора вручную + vector_length = 0 + for _ in vector: + vector_length += 1 + + # Вычисляем среднее гармоническое + harmonic_mean_value = vector_length / sum_of_inverses + + return harmonic_mean_value + +def measure_time(func, vector): + times = [] + for _ in range(5): + start_time = timeit.default_timer() + func(vector) + end_time = timeit.default_timer() + times.append(end_time - start_time) + return sum(times) / len(times) + +def main(): + N = 5 + max_n = 10**2 * N + step = 100 * N + + sizes = [] + times_get_element_by_index = [] + times_product_of_elements = [] + times_find_min_element = [] + times_harmonic_mean = [] + + for n in range(1, max_n + 1, step): + vector = [random.randint(1, 100) for _ in range(n)] + + sizes.append(n) + times_get_element_by_index.append(measure_time(lambda v: get_element_by_index(v, 0), vector)) + times_product_of_elements.append(measure_time(product_of_elements, vector)) + times_find_min_element.append(measure_time(find_min_element, vector)) + times_harmonic_mean.append(measure_time(harmonic_mean, vector)) + + # Построение графика + plt.figure(figsize=(10, 6)) + plt.plot(sizes, times_get_element_by_index, label='get_element_by_index') + plt.plot(sizes, times_product_of_elements, label='product_of_elements') + plt.plot(sizes, times_find_min_element, label='find_min_element') + plt.plot(sizes, times_harmonic_mean, label='harmonic_mean') + + plt.xlabel('Количество элементов (n)') + plt.ylabel('Среднее время выполнения (секунды)') + plt.title('Зависимость времени выполнения от количества элементов') + plt.legend() + plt.grid(True) + plt.show() + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/labs/lab_01/37/Var_5/matrix.py b/labs/lab_01/37/Var_5/matrix.py new file mode 100644 index 0000000..2749a78 --- /dev/null +++ b/labs/lab_01/37/Var_5/matrix.py @@ -0,0 +1,21 @@ +import numpy as np + +# Генерация случайного размера матрицы +n = np.random.randint(0, 10) + +# Генерация случайных матриц A и B размером n x n с неотрицательными элементами +A = np.random.randint(0, 10, size=(n, n)) +B = np.random.randint(0, 10, size=(n, n)) + +# Инициализация результирующей матрицы C +C = np.zeros((n, n)) + +# Вычисление матричного произведения +for i in range(n): + for j in range(n): + for k in range(n): + C[i, j] += A[i, k] * B[k, j] + + +print("Результат матричного произведения C:") +print(C) \ No newline at end of file diff --git a/labs/lab_01/37/Var_5/q.py b/labs/lab_01/37/Var_5/q.py new file mode 100644 index 0000000..2cb3fda --- /dev/null +++ b/labs/lab_01/37/Var_5/q.py @@ -0,0 +1,78 @@ +import time +import matplotlib.pyplot as plt +import numpy as np + + +# Функции, которые мы будем тестировать +def get_element_by_index(vector, index): + return vector[index] + + +def product_of_elements(vector): + product = 1 + for element in vector: + product *= element + return product + + +def find_min_element(vector): + min_element = vector[0] + for element in vector[1:]: + if element < min_element: + min_element = element + return min_element + + +def harmonic_mean(vector): + sum_of_inverses = 0.0 + for x in vector: + sum_of_inverses += 1.0 / x + + vector_length = 0 + for _ in vector: + vector_length += 1 + + harmonic_mean_value = vector_length / sum_of_inverses + return harmonic_mean_value + + +# Функция для измерения времени работы функции +def measure_time(func, vector): + start_time = time.time() + func(vector) + end_time = time.time() + return end_time - start_time + + +# Генерация векторов разного размера +N = 5 +max_n = 10**4 * N +step = 100 * N +vector_sizes = np.arange(1, max_n, step) +times_get_element = [] +times_product = [] +times_min_element = [] +times_harmonic_mean = [] + +for size in vector_sizes: + vector = np.random.rand(size) + + # Измеряем время для каждой функции + times_get_element.append(measure_time(lambda v: get_element_by_index(v, 0), vector)) + times_product.append(measure_time(product_of_elements, vector)) + times_min_element.append(measure_time(find_min_element, vector)) + times_harmonic_mean.append(measure_time(harmonic_mean, vector)) + +# Построение графика +plt.figure(figsize=(10, 6)) +plt.plot(vector_sizes, times_get_element, label='get_element_by_index') +plt.plot(vector_sizes, times_product, label='product_of_elements') +plt.plot(vector_sizes, times_min_element, label='find_min_element') +plt.plot(vector_sizes, times_harmonic_mean, label='harmonic_mean') + +plt.xlabel('Размер вектора') +plt.ylabel('Время (секунды)') +plt.title('Зависимость времени работы функций от размера вектора') +plt.legend() +plt.grid(True) +plt.show() \ No newline at end of file diff --git a/labs/lab_02/37/Var_5/.idea/.gitignore b/labs/lab_02/37/Var_5/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/labs/lab_02/37/Var_5/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/labs/lab_02/37/Var_5/.idea/.name b/labs/lab_02/37/Var_5/.idea/.name new file mode 100644 index 0000000..11a5d8e --- /dev/null +++ b/labs/lab_02/37/Var_5/.idea/.name @@ -0,0 +1 @@ +main.py \ No newline at end of file diff --git a/labs/lab_02/37/Var_5/.idea/Lab_2.iml b/labs/lab_02/37/Var_5/.idea/Lab_2.iml new file mode 100644 index 0000000..f571432 --- /dev/null +++ b/labs/lab_02/37/Var_5/.idea/Lab_2.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/labs/lab_02/37/Var_5/.idea/inspectionProfiles/profiles_settings.xml b/labs/lab_02/37/Var_5/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/labs/lab_02/37/Var_5/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/labs/lab_02/37/Var_5/.idea/misc.xml b/labs/lab_02/37/Var_5/.idea/misc.xml new file mode 100644 index 0000000..ba9961c --- /dev/null +++ b/labs/lab_02/37/Var_5/.idea/misc.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/labs/lab_02/37/Var_5/.idea/modules.xml b/labs/lab_02/37/Var_5/.idea/modules.xml new file mode 100644 index 0000000..b5c98d2 --- /dev/null +++ b/labs/lab_02/37/Var_5/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/labs/lab_02/37/Var_5/Otchet.docx b/labs/lab_02/37/Var_5/Otchet.docx new file mode 100644 index 0000000..b662317 Binary files /dev/null and b/labs/lab_02/37/Var_5/Otchet.docx differ diff --git a/labs/lab_02/37/Var_5/example.py b/labs/lab_02/37/Var_5/example.py new file mode 100644 index 0000000..34d25d0 --- /dev/null +++ b/labs/lab_02/37/Var_5/example.py @@ -0,0 +1,62 @@ +import timeit +import matplotlib.pyplot as plt +import random + +class TreeNode: + def __init__(self, key): + self.left = None + self.right = None + self.val = key + +def insert(root, key): + if root is None: + return TreeNode(key) + else: + if root.val < key: + root.right = insert(root.right, key) + else: + root.left = insert(root.left, key) + return root + +def inorder_traversal(root, result): + if root: + inorder_traversal(root.left, result) + result.append(root.val) + inorder_traversal(root.right, result) + +def tree_sort(A): + root = None + for key in A: + root = insert(root, key) + result = [] + inorder_traversal(root, result) + return result + +# Функция для генерации случайного массива заданной длины +def generate_random_array(length): + return [random.randint(0, 1000) for _ in range(length)] + +# Функция для замера времени выполнения сортировки +def measure_time(array): + return timeit.timeit(lambda: tree_sort(array), number=1) + +# Длины массивов для тестирования +lengths = [1000, 5000, 10000] + +# Списки для хранения результатов +times = [] + +# Замер времени для каждой длины массива +for length in lengths: + array = generate_random_array(length) + time_taken = measure_time(array) + times.append(time_taken) + print(f"Length: {length}, Time: {time_taken:.6f} seconds") + +# Построение графика +plt.plot(lengths, times, marker='o') +plt.xlabel('Array Length') +plt.ylabel('Time (seconds)') +plt.title('Tree Sort Performance') +plt.grid(True) +plt.show() \ No newline at end of file diff --git a/labs/lab_02/37/Var_5/main.py b/labs/lab_02/37/Var_5/main.py new file mode 100644 index 0000000..e432ff3 --- /dev/null +++ b/labs/lab_02/37/Var_5/main.py @@ -0,0 +1,54 @@ +import timeit +import matplotlib.pyplot as plt +import random + +def cocktail_sort(A): + left = 0 + right = len(A) - 1 + swapped = True + while swapped: + swapped = False + for i in range(left, right): + if A[i] > A[i + 1]: + A[i], A[i + 1] = A[i + 1], A[i] + swapped = True + if not swapped: + break + swapped = False + right -= 1 + for i in range(right, left, -1): + if A[i] < A[i - 1]: + A[i], A[i - 1] = A[i - 1], A[i] + swapped = True + left += 1 + +# Функция для генерации случайного массива заданной длины +def generate_random_array(length): + return [random.randint(0, 1000) for _ in range(length)] + +# Функция для замера времени выполнения сортировки +def measure_time(array): + return timeit.timeit(lambda: cocktail_sort(array), number=1) + +# Длины массивов для тестирования +lengths = [ 1000, 5000,10000,100000] + +# Списки для хранения результатов +times = [] + +# Замер времени для каждой длины массива +for length in lengths: + array = generate_random_array(length) + time_taken = measure_time(array) + times.append(time_taken) + print(f"Length: {length}, Time: {time_taken:.6f} seconds") + +# Построение графика +plt.plot(lengths, times, marker='o') +plt.xlabel('Array Length') +plt.ylabel('Time (seconds)') +plt.title('Cocktail Sort Performance') +plt.grid(True) +plt.show() + + diff --git a/labs/lab_02/37/Var_5/re.py b/labs/lab_02/37/Var_5/re.py new file mode 100644 index 0000000..6c4c209 --- /dev/null +++ b/labs/lab_02/37/Var_5/re.py @@ -0,0 +1,53 @@ +import random +import time +import matplotlib.pyplot as plt + +def quicksort(A, low, high): + if low < high: + p = partition(A, low, high) + quicksort(A, low, p - 1) + quicksort(A, p + 1, high) + +def partition(A, low, high): + pivot = A[high] + i = low - 1 + for j in range(low, high): + if A[j] <= pivot: + i += 1 + A[i], A[j] = A[j], A[i] + A[i + 1], A[high] = A[high], A[i + 1] + return i + 1 + +def measure_time(sort_func, arr): + start_time = time.time() + sort_func(arr, 0, len(arr) - 1) + end_time = time.time() + return end_time - start_time + +# Размеры массивов +n1 = 1000 +n2 = 5000 +n3 = 10000 +n4 = 100000 + +# Генерация случайных массивов +arr1 = [random.randint(0, 10000) for _ in range(n1)] +arr2 = [random.randint(0, 10000) for _ in range(n2)] +arr3 = [random.randint(0, 10000) for _ in range(n3)] +arr4 = [random.randint(0, 10000) for _ in range(n4)] + +# Измерение времени выполнения +times = [] +sizes = [n1, n2, n3, n4] + +for arr in [arr1, arr2, arr3, arr4]: + time_taken = measure_time(quicksort, arr.copy()) + times.append(time_taken) + +# Построение графика +plt.plot(sizes, times, marker='o') +plt.xlabel('Размер массива') +plt.ylabel('Время выполнения (секунды)') +plt.title('Зависимость времени выполнения от размера массива (Быстрая сортировка)') +plt.grid(True) +plt.show() \ No newline at end of file