Video: Kenneth Cukier: Big data is better data 2024
En funktion i matematik är helt enkelt ett sätt att kartlägga några ingångar till ett svar. Uttryckt på ett annat sätt är en -funktion en transformation (baserat på matematikoperationer) som omvandlar (kartlägger) inmatningen till ett svar.
För vissa värden för inmatning (vanligtvis betecknad med bokstäverna x eller n) har du ett motsvarande svar med matematiken som definierar funktionen. Exempelvis anger en funktion som f (n) = 2 n att när ditt ingång är ett tal n, är ditt svar är talet n multiplicerat med 2.
Med hjälp av storleken på inmatningen är det meningsfullt med tanke på att det här är en tidskritisk ålder och människors liv är proppade med en växande mängd data. Att göra allt en matematisk funktion är lite mindre intuitiv, men en funktion som beskriver hur en algoritm relaterar sin lösning till den mängd data den tar emot är något du kan analysera utan specifikt hårdvaru- eller mjukvaruunderstöd. Det är också lätt att jämföra med andra lösningar, med tanke på storleken på ditt problem. Analys av algoritmer är verkligen ett tankegångskoncept eftersom det reducerar en komplex serie av steg till en matematisk formel.
För det mesta är en analys av algoritmer inte ens intresserad av att definiera funktionen exakt. Vad du verkligen vill göra är att jämföra en målfunktion med en annan funktion. Dessa jämförelsefunktioner förekommer inom en uppsättning föreslagna funktioner som utför dåligt i motsats till målalgoritmen. På så sätt behöver du inte ansluta tal till funktioner med större eller mindre komplexitet. I stället handlar du om enkla, färdiga och välkända funktioner. Det kan låta grovt, men det är mer effektivt och liknar att klassificera algoritmens prestanda i kategorier, i stället för att få en exakt prestandamätning.
Satsen av generaliserade funktioner kallas Big O notation, och du stöter ofta på den här lilla uppsättningen funktioner (läggs i parentes och föregås av en huvudstad O >) används för att representera algoritmernas prestanda. Figuren visar analysen av en algoritm. Ett kartesiskt koordinatsystem kan representera sin funktion, mätt med RAM-simulering, där abscissa (x-koordinaten) är storleken på ingången och ordinate (y-koordinaten) är dess resulterande antal operationer. Du kan se tre kurvor representerade. Inmatningsstorlek betyder. Kvaliteten är dock också viktig (till exempel när du beställer problem är det snabbare att beställa en inmatning som redan är nästan beställd).Följaktligen visar analysen ett värsta fall, f 1 (n), ett genomsnittfall, f 2 (n) och ett bästa fall, f 3 (n). Även om det genomsnittliga fallet kan ge dig en allmän uppfattning, är det som du verkligen bryr dig om, det värsta fallet, eftersom det kan uppstå problem när din algoritm kämpar för att nå en lösning. Big O-funktionen är den som efter ett visst värde
n0
(tröskeln för att överväga en stor ingång) resulterar alltid i ett större antal operationer med samma ingång än värsta fallfunktionen > f1
. Således är Big O-funktionen ännu mer pessimistisk än den som representerar din algoritm, så oavsett kvaliteten på inmatningen kan du vara säker på att saker inte kan bli värre än det.
Komplexiteten hos en algoritm vid bästa, genomsnittliga och värsta inmatningsfall.
Många möjliga funktioner kan leda till sämre resultat, men valet av funktioner som erbjuds av Big O-notationen som du kan använda är begränsade eftersom dess syfte är att förenkla komplexitetsmätningen genom att föreslå en standard. Följaktligen innehåller detta avsnitt bara de få funktioner som ingår i Big O notationen. Följande lista beskriver dem i växande ordning av komplexitet:
Samma tid, oavsett hur mycket input du tillhandahåller. I slutändan är det ett konstant antal operationer, oavsett hur länge ingångsdata är. Denna nivå av komplexitet är ganska sällsynt i praktiken.
- Logaritmisk komplexitet O (log n): Antalet operationer växer långsammare än ingången, vilket gör algoritmen mindre effektiv med små ingångar och effektivare med större. En typisk algoritm för denna klass är binärsökningen.
- Linjär komplexitet O (n): Verksamheten växer med ingången i ett 1: 1-förhållande. En typisk algoritm är iteration, vilket är när du skannar inmatning en gång och tillämpar en operation på varje element av det.
- Linearitmisk komplexitet O (n log n): Komplexitet är en blandning mellan logaritmisk och linjär komplexitet. Det är typiskt för vissa smarta algoritmer som används för att beställa data, till exempel Mergesort, Heapsort och Quicksort.
- Kvadratisk komplexitet O (n 2
- ): Verksamheten växer som en kvadrat av antalet ingångar. När du har en iteration inuti en annan iteration (kapslade iterationer, i datavetenskap), har du kvadratisk komplexitet. Du har till exempel en lista över namn och för att hitta de mest liknande, jämför du varje namn mot alla andra namn. Några mindre effektiva beställningsalgoritmer presenterar sådan komplexitet: bubbelsort, urvalssort och insertionssort. Denna nivå av komplexitet innebär att dina algoritmer kan springa i timmar eller till och med dagar innan de når en lösning. Kubisk komplexitet O (n 3
- ): Operationerna växer ännu snabbare än kvadratisk komplexitet eftersom nu har du flera nestade iterationer. När en algoritm har denna ordning med komplexitet och du behöver bearbeta en blygsam mängd data (100 000 element), kan din algoritm löpa i flera år.När du har ett antal operationer som är en kraft för ingången är det vanligt att referera till algoritmen som som körs i polynomaltid. Exponentiell komplexitet O (2 n
- ): Algoritmen tar dubbelt så många tidigare operationer för varje nytt element som läggs till. När en algoritm har denna komplexitet kan även små problem ta evigt. Många algoritmer som gör uttömmande sökningar har exponentiell komplexitet. Det klassiska exemplet för denna nivå av komplexitet är emellertid beräkningen av Fibonacci-nummer. Faktisk komplexitet O (n!): En riktig mardröm av komplexitet på grund av det stora antalet möjliga kombinationer mellan elementen. Tänk dig: Om din ingång är 100 objekt och en operation på din dator tar 10
- -6 sekunder (en rimlig hastighet för varje dator, nuförtiden) behöver du cirka 10 140 år för att slutföra uppgiften framgångsrikt (en omöjlig tid sedan universums ålder uppskattas vara 10 14 år). Ett känt problem med problemkomplexiteten är det resande säljareproblemet, där en säljare måste hitta den kortaste vägen för att besöka många städer och komma tillbaka till startstaden.