Advertisement
daniele2013

COMPLEXITY_TRUE

Jun 10th, 2014
258
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 18.21 KB | None | 0 0
  1. -- COMPLESSITA' --
  2.  
  3. LISTE.C
  4.  
  5. List_Clear
  6. {
  7.     tempo:
  8.     L'algoritmo cancella ricorsivamente una lista concatenata, per cui la complessità temporale dipende da quanti nodi ci sono arrivando fino a O(n)
  9.     con n = numero di nodi.
  10.     spazio:
  11.     L'algoritmo cancella ricorsivamente una lista concatenata, per cui la complessità spaziale dipende da quanti nodi si devono cancellare
  12.     arrivando fino a O(n), con n = numero di nodi.
  13. }
  14.  
  15. List_Print2
  16. {
  17.     tempo:
  18.     L'algoritmo stampa una lista concatenata in maniera ricorsiva per cui la complessità temporale è O(n) con n = numero di elementi nella lista.
  19.     spazio:
  20.     La complessità spaziale dipende dal numero di elementi nella lista puntata da 'head' per cui assume il valore asintotico di O(n).
  21. }
  22.  
  23. List_Print
  24. {
  25.     tempo:
  26.     L'algoritmo stampa una lista concatenata in maniera ricorsiva per cui la complessità temporale è O(n) con n = numero di elementi nella lista.
  27.     spazio:
  28.     La complessità spaziale dipende dal numero di elementi nella lista puntata da 'head' per cui assume il valore asintotico di O(n).
  29. }
  30.  
  31. List_InsCoda
  32. {
  33.     tempo:
  34.     L'algoritmo inserisce in coda un elemento in una lista concatenata, per cui la complessità temporale dipende da quanti nodi ci sono arrivando fino a O(n)
  35.     con n = numero di nodi.
  36.     spazio:
  37.     L'algoritmo inserisce in coda un elemento in una lista concatenata, per cui la complessità spaziale dipende da quanti nodi bisogna scorrere
  38.     per arrivare alla fine arrivando fino a O(n), con n = numero di nodi.
  39. }
  40.  
  41. List_RemoveElem2
  42. {
  43.     tempo:
  44.     L'algoritmo rimuove dalla coda un elemento in una lista concatenata, per cui la complessità temporale dipende da quanti nodi ci sono arrivando fino a O(n)
  45.     con n = numero di nodi.
  46.     spazio:
  47.     La complessità di spazio si basa sulla dimensione della lista per cui è O(n).
  48. }
  49.  
  50. List_RemoveElem
  51. {
  52.     tempo:
  53.     L'algoritmo rimuove un elemento dalla coda di una lista concatenata in maniera ricorsiva per cui la complessità temporale è O(n) con n = numero
  54.     di elementi nella lista.
  55.     spazio:
  56.     La complessità spaziale dipende dal numero di elementi nella lista puntata da 'head' per cui assume il valore asintotico di O(n).
  57. }
  58.  
  59. FUN.C
  60.  
  61. choice
  62. {
  63.     tempo:
  64.     L'algoritmo prende in input un numero controllando che non ci siano errori come l'input di un carattere.
  65.     La complessità è costante (O(1)).
  66.     spazio:
  67.     L'algoritmo prende in input un numero controllando che non ci siano errori come l'input di un carattere, per cui non vengono allocate o create
  68.     strutture dati aggiuntive.
  69.     La complessità è costante (O(1)).
  70. }
  71.  
  72. add_head
  73. {
  74.     tempo:
  75.     L'algoritmo aggiunge in testa alla struttura dati puntata da 'minimo' un nuovo elemento.
  76.     Questo accade in tempo costante (O(1)).
  77.     spazio:
  78.     L'algoritmo aggiunge in testa alla struttura dati puntata da 'minimo' un nuovo elemento.
  79.     La complessità di spazio tende ad O(1) poichè incrementa semplicemente di 1 la dimensione precedente della struttura puntata da 'minimo'.
  80. }
  81.  
  82. print_djkstra_path
  83. {
  84.     tempo:
  85.     L'algoritmo stampa in modo ricorsivo la lista puntata da 'head' costruita con la funzione di Dijkstra.
  86.     Il tempo di esecuzione dipende da quanti elementi ci sono per cui si arriva asintoticamente alla complessità di O(n) con n = numero elementi.
  87.     spazio:
  88.     Con questa funzione non vengono allocate o create nuove strutture dati per cui la complessità dipende dal numero di elementi nella lista puntata
  89.     dalla variabile 'head' passata come parametro alla funzione e cioè è O(n).
  90. }
  91.  
  92. Node_Cost
  93. {
  94.     tempo:
  95.     L'algoritmo calcola semplicemente il costo in base al tipo di mezzo di trasporto passato come valore del parametro 'tipo'.
  96.     Tutto ciò avviene in tempo costante O(1).
  97.     spazio:
  98.     Nell'algoritmo non vengono allocate nuove strutture dati. La complessità spaziale è costante O(1).
  99. }
  100.  
  101. Node_Eff
  102. {
  103.     tempo:
  104.     L'algoritmo calcola semplicemente l'efficienza in base al tipo di mezzo di trasporto passato come valore del parametro 'tipo'.
  105.     Tutto ciò avviene in tempo costante O(1).
  106.     spazio:
  107.     Nell'algoritmo non vengono allocate nuove strutture dati. La complessità spaziale è costante O(1).
  108. }
  109.  
  110. find_str
  111. {
  112.     tempo:
  113.     L'algoritmo trova nell'array dei vertici una stringa confrontandola con la variabile 'ID' passata come parametro alla funzione.
  114.     La complessità arriva ad un massimo di O(n) se si deve scorrere tutto l'array composto da n vertici.
  115.     spazio:
  116.     Non vengono create nuove strutture per cui la complessità si basa sulla dimensione di GR1 (che è un grafo) arrivando a O(|V| + |E|) con |V| = numero
  117.     vertici e |E| = numero archi.
  118. }
  119.  
  120. init_file
  121. {
  122.     tempo:
  123.     L'algoritmo crea un grafo leggendo da un file tutti i dati utili.
  124.     La complessità temporale dipende da quando si raggiunge la fine del file, ma poichè i dati letti sono in gruppi di 4 (in fscanf ci sono
  125.     part, arr, tipo e dist), si arriva asintoticamente ad una complessità di 4*O(n) con n = numero archi creati in base ai dati letti.
  126.     spazio:
  127.     La complessità spaziale dipende da quanti archi vengono creati nell'algoritmo in base alla lettura di dati dal file di testo.
  128.     Per cui si arriva asintoticamente ad O(|V| + |E|) con |V| = numero di vertici e |E| = numero di archi creati.
  129. }
  130.  
  131. Graph_Menu
  132. {
  133.     tempo:
  134.     La funzione inizia con la chiamata della funzione Graph_Create (complessità O(1)), poi c'è la funzione leggi (complessità O(|V|)) e poi c'è la funzione
  135.     init_file (complessità O(|E|)).
  136.     Subito dopo c'è un'istruzione switch case che è fatta per valutare 10 casi distinti.
  137.     Caso 1:
  138.     c'è la funzione Graph_Print; complessità caso 1: O(|V|*|E|);
  139.     Caso 2:
  140.     c'è la funzione Graph_Edge_ADD_IN; complessità caso 2: O(|V|);
  141.     Caso 3:
  142.     c'è la funzione Graph_Edge_Remove; complessità caso 3: O(|V|+|E|);
  143.     Caso 4:
  144.     ci sono la funzione Graph_Destroy (complessità O(|V|*|E|) e la funzione Graph_Create (complessità O(1)); complessità caso 4: O(|V|*|E|);
  145.     Caso 5:
  146.     c'è la funzione Graph_NodeAdd; complessità caso 5: O(|V|);
  147.     Caso 6:
  148.     c'è la funzione Graph_NodeRemove; complessità caso 6: O(|V|*|E|);
  149.     Caso 7:
  150.     c'è la funzione Graph_Random; complessità caso 7: O(|V|*log|V|);
  151.     Caso 8:
  152.     c'è la funzione dfs; complessità caso 8: O(|V|+|E|);
  153.     Caso 9:
  154.     il caso 9 si articola così:
  155.     - ci sono alcune istruzioni if (complessità O(1));
  156.     - c'è la funzione choice (complessità O(1));
  157.     - c'è un'altra funzione choice (complessità O(1));
  158.     - c'è un ciclo for sul numero di vertici del grafo (complessità O(|V|));
  159.     - c'è un altro ciclo for sul numero di vertici del grafo in cui viene chiamata la funzione find_str (complessità totale O(|V|^2));
  160.     - c'è la terza funzione choice (complessità O(1));
  161.     - c'è la funzione Graph_Print (complessità O(|V|*|E|));
  162.     - c'è la funzione choice (complessità O(1));
  163.     - c'è un ciclo for che itera sul numero dei vertici e al cui interno si svolgono delle find_str, una List_Print2, una choice, una List_RemoveElem2
  164.     ed un ciclo while sul numero degli archi (complessità totale ciclo for: O(|V|*(|V|+|E|)) = O(|V|^2));
  165.     - c'è la funzione djkstra (complessità O(|V|) * O(|V|+|E|) = O(|V| * (|V|+|E|)) = O(|V|^2));
  166.     - c'è la funzione print_djkstra_path (complessità O(|V|));
  167.     - c'è un ciclo for sul numero dei vertici (complessità O(|V|));
  168.     - c'è un ciclo for sul numero dei vertici in cui si svolge un ciclo while sul numero degli archi (complessità O(|V|*|E|));
  169.     complessità caso 9: O((|V|^2)+ (|V|*|E|)).
  170.     Alla fine di tutto, fuori dallo switch case c'è la funzione Graph_Destroy (complessità O(|V|*|E|)).
  171.     Nel caso peggiore (se si sceglie sempre l'opzione 9) la complessità di tempo di tutto l'algoritmo arriva a O((|V|^2)+ (|V|*|E|)) = O(|V|^2).
  172.     spazio:
  173.     In tutto l'algoritmo viene creato ed usato un grafo (complessità O(|V| + |E|)) ed eventualmente una lista rappresentante il percorso minimo sul grafo
  174.     generato nel caso 9 con la funzione djkstra (complessità di spazio della lista O(|V|)). La complessità di spazio totale è O(|V|+|E|).
  175. }
  176.  
  177. all_visited
  178. {
  179.     tempo:
  180.     L'algoritmo scorre la lista delle etichette puntata dalla variabile 'insieme' e itera finchè non trova un nodo con il campo 'visitato' pari a 0, arrivando
  181.     ad una complessità nel caso peggiore O(n) con n = nodi letti iterativamente nel ciclo for.
  182.     spazio:
  183.     Non vengono allocate strutture aggiuntive per cui la complessità spaziale è O(n) con n = numero nodi della struttura puntata da 'etichette'.
  184. }
  185.  
  186. leggi
  187. {
  188.     tempo:
  189.     L'algoritmo legge da un file di testo le stringhe corrispondenti alle città della mappa rappresentata dal grafo GR1.
  190.     A parte le istruzioni semplici che danno un contributo O(1) alla complessità temporale, vengono eseguiti due cicli for non innestati fra loro che
  191.     agiscono per massimo n iterazioni, con n = numero vertici del grafo; per cui la complessità totale è O(n).
  192.     spazio:
  193.     La complessità spaziale dipende dalla grandezza del grafo per cui è O(|V| + |E|) con |V| = numero vertici, |E| = numero archi.
  194. }
  195.  
  196. GRAPH.C
  197.  
  198. Graph_Create
  199. {
  200.     tempo:
  201.     L'algoritmo crea un nuovo grafo vuoto, cioè con dei vertici non collegati tra loro.
  202.     Ci sono tutte istruzioni semplici per cui la complessità temporale è costante O(1).
  203.     spazio:
  204.     La complessità spaziale è in relazione con il numero di vertici del grafo nuovo creato per cui si arriva asintoticamente a O(|V|), con |V| = numero vertici
  205.     del grafo.
  206. }
  207.  
  208. Graph_Destroy
  209. {
  210.     tempo:
  211.     L'algoritmo dealloca un grafo iterando sull'array di vertici in un ciclo for (complessità O(|V|) con |V| = numero vertici) e iterando poi sulle
  212.     liste di adiacenza relative ad ogni vertice (complessità O(|E|) con |E| = numero archi), per cui la complessità di tempo totale è O(|V|*|E|).
  213.     spazio:
  214.     La grandezza del grafo corrisponde alla somma del numero di vertici con il numero di archi per cui la complessità spaziale è di O(|V|+|E|).
  215. }
  216.  
  217. Graph_Print
  218. {
  219.     tempo:
  220.     L'algoritmo itera sull'array dei vertici e poi sulle adiacenze corrispondenti ad ogni vertice del grafo per cui la complessità spaziale arriva a
  221.     O(|V|*|E|) con |V| = numero vertici, |E| = numero archi.
  222.     spazio:
  223.     L'algoritmo sfrutta la struttura dati di un grafo con i suoi vertici e i suoi archi rappresentati con le liste di adiacenza per cui la complessità
  224.     spaziale corrisponde a O(|V|+|E|).
  225. }
  226.  
  227. Graph_Edge_ADD_IN
  228. {
  229.     tempo:
  230.     L'algoritmo consiste di istruzioni semplici con in più delle istruzioni condizionali che danno un contributo di O(1) alla complessità, delle chiamate
  231.     alla funzione find_str che dà un contributo O(|V|) con |V| = numero vertici del grafo, una chiamata alla funzione Graph_Edge_ADD che ha complessità
  232.     O(1) e delle chiamate alla funzione choice che ha complessità O(1). Per cui la complessità di tempo totale è O(|V|) + O(1) = O(|V|).
  233.     spazio:
  234.     Viene usato un grafo per cui la complessità asintotica di spazio assume il valore di O(|V|+|E|).
  235. }
  236.  
  237. Graph_Edge_ADD
  238. {
  239.     tempo:
  240.     L'algoritmo aggiunge un nuovo arco nel grafo con istruzioni semplici, tranne quando si richiamano le funzioni Node_Eff e Node_Cost che danno comunque
  241.     un contributo di O(1) alla complessità totale dell'algoritmo; per cui la complessità di tempo arriva a O(1).
  242.     spazio:
  243.     La complessità di spazio dell'algoritmo si basa sulla grandezza della struttura dati del grafo per cui è O(|V|+|E|) con |V| = numero vertici,
  244.     |E| = numero archi.
  245. }
  246.  
  247. Graph_Edge_Remove
  248. {
  249.     tempo:
  250.     Nell'algoritmo ci sono delle istruzioni condizionali non annidate che hanno complessità O(1), delle chiamate alla funzione find_str che ha complessità
  251.     O(|V|) con |V| = numero vertici del grafo, una chiamata alla funzione List_Print2 che ha complessità O(|E|) con |E| = numero archi del grafo, una
  252.     chiamata alla funzione choice che ha complessità O(1) ed un ciclo while che scorre gli archi uscenti da un vertice particolare (complessità O(|E|))
  253.     Per cui la complessità temporale totale è di O(|V|+|E|).
  254.     spazio:
  255.     Viene usato un grafo per cui la complessità spaziale asintotica è di O(|V|+|E|).
  256. }
  257.  
  258. Graph_NodeAdd
  259. {
  260.     tempo:
  261.     Nell'algoritmo c'è una chiamata alla funzione find_str per vedere se il nodo nuovo non sia già presente nel grafo (complessità O(|V|)), un ciclo for
  262.     che itera sul numero dei vertici ed in cui si eseguono operazioni elementari (complessità ciclo for O(|V|)), e infine se viene valutata vera una certa
  263.     condizione, oltre a delle operazioni elementari viene chiamata la funzione re_ID (complessità O(|V|)).
  264.     La complessità totale di tempo arriva dunque ad un valore asintotico di O(|V|) dove |V| è il numero di vertici del grafo.
  265.     spazio:
  266.     Nella funzione si usa un grafo per cui la complessità di spazio corrisponde ad O(|V|+|E|) con |E| = numero di archi del grafo.
  267. }
  268.  
  269. Graph_NodeRemove
  270. {
  271.     tempo:
  272.     Nell'algoritmo c'è una chiamata alla funzione find_str (complessità O(|V|), una chiamata alla funzione List_Clear (complessità O(|E|)) ed un ciclo
  273.     for che itera sul numero di vertici |V| del grafo chiamando a sua volta la funzione List_RemoveElem (complessità O(|E|)).
  274.     La complessità di tempo raggiunge il valore asintotico di O(|V|+|E|) + O(|V|*|E|) = O(|V|*|E|) con |E| = numero di archi del grafo.
  275.     spazio:
  276.     Viene usato un grafo per cui la complessità di spazio corrisponde alla sua grandezza e cioè ad O(|V|+|E|).
  277. }
  278.  
  279. Graph_Random
  280. {
  281.     tempo:
  282.     Nell'algoritmo ci sono 2 cicli for, uno innestato nell'altro: quello interno itera sul logaritmo in base 2 del numero di vertici, richiamando
  283.     la funzione Graph_Edge_ADD che ha complessità O(1), dando al ciclo interno una complessità di O(log|V|); il ciclo esterno invece itera sul numero di
  284.     vertici effettivo per cui la complessità di tempo totale dell'algoritmo è O(|V|*log|V|) con |V| = numero vertici del grafo.
  285.     spazio:
  286.     Viene usato nell'algoritmo un grafo con liste di adiacenza per cui la complessità di spazio corrisponde ad O(|V|+|E|) dove |E| = numero archi del grafo.
  287. }
  288.  
  289. dfs1
  290. {
  291.     tempo:
  292.     L'algoritmo è richiamato ricorsivamente su ogni nodo del grafo per cui la complessità di tempo dell'algoritmo dipende da quanti archi possiede un nodo
  293.     e cioè è O(|E|) con |E| = numero archi di un vertice.
  294.     spazio:
  295.     L'algoritmo prende in input un grafo per cui la complessità spaziale corrisponde ad O(|V|+|E|) con |V| = numero vertici del grafo.
  296. }
  297.  
  298. dfs
  299. {
  300.     tempo:
  301.     Nell'algoritmo c'è un ciclo for che itera sul numero di vertici presenti nel grafo e contemporaneamente chiama la funzione dfs1 che dà contributo
  302.     O(|E|) alla complessità dell'algoritmo che arriva ad avere così una complessità temporale totale di O(|V|+|E|) con |V| = numero vertici,
  303.     |E| = numero archi.
  304.     spazio:
  305.     Viene usato un grafo per cui la complessità di spazio è O(|V|+|E|).
  306. }
  307.  
  308. re_ID
  309. {
  310.     tempo:
  311.     Nell'algoritmo oltre alle istruzioni semplici che danno contributo O(1) alla complessità temporale, c'è un ciclo for che itera sul numero di
  312.     vertici del grafo, per cui la complessità asintotica di tempo effettiva è O(|V|) dove |V| è proprio il numero di vertici presenti.
  313.     spazio:
  314.     Viene usato un grafo con i suoi |V| vertici e i suoi |E| archi per cui la complessità spaziale corrisponde ad O(|V|+|E|).
  315. }
  316.  
  317. relaxDist
  318. {
  319.     tempo:
  320.     L'algoritmo esegue delle operazioni aritmetiche singole in base alla verifica di una condizione in un'espressione condizionale, per cui
  321.     la complessità di tempo è costante (cioè O(1)).
  322.     spazio:
  323.     Nell'algoritmo vengono impiegati un grafo e una lista di etichette per cui la complessità di spazio corrisponde a O(|V| + |E|)
  324.     con |V| = numero vertici, |E| = numero archi.
  325. }
  326.  
  327. relaxCost
  328. {
  329.     tempo:
  330.     L'algoritmo esegue delle operazioni aritmetiche singole in base alla verifica di una condizione in un'espressione condizionale, per cui
  331.     la complessità di tempo è costante (cioè O(1)).
  332.     spazio:
  333.     Nell'algoritmo vengono impiegati un grafo e una lista di etichette per cui la complessità di spazio corrisponde a O(|V| + |E|)
  334.     con |V| = numero vertici, |E| = numero archi.
  335. }
  336.  
  337. relaxEff
  338. {
  339.     tempo:
  340.     L'algoritmo esegue delle operazioni aritmetiche singole in base alla verifica di una condizione in un'espressione condizionale, per cui
  341.     la complessità di tempo è costante (cioè O(1)).
  342.     spazio:
  343.     Nell'algoritmo vengono impiegati un grafo e una lista di etichette per cui la complessità di spazio corrisponde a O(|V| + |E|)
  344.     con |V| = numero vertici, |E| = numero archi.
  345. }
  346.  
  347. get_min
  348. {
  349.     tempo:
  350.     L'algoritmo esegue un ciclo su un array di struct ed esegue delle singole operazioni in seguito al verificarsi di alcune condizioni;
  351.     per cui la complessità asintotica di tempo corrisponde a O(n) con n = grandezza array di etichette.
  352.     spazio:
  353.     Viene impiegato un array di struct per cui la complessità di spazio corrisponde ad O(n) con n = grandezza array di etichette.
  354. }
  355.  
  356. calcPeso
  357. {
  358.     tempo:
  359.     Nell'algoritmo c'è un ciclo while che itera sulla lista di adiacenze del nodo di partenza che serve per trovare l'arco corrispondente con il vertice
  360.     'dest' passato alla funzione per poi ritornare l'eventuale distanza se c'è. La complessità di tempo nel caso peggiore è O(|E|) con |E| = numero archi.
  361.     spazio:
  362.     Nell'algoritmo si usa un grafo per cui la complessità spaziale corrisponde alla sua grandezza e cioè O(|V| + |E|) dove |V| è il numero di vertici presenti.
  363. }
  364.  
  365. djkstra
  366. {
  367.     tempo:
  368.     Nell'algoritmo vengono eseguiti:
  369.     - un ciclo for sul numero dei vertici del grafo (complessità O(|V|));
  370.     - un ciclo while sul numero dei nodi del grafo (complessità O(|V|)) ed al suo interno:
  371.     - - una chiamata alla funzione get_min (complessità O(|V|));
  372.     - - un ciclo while sul numero di archi di un nodo che vengono impiegati per la chiamata alla funzione relaxCost,relaxDist,relaxEff (complessità totale O(|E|));
  373.     che danno al ciclo while la complessità totale di O(|V|*((V)+(E)));
  374.     - un ciclo while che nel caso peggiore itera su tutti i nodi del grafo (complessità O(|V|)).
  375.     La complessità totale dell'algoritmo in termini di tempo è di O(|V|) + O(|V|)*O(|V|+|E|) + O(|V|) = O(|V|) * O(|V|+|E|).
  376.     spazio:
  377.     Nell'algoritmo viene usato un grafo (complessità O(|V|+|E|)) e viene creata una lista concatenata che rappresenta il percorso minimo tra i vertici
  378.     del grafo (complessità O(|V|)) per cui la complessità spaziale asintotica arriva ad un valore di O(|V|+|E|).
  379. }
  380.  
  381. MAIN.C
  382.  
  383.  
  384. main
  385. {
  386.     tempo:
  387.     C'è la funzione Graph_Menu che ha una complessità di tempo nel caso peggiore di O(|V|^2) dove |V| è il numero di vertici del grafo.
  388.     spazio:
  389.     Come nella funzione Graph_Menu, si usa un grafo e si crea la lista rappresentante il percorso minimo di djkstra, ottenendo così la complessità
  390.     di spazio di O(|V|+|E|).
  391. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement