Jag försöker mäta tidskomplexiteten för olika sorteringsalgoritmer, men jag vet inte hur jag ska skriva ett bra program som mäter de olika tiderna. Jag vill testa en algoritm ex, selectionssort, optimera koden, testa igen för att se om jag får bättre resultat osv. Någon som kan hjälpa mig att komma igång med att skriva ett testprogram?
Man kan matematiskt få fram tidskomplexiteten. Därvid bör det gå alldeles utmärkt att göra ett program som analyserar algoritmens kod och på det sättet får fram värdena. Fast det är nog inte så trivialt ;)
Är det i runtime så är det väl bara att ta tiden från att algoritmen exekverar till att den terminerar.
I bash finns det även en fiffig funktion som mäter hur lång tid det tar att köra ett visst program, time. I stället för att köra programmet med t.ex. ./thehack arg1 arg2 skriver du i stället time ./thehack arg1 arg2.
Jag ska tillägga at jag är ingen van C-programmerare. Hur menar du att jag ska få fram runtime?
/Johnny
Se spangos svar :)
Men ifall det är något du ska sen exempelvis skriva en rapport om, så bör du nog även härleda dina resultat matematiskt. Sök på "ordo time complexity" så kan du kanske hitta en del matnyttigt i ämnet.
Problemet är väl att du inte får det särskilt exakt eftersom processchemaläggaren i operativsystemet troligen byter till nån annan process någon eller flera ggr nånstans mellan start och stop. Ju fler andra processer du har igång desto större o-exakthet. För att köra det någorlunda oantastat behöver du låsa den process som exekvererar "testet" mellan start och stop. Ett annat sätt kan vara att ge den exekverande processen max prioritet för att komma så nära ett exakt svar som möjligt.
Om det inte är väldigt hemliga algoritmer kan du väl skriva dem här?
För tillfället läser jag "Algoritmer och datastrukturer" där vi till stor del räknar på olika algoritmers tidskomplexitet.
Det vore fin övning om inte annat :)
Nä det är inte hemliga, jag går en kurs där man ska optimera färdigskrivna sorteringsalgortimer i C, dvs vi har fått kod men ska hitta möjligheter att optimera den. Vi har fått algoritmerna bubble-sort och selectionssort. Vill du ha den icke optimerade koden?
Problemet är väl att du inte får det särskilt exakt eftersom processchemaläggaren i operativsystemet troligen byter till nån annan process någon eller flera ggr nånstans mellan start och stop. Ju fler andra processer du har igång desto större o-exakthet. För att köra det någorlunda oantastat behöver du låsa den process som exekvererar "testet" mellan start och stop. Ett annat sätt kan vara att ge den exekverande processen max prioritet för att komma så nära ett exakt svar som möjligt.
Har du tid att förklara hur antingen eller den andra metoden kan genomföras?
Problemet är väl att du inte får det särskilt exakt eftersom processchemaläggaren i operativsystemet troligen byter till nån annan process någon eller flera ggr nånstans mellan start och stop. Ju fler andra processer du har igång desto större o-exakthet.
Nope, faktiskt inte
clock() ska enbart mäta (eller snarare approximera) den tid som faktiskt använts av processorn.
Jaaaaha, där ser man, jag kolla på sidan och det står som du säger:
The clock() function returns the implementation's best approximation to the processor time used by the process since the beginning of an implementation-dependent time related only to the process invocation.
Problemet är väl att du inte får det särskilt exakt eftersom processchemaläggaren i operativsystemet troligen byter till nån annan process någon eller flera ggr nånstans mellan start och stop. Ju fler andra processer du har igång desto större o-exakthet.
Jovisst. Men cpu:n delas ju av flera andra processer som schemaläggaren genom att avbryta tilldelar körtid, eller hur? Även om det är en approximation så är den inte särskilt exakt. Med följande kod blir det (när jag testar den) relativt stora avvikelser beroende på hur många andra processer som är igång samtidigt:
Allt hänger väl på hur exakt man vill att det ska vara. Men om man som det verkar, är ute efter att göra optimeringar i kodsnuttar borde man nog sträva efter ett så tillförlitligt resultat som möjligt? Talar vi millisekunder eller mikrosekunder?
Ska man vara riktigt äckligt exakt behöver man stänga av alla avbrott för att låsa processen och mäta exakt hur många klocktick processorn använt. Vilket i sin tur ger vid handen att det är nog smartare att optimera "matematiskt" genom vanlig algoritmanalys istället :)
263 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849