+ All Categories
Home > Documents > 1 Tecniche di programmazione ArrayListvs. LinkedList · 37 Tecniche di programmazione A.A. 2015/16...

1 Tecniche di programmazione ArrayListvs. LinkedList · 37 Tecniche di programmazione A.A. 2015/16...

Date post: 29-May-2020
Category:
Upload: others
View: 4 times
Download: 0 times
Share this document with a friend
39
3/15/2016 1 Collection Family Tree A.A. 2015/16 Tecniche di programmazione 1 ArrayList vs. LinkedList A.A. 2015/16 Tecniche di programmazione 2 ArrayList LinkedList add(element) IMMEDIATE IMMEDIATE remove(object) SLUGGISH IMMEDIATE get(index) IMMEDIATE SLUGGISH set(index, element) IMMEDIATE SLUGGISH add(index, element) SLUGGISH SLUGGISH remove(index) SLUGGISH SLUGGISH contains(object) SLUGGISH SLUGGISH indexOf(object) SLUGGISH SLUGGISH
Transcript
Page 1: 1 Tecniche di programmazione ArrayListvs. LinkedList · 37 Tecniche di programmazione A.A. 2015/16 Because of the approximations available through Big-Oh , the actual T(n) of an algorithm

3/15/2016

1

Collection Family Tree

A.A. 2015/16Tecniche di programmazione1

ArrayList vs. LinkedList

A.A. 2015/16Tecniche di programmazione2

ArrayList LinkedList

add(element) IMMEDIATE IMMEDIATE

remove(object) SLUGGISH IMMEDIATE

get(index) IMMEDIATE SLUGGISH

set(index, element) IMMEDIATE SLUGGISH

add(index, element) SLUGGISH SLUGGISH

remove(index) SLUGGISH SLUGGISH

contains(object) SLUGGISH SLUGGISH

indexOf(object) SLUGGISH SLUGGISH

Page 2: 1 Tecniche di programmazione ArrayListvs. LinkedList · 37 Tecniche di programmazione A.A. 2015/16 Because of the approximations available through Big-Oh , the actual T(n) of an algorithm

3/15/2016

2

Computational complexity

How to measure the difficulty of a problem

How to Measure Efficiency?

A.A. 2015/16Tecniche di programmazione

Critical resources

programmer’s effort

time, space (disk, RAM)

Analysis

empirical (run programs)

analytical (asymptotic algorithm analysis)

Worst case vs. Average case

4

Page 3: 1 Tecniche di programmazione ArrayListvs. LinkedList · 37 Tecniche di programmazione A.A. 2015/16 Because of the approximations available through Big-Oh , the actual T(n) of an algorithm

3/15/2016

3

Moore’s “Law”?

A.A. 2015/16Tecniche di programmazione5

Moore’s “Law”?

A.A. 2015/16Tecniche di programmazione6

Page 4: 1 Tecniche di programmazione ArrayListvs. LinkedList · 37 Tecniche di programmazione A.A. 2015/16 Because of the approximations available through Big-Oh , the actual T(n) of an algorithm

3/15/2016

4

Sudoku

A.A. 2015/16Tecniche di programmazione7

Problems and Algorithms

A.A. 2015/16Tecniche di programmazione8

We know the efficiency of the solution

… but what about the difficulty of the problem?

Different concepts

Algorithm complexity

Problem complexity

Page 5: 1 Tecniche di programmazione ArrayListvs. LinkedList · 37 Tecniche di programmazione A.A. 2015/16 Because of the approximations available through Big-Oh , the actual T(n) of an algorithm

3/15/2016

5

Analytical Approach

A.A. 2015/16Tecniche di programmazione

An algorithm is a mapping

For most algorithms, running time depends on “size” of the input

Running time is expressed as T(n)

some function T

input size n

9

Bubble sort

A.A. 2015/16Tecniche di programmazione10

Page 6: 1 Tecniche di programmazione ArrayListvs. LinkedList · 37 Tecniche di programmazione A.A. 2015/16 Because of the approximations available through Big-Oh , the actual T(n) of an algorithm

3/15/2016

6

Analysis

A.A. 2015/16Tecniche di programmazione

The bubble sort takes (n2-n)/2 “steps”

Different implementations/assembly languages

Program A on an Intel Pentium IV: T(n) = 58*(n2-n)/2

Program B on a Motorola: T(n) = 84*(n2-2n)/2

Program C on an Intel Pentium V: T(n) = 44*(n2-n)/2

Note that each has an n2 term

as n increases, the other terms will drop out

11

Analysis

A.A. 2015/16Tecniche di programmazione

As a result:

Program A on Intel Pentium IV: T(n) ≈ 29n2

Program B on Motorola: T(n) ≈ 42n2

Program C on Intel Pentium V: T(n) ≈ 22n2

12

Page 7: 1 Tecniche di programmazione ArrayListvs. LinkedList · 37 Tecniche di programmazione A.A. 2015/16 Because of the approximations available through Big-Oh , the actual T(n) of an algorithm

3/15/2016

7

Analysis

A.A. 2015/16Tecniche di programmazione

As processors change, the constants will always change

The exponent on n will not

We should not care about the constants

As a result:

Program A: T(n) ≈ n2

Program B: T(n) ≈ n2

Program C: T(n) ≈ n2

Bubble sort: T(n) ≈ n2

13

Intuitive motivations

A.A. 2015/16Tecniche di programmazione

Asymptotic notation captures behavior of functions for large values of x.

Dominant term of 3x3 + 5x2 – 9 is 3x3

As x becomes larger and larger, other terms become insignificant and only 3x3 remains in the picture

14

Page 8: 1 Tecniche di programmazione ArrayListvs. LinkedList · 37 Tecniche di programmazione A.A. 2015/16 Because of the approximations available through Big-Oh , the actual T(n) of an algorithm

3/15/2016

8

Complexity Analysis

A.A. 2015/16Tecniche di programmazione

O( · )

big o (big oh)

Ω( · )

big omega

Θ( · )

big theta

15

O( · )

A.A. 2015/16Tecniche di programmazione

Upper Bounding Running Time

Why?

Little-oh

“Order of”

D’Oh

Oh!

16

Page 9: 1 Tecniche di programmazione ArrayListvs. LinkedList · 37 Tecniche di programmazione A.A. 2015/16 Because of the approximations available through Big-Oh , the actual T(n) of an algorithm

3/15/2016

9

Upper Bounding Running Time

A.A. 2015/16Tecniche di programmazione17

f(n) is O(g(n)) if f grows “at most as fast as” g

Big-O (formal)

A.A. 2015/16Tecniche di programmazione18

Let f and g be two functions such that

if there exists positive constants c and n0 such that

then we can write

( ) ( ) ++ →→ RNngandRNnf ::

( ) ( )( )ngOnf =

( ) ( ) 0, nnallforncgnf >≤

Page 10: 1 Tecniche di programmazione ArrayListvs. LinkedList · 37 Tecniche di programmazione A.A. 2015/16 Because of the approximations available through Big-Oh , the actual T(n) of an algorithm

3/15/2016

10

Big-O (formal alt)

A.A. 2015/16Tecniche di programmazione19

Let f and g be two functions such that

if there exists positive constants c and n0 such that

then we can write

( ) ( ) ++ →→ RNngandRNnf ::

( ) ( )( )ngOnf =

( )( ) ∞<=≤

∞→c

ng

nfnlim0

Example

A.A. 2015/16Tecniche di programmazione20

(log n)2 = O(n)

Page 11: 1 Tecniche di programmazione ArrayListvs. LinkedList · 37 Tecniche di programmazione A.A. 2015/16 Because of the approximations available through Big-Oh , the actual T(n) of an algorithm

3/15/2016

11

Notational Issues

A.A. 2015/16Tecniche di programmazione

Big-O notation is a way of comparing functions

Notation quite unconventional

e.g., 3x3 + 5x2 – 9 = O(x3)

Doesn’t mean

“3x3 + 5x2 – 9 equals the function O(x3)”

“3x3 + 5x2 – 9 is big oh of x3”

But

“3x3+5x2 –9 is dominated by x3”

21

Common Misunderstanding

A.A. 2015/16Tecniche di programmazione

3x3 + 5x2 – 9 = O(x3)

However, also true are:

3x3 + 5x2 – 9 = O(x4)

x3 = O(3x3 + 5x2 – 9)

sin(x) = O(x4)

Note:

Usage of big-O typically involves mentioningonly the most dominant term

“The running time is O(x2.5)”

22

Page 12: 1 Tecniche di programmazione ArrayListvs. LinkedList · 37 Tecniche di programmazione A.A. 2015/16 Because of the approximations available through Big-Oh , the actual T(n) of an algorithm

3/15/2016

12

Lower Bounding Running Time

A.A. 2015/16Tecniche di programmazione23

f(n) is Ω(g(n)) if f grows “at least as fast as” g

cg(n) is an approximation to f(n) bounding from below

Big-Omega (formal)

A.A. 2015/16Tecniche di programmazione24

Let f and g be two functions such that

if there exists positive constants c and n0 such that

then we can write

( ) ( ) ++ →→ RNngandRNnf ::

( ) ( ) 0, nnallforncgnf >≥

( ) ( )( )ngnf Ω=

Page 13: 1 Tecniche di programmazione ArrayListvs. LinkedList · 37 Tecniche di programmazione A.A. 2015/16 Because of the approximations available through Big-Oh , the actual T(n) of an algorithm

3/15/2016

13

Tightly Bounding Running Time

A.A. 2015/16Tecniche di programmazione25

f(n) is Θ(g(n)) if f is essentially the same as g, to

within a constant multiple

Big-Theta (formal)

A.A. 2015/16Tecniche di programmazione26

Let f and g be two functions such that

if there exists positive constants c1, c2 and n0 such that

then we can write

( ) ( ) ++ →→ RNngandRNnf ::

( ) ( ) ( ) 021 , nnallforngcnfngc >≤≤

( ) ( )( )ngnf Θ=

Page 14: 1 Tecniche di programmazione ArrayListvs. LinkedList · 37 Tecniche di programmazione A.A. 2015/16 Because of the approximations available through Big-Oh , the actual T(n) of an algorithm

3/15/2016

14

Big-Θ, Big-O, and Big-Ω

A.A. 2015/16Tecniche di programmazione27

Big-Ω and Big-Θ

A.A. 2015/16Tecniche di programmazione

Big-Ω: reverse of big-O. I.e.

f (x ) = Ω(g (x ))

iff

g (x ) = O (f (x ))

so f(x) asymptotically dominates g(x)

28

Page 15: 1 Tecniche di programmazione ArrayListvs. LinkedList · 37 Tecniche di programmazione A.A. 2015/16 Because of the approximations available through Big-Oh , the actual T(n) of an algorithm

3/15/2016

15

Big-Ω and Big-Θ

A.A. 2015/16Tecniche di programmazione

Big-Θ: domination in both directions. I.e.

f (x ) = Θ(g (x ))

iff

f (x ) = O (g (x )) && f (x ) = Ω(g (x ))

29

Problem

A.A. 2015/16Tecniche di programmazione

Order the following from smallest to largest asymptotically. Group together all functions which are big-Θ of each other:

xex xxexxx

xxxxx ,,,13,1

13,1

,,ln,sin ++++

xxxxxxxx 2220 lg,)(ln,ln),102)(sin( −+

30

Page 16: 1 Tecniche di programmazione ArrayListvs. LinkedList · 37 Tecniche di programmazione A.A. 2015/16 Because of the approximations available through Big-Oh , the actual T(n) of an algorithm

3/15/2016

16

Solution

A.A. 2015/16Tecniche di programmazione

xe)102)(sin( 20 −+ xxx

x1

xlnx113+

x2lgxxxxx +++ 13,,sin

ex

xx ln2)(ln xx

xx

31

Practical approach

A.A. 2015/16Tecniche di programmazione32

Page 17: 1 Tecniche di programmazione ArrayListvs. LinkedList · 37 Tecniche di programmazione A.A. 2015/16 Because of the approximations available through Big-Oh , the actual T(n) of an algorithm

3/15/2016

17

Practical approach

A.A. 2015/16Tecniche di programmazione33

A.A. 2015/16Tecniche di programmazione34

Page 18: 1 Tecniche di programmazione ArrayListvs. LinkedList · 37 Tecniche di programmazione A.A. 2015/16 Because of the approximations available through Big-Oh , the actual T(n) of an algorithm

3/15/2016

18

A.A. 2015/16Tecniche di programmazione35

Would it be possible?

A.A. 2015/16Tecniche di programmazione36

Algorithm Foo Bar

Complexity O(n2) O(2n)

n = 100 10s 4s

n = 1000 12s 4.5s

Page 19: 1 Tecniche di programmazione ArrayListvs. LinkedList · 37 Tecniche di programmazione A.A. 2015/16 Because of the approximations available through Big-Oh , the actual T(n) of an algorithm

3/15/2016

19

Determination of Time Complexity

A.A. 2015/16Tecniche di programmazione37

Because of the approximations available through Big-Oh , the actual T(n) of an algorithm is not calculated

T(n) may be determined empirically

Big-Oh is usually determined by application of some simple 5 rules

Rule #1

A.A. 2015/16Tecniche di programmazione38

Simple program statements are assumed to take a constant amount of time which is

O(1)

Page 20: 1 Tecniche di programmazione ArrayListvs. LinkedList · 37 Tecniche di programmazione A.A. 2015/16 Because of the approximations available through Big-Oh , the actual T(n) of an algorithm

3/15/2016

20

Rule #2

A.A. 2015/16Tecniche di programmazione39

Differences in execution time of simple statements is ignored

Rule #3

A.A. 2015/16Tecniche di programmazione40

In conditional statements the worst case is always used

Page 21: 1 Tecniche di programmazione ArrayListvs. LinkedList · 37 Tecniche di programmazione A.A. 2015/16 Because of the approximations available through Big-Oh , the actual T(n) of an algorithm

3/15/2016

21

Rule #4 – the “sum” rule

A.A. 2015/16Tecniche di programmazione41

The running time of a sequence of steps has the order of the running time of the largest

E.g.,

f(n) = O(n2)

g(n) = O(n3)

f(n) + g(n) = O(n3)

Rule #5 – the “product” rule

A.A. 2015/16Tecniche di programmazione42

If two processes are constructed such that second process is repeated a number of times for each n in the first process, then O is equal to the product of the orders of magnitude for both products

E.g.,

For example, a two-dimensional array has one for loop inside another and each internal loop is executed n times for each value of the external loop.

The function is O(n2)

Page 22: 1 Tecniche di programmazione ArrayListvs. LinkedList · 37 Tecniche di programmazione A.A. 2015/16 Because of the approximations available through Big-Oh , the actual T(n) of an algorithm

3/15/2016

22

Nested Loops

A.A. 2015/16Tecniche di programmazione43

for(int t=0; t<n; ++t)

for(int u=0; u<n; ++u)

++zap;

O(n)O(1)

Nested Loops

A.A. 2015/16Tecniche di programmazione44

for(int t=0; t<n; ++t)

for(int u=0; u<n; ++u)

++zap;

O(n*1)

Page 23: 1 Tecniche di programmazione ArrayListvs. LinkedList · 37 Tecniche di programmazione A.A. 2015/16 Because of the approximations available through Big-Oh , the actual T(n) of an algorithm

3/15/2016

23

Nested Loops

A.A. 2015/16Tecniche di programmazione45

for(int t=0; t<n; ++t)

for(int u=0; u<n; ++u)

++zap;

O(n)

O(n)

Nested Loops

A.A. 2015/16Tecniche di programmazione46

for(int t=0; t<n; ++t)

for(int u=0; u<n; ++u)

++zap;

O(n2)

Page 24: 1 Tecniche di programmazione ArrayListvs. LinkedList · 37 Tecniche di programmazione A.A. 2015/16 Because of the approximations available through Big-Oh , the actual T(n) of an algorithm

3/15/2016

24

Nested Loops

A.A. 2015/16Tecniche di programmazione47

Note: Running time grows with nesting rather than the length of the code

for(int t=0; t<n; ++t)

for(int u=0; u<n; ++u)

++zap;

O(n2)

More Nested Loops

A.A. 2015/16Tecniche di programmazione48

for(int t=0; t<n; ++t)

for(int u=t; u<n; ++u)

++zap;

( ) ( ) ( )22

1

0 22

1nO

nnnnin

n

i=−=−=−∑

=

tn −

Page 25: 1 Tecniche di programmazione ArrayListvs. LinkedList · 37 Tecniche di programmazione A.A. 2015/16 Because of the approximations available through Big-Oh , the actual T(n) of an algorithm

3/15/2016

25

Sequential statements

A.A. 2015/16Tecniche di programmazione49

Running time: max(O(n), O(n2)) = O(n2)

for(int z=0; z<n; ++z)

zap[z] = 0;

for(int t=0; t<n; ++t)

for(int u=t; u<n; ++u)

++zap;

O(n)

O(n2)

Conditionals

A.A. 2015/16Tecniche di programmazione50

for(int t=0; t<n; ++t)

if(t%2)

for(int u=t; u<n; ++u)

++zap;

else

zap = 0;

O(n)

O(1)

Page 26: 1 Tecniche di programmazione ArrayListvs. LinkedList · 37 Tecniche di programmazione A.A. 2015/16 Because of the approximations available through Big-Oh , the actual T(n) of an algorithm

3/15/2016

26

Conditionals

A.A. 2015/16Tecniche di programmazione51

for(int t=0; t<n; ++t)

if(t%2)

for(int u=t; u<n; ++u)

++zap;

else

zap = 0;

O(n2)

A.A. 2015/16Tecniche di programmazione52

Page 27: 1 Tecniche di programmazione ArrayListvs. LinkedList · 37 Tecniche di programmazione A.A. 2015/16 Because of the approximations available through Big-Oh , the actual T(n) of an algorithm

3/15/2016

27

Tips

A.A. 2015/16Tecniche di programmazione53

Focus only on the dominant (high cost) operations and avoid a line-by-line exact analysis

Break algorithm down into “known” pieces

Identify relationships between pieces

Sequential is additive

Nested (loop / recursion) is multiplicative

Drop constants

Keep only dominant factor for each variable

Caveats

A.A. 2015/16Tecniche di programmazione54

Real time vs. complexity

Page 28: 1 Tecniche di programmazione ArrayListvs. LinkedList · 37 Tecniche di programmazione A.A. 2015/16 Because of the approximations available through Big-Oh , the actual T(n) of an algorithm

3/15/2016

28

Caveats

A.A. 2015/16Tecniche di programmazione55

Real time vs. complexity

CPU time vs. RAM vs. disk

Caveats

A.A. 2015/16Tecniche di programmazione56

Real time vs. complexity

CPU time vs. RAM vs. disk

Worse, Average or Best Case?

Page 29: 1 Tecniche di programmazione ArrayListvs. LinkedList · 37 Tecniche di programmazione A.A. 2015/16 Because of the approximations available through Big-Oh , the actual T(n) of an algorithm

3/15/2016

29

Worse, Average or Best Case?

57 A.A. 2015/16Tecniche di programmazione

Worse, Average or Best Case?

Depends on input problem instance type

58 A.A. 2015/16Tecniche di programmazione

Page 30: 1 Tecniche di programmazione ArrayListvs. LinkedList · 37 Tecniche di programmazione A.A. 2015/16 Because of the approximations available through Big-Oh , the actual T(n) of an algorithm

3/15/2016

30

Computational Complexity Theory

A.A. 2015/16Tecniche di programmazione59

In computer science, computational complexity theory is the branch of the theory of computation that studies the resources, or cost, of the computation required to solve a given computational problem

Complexity theory analyzes the difficulty of computational problems in terms of many different computational resources

Note

A.A. 2015/16Tecniche di programmazione60

Solve a problem

vs.

Verify a solution

E.g.,

Sort

Shortest path

Page 31: 1 Tecniche di programmazione ArrayListvs. LinkedList · 37 Tecniche di programmazione A.A. 2015/16 Because of the approximations available through Big-Oh , the actual T(n) of an algorithm

3/15/2016

31

Complexity Classes

A.A. 2015/16Tecniche di programmazione61

A complexity class is the set of all of the computational problems which can be solved using a certain amount of a certain computational resource

Deterministic Turing Machine

A.A. 2015/16Tecniche di programmazione62

Deterministic or Turing machines are extremely basic symbol-manipulating devices which — despite their simplicity — can be adapted to simulate the logic of any computer that could possibly be constructed

Described in 1936 by Alan Turing.

Not meant to be a practical computing technology

Technically feasible

A thought experiment about the limits of mechanical computation

Page 32: 1 Tecniche di programmazione ArrayListvs. LinkedList · 37 Tecniche di programmazione A.A. 2015/16 Because of the approximations available through Big-Oh , the actual T(n) of an algorithm

3/15/2016

32

Deterministic Turing Machine

A.A. 2015/16Tecniche di programmazione63

Non-Deterministic Turing Machine

A.A. 2015/16Tecniche di programmazione64

Turing machine whose control mechanism works like a non-deterministic finite automaton

Page 33: 1 Tecniche di programmazione ArrayListvs. LinkedList · 37 Tecniche di programmazione A.A. 2015/16 Because of the approximations available through Big-Oh , the actual T(n) of an algorithm

3/15/2016

33

A.A. 2015/16Tecniche di programmazione65

A.A. 2015/16Tecniche di programmazione66

Class Resource Model Constraint

DTIME(f(n)) Time DTM ()

P Time DTM O()

EXPTIME Time DTM O(2)

NTIME Time NDTM ()

NP Time NDTM O()

NEXPTIME Time NDTM O(2)

DSPACE(f(n)) Space DTM ()

L Space DTM O(log ())

PSPACE Space DTM O()

EXPSPACE Space DTM O(2)

NSPACE(f(n)) Space NDTM ()

NL Space NDTM O(log ())

NPSPACE Space NDTM O()

NEXPSPACE Space NDTM O(2)

Page 34: 1 Tecniche di programmazione ArrayListvs. LinkedList · 37 Tecniche di programmazione A.A. 2015/16 Because of the approximations available through Big-Oh , the actual T(n) of an algorithm

3/15/2016

34

Basic Asymptotic Efficiency Classes

A.A. 2015/16Tecniche di programmazione67

Basic Asymptotic Efficiency Classes

A.A. 2015/16Tecniche di programmazione68

Page 35: 1 Tecniche di programmazione ArrayListvs. LinkedList · 37 Tecniche di programmazione A.A. 2015/16 Because of the approximations available through Big-Oh , the actual T(n) of an algorithm

3/15/2016

35

Basic Asymptotic Efficiency Classes

A.A. 2015/16Tecniche di programmazione69

Basic Asymptotic Efficiency Classes

A.A. 2015/16Tecniche di programmazione70

Page 36: 1 Tecniche di programmazione ArrayListvs. LinkedList · 37 Tecniche di programmazione A.A. 2015/16 Because of the approximations available through Big-Oh , the actual T(n) of an algorithm

3/15/2016

36

Basic Asymptotic Efficiency Classes

A.A. 2015/16Tecniche di programmazione71

Basic Asymptotic Efficiency Classes

A.A. 2015/16Tecniche di programmazione72

Page 37: 1 Tecniche di programmazione ArrayListvs. LinkedList · 37 Tecniche di programmazione A.A. 2015/16 Because of the approximations available through Big-Oh , the actual T(n) of an algorithm

3/15/2016

37

Basic Asymptotic Efficiency Classes

A.A. 2015/16Tecniche di programmazione73

Basic Asymptotic Efficiency Classes

A.A. 2015/16Tecniche di programmazione74

Page 38: 1 Tecniche di programmazione ArrayListvs. LinkedList · 37 Tecniche di programmazione A.A. 2015/16 Because of the approximations available through Big-Oh , the actual T(n) of an algorithm

3/15/2016

38

ArrayList vs. LinkedList

A.A. 2015/16Tecniche di programmazione75

ArrayList LinkedList

add(element) O(1) O(1)

remove(object) O(n) + O(n) O(n) + O(1)

get(index) O(1) O(n)

set(index, element) O(1) O(n) + O(1)

add(index, element) O(1) + O(n) O(n) + O(1)

remove(index) O(n) O(n) + O(1)

contains(object) O(n) O(n)

indexOf(object) O(n) O(n)

A.A. 2015/16Tecniche di programmazione76

In theory, there is no difference between theory and practice.

Page 39: 1 Tecniche di programmazione ArrayListvs. LinkedList · 37 Tecniche di programmazione A.A. 2015/16 Because of the approximations available through Big-Oh , the actual T(n) of an algorithm

3/15/2016

39

Licenza d’uso

A.A. 2015/16Tecniche di programmazione77

Queste diapositive sono distribuite con licenza Creative Commons“Attribuzione - Non commerciale - Condividi allo stesso modo (CC BY-NC-SA)”

Sei libero: di riprodurre, distribuire, comunicare al pubblico, esporre in pubblico,

rappresentare, eseguire e recitare quest'opera di modificare quest'opera

Alle seguenti condizioni: Attribuzione — Devi attribuire la paternità dell'opera agli autori

originali e in modo tale da non suggerire che essi avallino te o il modo in cui tu usi l'opera.

Non commerciale — Non puoi usare quest'opera per fini commerciali.

Condividi allo stesso modo — Se alteri o trasformi quest'opera, o se la usi per crearne un'altra, puoi distribuire l'opera risultante solo con una licenza identica o equivalente a questa.

http://creativecommons.org/licenses/by-nc-sa/3.0/


Recommended