Avatar billede conrad Nybegynder
10. december 2003 - 14:39 Der er 13 kommentarer og
1 løsning

algoritme kompleksitet

Jeg mangler en reference eller information om kompleksiteten af (STL) typerne

Map,List og Vector.

jeg har fundet følgende (i toppen):
http://www.cppreference.com/cppvector.html

Det er vel højst sandsynligt sådan at jeg kan slå de  op i en "indledende datastrukturer og algoritme bog".....som er lånt ud. Er der nogen der kan huske/har et link til dem?
Avatar billede arne_v Ekspert
10. december 2003 - 15:20 #1
Kompleksiteten af hvilken operation ?

Umiddelbart vil jeg da sige:

            vector        list      map
add          O(1)        O(1)      O(1)
get          O(1)        O(n)      O(n)
find        O(n)        O(n)      O(1)

(udelukkende baseret på sund fornuft)
Avatar billede soreno Praktikant
10. december 2003 - 15:25 #2
Arne:

Hvorfor er map, get = O(n)

?
Avatar billede arne_v Ekspert
10. december 2003 - 15:30 #3
get = hente element nummer ix

Jeg formoder at man så er nødt til at løbe igennem indtil man har hentet ix.
Avatar billede soreno Praktikant
10. december 2003 - 15:37 #4
Aha, ok.

Nu er jeg ikke så skrap (endnu) til algoritmeanalyse men,
giver det egentlig mening at hente #ix i en map ?
Avatar billede conrad Nybegynder
10. december 2003 - 15:40 #5
Complexity
There are different measurements of the speed of any given algorithm. Given an input size of N, they can be described as follows:

Name Speed Description

exponential time slow takes an amount of time proportional to a constant raised to the Nth power (K^N)

polynomial time fast takes an amount of time proportional to N raised to some constant power (N^K)

linear time faster takes an amount of time directly proportional to N (K * N)

logarithmic time much faster takes an amount of time proportional to the logarithm of N (log(N))

constant time fastest takes a fixed amount of time, no matter how large the input is (K)


http://www.cppreference.com/complexity.html

kombineret med

Vectors contain contiguous elements stored as an array. Accessing members of a vector or appending elements can be done in constant time, whereas locating a specific value or inserting elements into the vector takes linear time.
http://www.cppreference.com/cppvector.html

Lists are sequences of elements stored in a linked list. Compared to vectors, they allow fast insertions and deletions, but slower random access.
http://www.cppreference.com/cpplist.html

DVS list er hurtigere til at indsætte og slette fra, men langsommere til random access. Hvilket ikke fremgår af Komplesiteten (O(n)). Det er begge dele jeg ønsker at udtale mig om.

Jeg kan godt se spørgsmålet nok ikke var super godt formuleret.
Avatar billede arne_v Ekspert
10. december 2003 - 15:44 #6
soreno>

Nej - egentligt ikke.

Men som Bent Larsen engang sagde: man skal se meget før der slides
hul i brille glassene !

Særere ting er set før.
Avatar billede arne_v Ekspert
10. december 2003 - 15:47 #7
O(n) siger kun at tiden er proportional med n når n går mod uendelig.

Ikke noget om om det konstante forhold eller hvor store værdier af n der skal
til førend man nærmer sig det proportionale forhold.

big O analysis kan bruges til at analysere egenskaber ved algoritmer
med hensyn til skalering af data mængder - ikke til at vælge det
hurtigste.
Avatar billede conrad Nybegynder
10. december 2003 - 15:57 #8
Jeg prøver lige at omformulere:

Jeg har to algoritmer A og B (eksempel)hvor jeg vil bestemme kompleksiteten.

A løber igennem et 2d array (samme som Vector ?), finder et element og for hver element foretages en sammenligning :
Er Kompleksitet O(n^2*n) ?

B gør det samme som A, men slår yderligere op i et Map og finder et objekt. Dette Objekt har en list med fx K = 5 element som løbes igennem. Dette har kompleksitet:
O(n^2* n * n(Map get)* K)?

Anden del er at bestemme hvilken betydning det har at bruge vector frem for list ? (De benyttes ikke kun i disse algoritmer)
Avatar billede conrad Nybegynder
10. december 2003 - 15:58 #9
jeg tror godt List vs. Vector problematikken kan negligeres for nu :)
Avatar billede arne_v Ekspert
10. december 2003 - 16:01 #10
Umiddelbart lyder A som O(n^2) og B det samme.

Gennemløb af et 2D array er O(n^2) og resten afhænger som jeg læser det
ikke af n.
Avatar billede conrad Nybegynder
10. december 2003 - 16:09 #11
arne> gennemløb af 2d array = O(n^2) men der er også den ekstra sammenligning som sker bagefter så hvorfor ikke O(n^2 * n) ?
Avatar billede arne_v Ekspert
10. december 2003 - 16:11 #12
En sammenligning er jo O(1) - den tid det tager at sammenligne afhænger
ikke af hvor mange elementer der er i det 2D array.

Derfor stadig O(n^2)
Avatar billede conrad Nybegynder
10. december 2003 - 16:50 #13
Du har selvfølgelig ret Arne.

Jeg har fået besvaret mit spørgsmål så lægger du et svar?
Avatar billede arne_v Ekspert
10. december 2003 - 16:55 #14
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester