{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## EXECUTION TIME" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import random" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### INSERTION SORT \n", "\n", "Algoritmo in place per l'_ordinamento_ di un'array, si suddivide la sequenza in due sottosequenze di cui una ordinata e una non ordinata e si inseriscono ad ogni iterazione gli elementi della sequenza non ordinata in quella ordinata secondo l'ordine stabilito. " ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "def InsertionSort(array_to_sort):\n", " array_sorted = [i for i in array_to_sort]\n", " len_array = len(array_sorted)\n", " \n", " for j in range(1, len_array):\n", " el = array_sorted[j]\n", " i = j -1\n", " while i >=0 and array_sorted[i] > el:\n", " array_sorted[i+1] = array_sorted[i]\n", " i = i-1\n", " array_sorted[i+1] = el\n", " \n", " return array_sorted" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Definiamo una funzione che genera un un numero fissato di liste randomiche con lungheza random, entro una certa soglia sempre sccelta da noi, da inserire come input della funzione InsertionSort.\n", "La funzione deve avere come input:\n", "- num : numero di liste che vogliamo generare\n", "- lenn : lunghezza della lista \n", "- max_el : upper-bound per i numeri che possono essere inseriti in quella lista" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "def generate_random_list(num, _len, max_el):\n", " out = []\n", " for i in range(num):\n", " lis = [random.randint(1, max_el) for j in range(_len)]\n", " out.append(lis)\n", " return out" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[[4, 1, 3, 5, 8, 15, 9, 19, 4, 7, 4, 14, 4, 18, 15, 2, 15, 19, 16, 17],\n", " [9, 14, 14, 9, 3, 10, 1, 1, 17, 3, 11, 13, 8, 7, 4, 9, 19, 6, 4, 19],\n", " [15, 19, 11, 11, 7, 11, 20, 8, 10, 20, 18, 13, 13, 19, 7, 7, 4, 4, 17, 18],\n", " [3, 8, 12, 5, 3, 16, 15, 2, 8, 20, 11, 4, 20, 10, 13, 15, 14, 19, 8, 14],\n", " [17, 17, 10, 11, 20, 2, 15, 11, 13, 16, 19, 4, 18, 6, 11, 3, 9, 10, 3, 16]]" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "generate_random_list(5, 20, 20)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "import datetime\n", "from statistics import mean\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Analizziamo quanto è il tempo medio di ordinamento di esecuzione del porgramma che abbiamo implementato. \n", "Per farlo, è necessario generare randomicamente $n_1$ liste della stessa lunghezza $l$ e applicare il nostro algoritmo ad ogni singola lista $n_2$ volte, con $n_2 > 1$.\n", "\n", "Per avere una media, dunque, del tempo di esecuzione dell'algoritmo quando riceve in input liste di lunghezza $l$, dovremmo prima fare la media del tempo di esecuzione della stessa lista sulle $n_2$ prove e poi fare la media delle medie sulle $n_1$ liste diverse generate ranodmicamente." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "def measure_time(l, n1, n2):\n", " \"\"\"\n", " input : lunghezza della lista \n", " output : media delle medie dei tempi di esecuzione di liste con lungheezza fissata l \n", " \"\"\"\n", " random_list_ = generate_random_list(n1, l, 100)\n", " time_ = []\n", " for j in range(len(random_list_)):\n", " list_considered = random_list_[j]\n", " time_fixed_list = []\n", " for i in range(n2):\n", " begin_time = datetime.datetime.now()\n", " InsertionSort(list_considered)\n", " execution_time = (datetime.datetime.now() - begin_time).microseconds\n", " time_fixed_list.append(execution_time)\n", " mean_fixed_list = mean(time_fixed_list)\n", " time_.append(mean_fixed_list)\n", " time = mean(time_)\n", " return time " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Misuriamo ora il tempo medio di esecuzione per liste da lunghezza $1$ a lunghezza $100$ e plottiamo il risultato in un grafico che ha come ascisse la lunghezza e come ordinate il tempo di esecuzione" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "def execution_time(l_min, l_max, n1, n2):\n", " y = []\n", " for i in range(l_max-l_min):\n", " y_ = measure_time(l_min + i, n1, n2)\n", " y.append(y_)\n", " return y " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Plottiamo i risultati utilizzando la libreria _matplotlib_ per confermare i tempi di esecuzione che abbiamo calcolato teoricamente." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "def plot_(l_min, l_max, n1, n2):\n", " x = [i for i in range(l_min, l_max)]\n", " y = execution_time(l_min, l_max, n1, n2)\n", " plt.plot(x, y, color = 'm')\n", " plt.title('InsertionSort() execution time')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Che forma ci aspettiamo che abbia il grafico? " ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plot_(1, 50, 50, 50)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### BUCKETSORT\n", "Proviamo a vedere che succede se utilizziamo un algoritmo con costo lineare" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def bucket_sort(A):\n", " B = []\n", " n = len(A)\n", " for i in range(0, n):\n", " B.append([])\n", " for i in range(0, n):\n", " bucket = int(A[i] * n) \n", " B[bucket].append(A[i])\n", " for i in range(0, n):\n", " B[i] = InsertionSort(B[i])\n", " C = []\n", " for i in range(0, n):\n", " C += B[i]\n", " return C" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "def generate_random_list(num, _len):\n", " out = []\n", " for i in range(num):\n", " lis = [random.random() for j in range(_len)]\n", " out.append(lis)\n", " return out" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "# generate_random_list(5, 20)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "def measure_time(l, n1, n2):\n", " \"\"\"\n", " input\n", " l : lunghezza della lista\n", " n1 : numero di liste generate \n", " n2: numero di misurazioni \n", " \n", " output : media delle medie dei tempi di esecuzione di liste con lungheezza fissata l \n", " \"\"\"\n", " random_list_ = generate_random_list(n1, l)\n", " time_ = []\n", " for j in range(len(random_list_)):\n", " list_considered = random_list_[j]\n", " time_fixed_list = []\n", " for i in range(n2):\n", " begin_time = datetime.datetime.now()\n", " bucket_sort(list_considered)\n", " execution_time = (datetime.datetime.now() - begin_time).microseconds\n", " time_fixed_list.append(execution_time)\n", " mean_fixed_list = mean(time_fixed_list)\n", " time_.append(mean_fixed_list)\n", " time = mean(time_)\n", " return time " ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "def execution_time(l_min, l_max, n1, n2):\n", " y = []\n", " for i in range(l_max-l_min):\n", " y_ = measure_time(l_min + i, n1, n2)\n", " y.append(y_)\n", " return y " ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "def plot_(l_min, l_max, n1, n2):\n", " x = [i for i in range(l_min, l_max)]\n", " y = execution_time(l_min, l_max, n1, n2)\n", " plt.plot(x, y, color = 'm')\n", " plt.title('BucketSort() execution time')" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plot_(1, 50, 50, 50)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### BUCKETSORT - WORST CASE SCENARIO " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5" } }, "nbformat": 4, "nbformat_minor": 4 }