Knuth Moving Average
1.5 Inngang og utgang I denne delen utvider vi settet med enkle abstraksjoner (kommandolinjeinngang og standardutgang) som vi har brukt som grensesnitt mellom våre Java-programmer og omverdenen for å inkludere standardinngang. standard tegning. og standard lyd. Standardinngang gjør det praktisk for oss å skrive programmer som behandler vilkårlig mengde inngang og å samhandle med våre standardprogrammer, gjør det mulig for oss å jobbe med grafikk og standard lyd legger til lyd. Fugleperspektiv. Et Java-program tar inn verdier fra kommandolinjen og skriver ut en streng av tegn som utgang. Som standard er både kommandolinjeparametere og standardutgang knyttet til et program som tar kommandoer, som vi refererer til som terminalvinduet. Her er noen instruksjoner for bruk av kommandolinjen på systemet ditt. Mac middot Windows middot Linux Command-line argumenter. Alle våre klasser har en main () metode som tar et String array args som argument. Det arrayet er sekvensen av kommandolinjeparametre som vi skriver. Hvis vi planlegger å være et tall, må vi bruke en metode som Integer. parseInt () for å konvertere den fra String til den aktuelle typen. Standard utgang. For å skrive ut verdier i våre programmer har vi brukt System. out. println (). Java sender resultatene til en abstrakt strøm av tegn kjent som standardutgang. Som standard kobler operativsystemet standardutgang til terminalvinduet. Alle utgangene i våre programmer hittil har vist seg i terminalvinduet. RandomSeq. java bruker denne modellen: Det tar en kommandolinjeprøve n og skriver til standardutgang en sekvens av n tilfeldige tall mellom 0 og 1. For å fullføre vår programmeringsmodell legger vi til følgende biblioteker: Standardinngang. Les tall og strenger fra brukeren. Standard tegning. Plotgrafikk. Standard lyd. Lag lyd. Standard utgang. Javas System. out. print () og System. out. println () metoder implementerer den grunnleggende standardutdataabstraksjonen vi trenger. Likevel, for å behandle standardinngang og standardutgang på en ensartet måte (og for å gi noen tekniske forbedringer), bruker vi liknende metoder som er definert i vårt StdOut-bibliotek: Javas print () og println () metoder er de som du har har brukt. Metoden printf () gir oss mer kontroll over utseendet på utgangen. Formatert utskrift grunnleggende. I sin enkleste form tar printf () to argumenter. Det første argumentet kalles formatstrengen. Den inneholder en konverteringsspesifikasjon som beskriver hvordan det andre argumentet skal konverteres til en streng for utdata. Format strengene begynner med og avsluttes med en bokstavskonverteringskode. Følgende tabell oppsummerer de mest brukte kodene: Format streng. Formatstrengen kan inneholde tegn i tillegg til de for konverteringsspesifikasjonen. Konverteringsspesifikasjonen er erstattet av argumentverdien (konvertert til en streng som angitt) og alle gjenværende tegn sendes gjennom til utgangen. Flere argumenter. Funksjonen printf () kan ta mer enn to argumenter. I dette tilfellet vil formatstrengen ha en ytterligere konverteringsspesifikasjon for hvert ekstra argument. Her er mer dokumentasjon på strengfiksyntaxen for printf-format. Standardinngang. Vårt StdIn-bibliotek tar data fra en standard inngangsstrøm som inneholder en sekvens av verdier skilt av hvitt plass. Hver verdi er en streng eller en verdi fra en av Javas primitive typer. En av hovedtrekkene til standardinndatastrømmen er at programmet bruker verdier når det leser dem. Når programmet har lest en verdi, kan det ikke sikkerhetskopiere og lese det igjen. Biblioteket er definert av følgende API: Vi vurderer nå flere eksempler i detalj. Skriving av inngang. Når du bruker Java-kommandoen til å påberope et Java-program fra kommandolinjen, har du faktisk tre ting: (1) utsteder en kommando for å starte utførelsen av programmet, (2) angir verdiene for kommandolinjeparametrene, og ( 3) begynner å definere standardinngangsstrømmen. Strengen av tegn du skriver inn i terminalvinduet etter kommandolinjen, er standardinngangsstrømmen. For eksempel tar AddInts. java et kommandolinjeprøven n. leser deretter n tall fra standardinngang og legger til dem, og skriver resultatet til standardutgang: Input format. Hvis du skriver abc eller 12.2 eller true når StdIn. readInt () forventer en int. da vil det svare med en InputMismatchException. StdIn behandler strenger av sammenhengende hvite mellomrom som identiske med ett mellomrom, og lar deg avgrense tallene dine med slike strenger. Interaktiv brukerinngang. TwentyQuestions. java er et enkelt eksempel på et program som samhandler med brukeren. Programmet genererer et tilfeldig heltall og gir deretter ledetråder til en bruker som prøver å gjette nummeret. Den grunnleggende forskjellen mellom dette programmet og andre som vi har skrevet er at brukeren har muligheten til å endre kontrollflyten mens programmet kjøres. Behandler en vilkårlig størrelse inngangsstrøm. Vanligvis er inngangsstrømmer begrenset: Programmet marsjerer gjennom inngangsstrømmen, forbruker verdier til strømmen er tom. Men det er ingen begrensninger på størrelsen på inngangsstrømmen. Average. java leser i en sekvens av ekte tall fra standardinngang og skriver ut gjennomsnittet. Omdirigering og rørledning. For mange applikasjoner er det ikke mulig å skrive inndata som en standardinngangsstrøm fra terminalvinduet fordi det begrenser programmene våre til behandling av effekten av mengden data som vi kan skrive. På samme måte vil vi ofte lagre informasjonen som er trykt på standard utgangsstrøm for senere bruk. Vi kan bruke operativsystemmekanismer for å løse begge problemene. Omdirigere standardutgang til en fil. Ved å legge til et enkelt direktiv til kommandoen som påberoper et program, kan vi omdirigere sin standardutgang til en fil, enten for permanent lagring eller for inngang til et annet program på et senere tidspunkt. For eksempel angir kommandoen at standard utgangsstrøm ikke skal skrives ut i terminalvinduet, men i stedet skal skrives til en tekstfil med navnet data. txt. Hver samtale til StdOut. print () eller StdOut. println () legger til tekst på slutten av den filen. I dette eksemplet er sluttresultatet en fil som inneholder 1000 tilfeldige verdier. Omdirigere standardutgang fra en fil. På samme måte kan vi omdirigere standardinngang slik at StdIn leser data fra en fil i stedet for terminalvinduet. For eksempel kommandoerer en sekvens av tall fra filen data. txt og beregner deres gjennomsnittsverdi. Spesielt er symbolet lt et direktiv for å implementere standardinndatastrømmen ved å lese fra filen data. txt i stedet for ved å vente på at brukeren skriver inn noe i terminalvinduet. Når programmet kaller StdIn. readDouble (). operativsystemet leser verdien fra filen. Denne funksjonen for å omdirigere standardinngang fra en fil gjør at vi kan behandle store mengder data fra hvilken som helst kilde med våre programmer, begrenset bare av størrelsen på filene vi kan lagre. Koble til to programmer. Den mest fleksible måten å implementere standardinngangen og standardutdataabstraksjonene er å spesifisere at de implementeres av våre egne programmer. Denne mekanismen kalles rør. For eksempel angir følgende kommando at standardutgangen for RandomSeq og standardinngangsstrømmen for gjennomsnittlig er den samme strømmen. Filtre. For mange vanlige oppgaver er det praktisk å tenke på hvert program som et filter som konverterer en standardinngangsstrøm til en standard utgangsstrøm på en eller annen måte, RangeFilter. java tar to kommandolinjeparametere og skriver ut på standardutgang disse tallene fra standardinngang som faller innenfor det angitte området. Ditt operativsystem gir også en rekke filtre. For eksempel setter sortfilter linjene på standardinngang i sortert rekkefølge: Et annet nyttig filter er mer. som leser data fra standardinngang og viser det i terminalvinduet en skjermbilde av gangen. Hvis du for eksempel skriver inn, ser du så mange tall som passer inn i terminalvinduet, men mer vil vente på at du treffer mellomromstasten før du viser hver etterfølgende skjerm. Standard tegning. Nå presenterer vi en enkel abstraksjon for å produsere tegninger som utgang. Vi forestiller oss en abstrakt tegneanordning som er i stand til å tegne linjer og punkter på et todimensjonalt lerret. Enheten er i stand til å svare på kommandoene som våre programmer utsteder i form av anrop til statiske metoder i StdDraw. Det primære grensesnittet består av to typer metoder: tegningskommandoer som får enheten til å foreta en handling (for eksempel tegne en linje eller tegne et punkt) og styre kommandoer som angir parametere som pennestørrelsen eller koordinatskalaene. Grunnleggende tegningskommandoer. Vi vurderer først tegningskommandoene: Disse metodene er nesten selvdokumenterende: StdDraw. line (x0, y0, x1, y1) tegner et rettlinjesegment som forbinder punktet (x 0, y 0) med punktet (x 1. y 1 ). StdDraw. point (x, y) trekker et sted sentrert på punktet (x. Y). Standard koordinatskalaen er enhetens firkant (alle x - og y-koordinater mellom 0 og 1). Standard implementeringen viser lerretet i et vindu på datamaskinens skjerm, med svarte linjer og punkter på en hvit bakgrunn. Din første tegning. HelloWorld for grafikk programmering med StdDraw er å tegne en trekant med et punkt inne. Triangle. java oppnår dette med tre anrop til StdDraw. line () og ett anrop til StdDraw. point (). Kontroll kommandoer. Standard lerretstørrelse er 512-i-512 piksler og standardkoordinatsystemet er enhetens firkant, men vi vil ofte tegne plott på forskjellige skalaer. Også, vi vil ofte tegne linjesegmenter av forskjellig tykkelse eller punkter av forskjellig størrelse fra standarden. For å imøtekomme disse behovene har StdDraw følgende metoder: For eksempel setter to-samtals-sekvensen tegningskoordinatene til å ligge innenfor en avgrensningsboks, hvis nedre venstre hjørne er på (x 0, y 0) og hvis øvre høyre hjørne er ved (x 1 y 1). Filtrerer data til en standard tegning. PlotFilter. java leser en sekvens poeng definert av (x. Y) koordinater fra standardinngang og trekker et sted på hvert punkt. Det vedtar konvensjonen at de første fire tallene på standardinngang angir begrensingsboksen, slik at den kan skala plottet. Plotting av en funksjonsgraf. FunctionGraph. java plottet funksjonen y sin (4 x) sin (20 x) i intervallet (0, pi). Det er et uendelig antall poeng i intervallet, så vi må gjøre med å evaluere funksjonen ved et begrenset antall poeng i intervallet. Vi prøver funksjonen ved å velge et sett med x - verdier, og beregner y-verdier ved å evaluere funksjonen ved hver x-verdi. Plotting av funksjonen ved å koble til suksessive punkter med linjer produserer det som er kjent som en stykkevis lineær tilnærming. Utformet og fylt form. StdDraw inneholder også metoder for å tegne sirkler, rektangler og vilkårlig polygoner. Hver form definerer en disposisjon. Når metodenavnet bare er formenavnet, spores den disposisjonen av tegnepennen. Når metodenavnet begynner med fylt. den navngitte formen er istedet fylt fast, ikke sporet. Argumentene for sirkel () definerer en radius sirkel r argumenter for firkant () definerer en firkant av sidelengden 2r sentrert på det gitte punktet og argumenter for polygon () definerer en sekvens av punkter som vi forbinder med linjer, inkludert en fra det siste punktet til det første punktet. Tekst og farge. For å annotere eller markere ulike elementer i tegningene dine, inkluderer StdDraw metoder for å tegne tekst, sette inn skrift og sette blekk i pennen. I denne koden er java. awt. Font og java. awt. Color abstraksjoner som er implementert med ikke-primitive typer som du vil lære om i avsnitt 3.1. Inntil da forlater vi detaljene til StdDraw. Standard blekkfargen er svart. Standard skrifttypen er en 16-punkts vanlig Serif-skrifttype. Dobbelt buffering. StdDraw støtter en kraftig datagrafikkfunksjon kjent som dobbel buffering. Når dobbel buffering er aktivert ved å ringe enableDoubleBuffering (). all tegning foregår på offscreen lerretet. Offscreen-lerretet vises ikke. Det finnes bare i datamaskinminnet. Først når du ringer til show (), blir tegningen kopiert fra skjermen til skjermbildet på skjermen. hvor den vises i standard tegnevinduet. Du kan tenke på dobbel buffering som å samle alle linjene, punktene, figurene og teksten du forteller det å tegne, og tegne dem alle samtidig, på forespørsel. En grunn til å bruke dobbel buffering er for effektivitet når du utfører et stort antall tegningskommandoer. Computer animasjoner. Vår viktigste bruk av dobbel buffering er å produsere datamaskin animasjoner. hvor vi lager en illusjon av bevegelse ved raskt å vise statiske tegninger. Vi kan produsere animasjoner ved å gjenta følgende fire trinn: Tøm offscreen lerretet. Tegn objekter på skjermen Kopier skjermbildet til skjermbildet på skjermen. Vent litt. Til støtte for disse trinnene har StdDraw flere metoder: Hello, World for animasjon er å produsere en svart ball som ser ut til å bevege seg rundt på lerretet, hopper av grensen i henhold til lovene om elastisk kollisjon. Anta at ballen er i posisjon (x. Y), og vi vil skape inntrykk av at den beveger seg til en ny posisjon, si (x 0.01, y 0.02). Vi gjør det i fire trinn: Fjern avskärms lerret til hvitt. Tegn en svart ball i den nye stillingen på offscreen lerretet. Kopier skjermen til lerretet på skjermen. Vent litt. For å skape en illusjon av bevegelse, gjenkjenner BouncingBall. java disse trinnene for en hel sekvens av posisjoner av ballen. Bilder. Vårt standardtrekkebibliotek støtter tegning av bilder samt geometriske former. Kommandoen StdDraw. picture (x, y, filnavn) tegner bildet i det oppgitte filnavnet (enten JPEG, GIF eller PNG-format) på lerretet, sentrert på (x, y). BouncingBallDeluxe. java illustrerer et eksempel hvor den hoppende ballen er erstattet av et bilde av en tennisball. Brukerinteraksjon. Vårt standardtrekkebibliotek inneholder også metoder slik at brukeren kan samhandle med vinduet ved hjelp av musen. Et første eksempel. MouseFollower. java er HelloWorld av museinteraksjon. Den trekker en blå ball, sentrert på musens plassering. Når brukeren holder nede museknappen, endrer ballen farge fra blått til cyan. En enkel attractor. OneSimpleAttractor. java simulerer bevegelsen til en blå ball som er tiltrukket av musen. Det står også for en dragkraft. Mange enkle tiltrekkere. SimpleAttractors. java simulerer bevegelsen av 20 blå baller som er tiltrukket av musen. Det står også for en dragkraft. Når brukeren klikker, sprer ballene tilfeldig. Springs. Springs. java implementerer et fjærsystem. Standard lyd. StdAudio er et bibliotek som du kan bruke til å spille og manipulere lydfiler. Den lar deg spille, manipulere og syntetisere lyd. Vi presenterer noen grunnleggende begreper bak et av de eldste og viktigste områdene innen datavitenskap og vitenskapelig databehandling: digital signalbehandling. Konsert A. Konsert A er en sinusbølge, skalert til oscillere med en frekvens på 440 ganger per sekund. Funksjonssynden (t) gjentar seg en gang hver 2pi-enhet på x-aksen, så hvis vi måler t i sekunder og plotter funksjons synden (2pi t ganger 440), får vi en kurve som oscillerer 440 ganger per sekund. Amplituden (y-verdien) tilsvarer volumet. Vi antar at det skaleres mellom minus1 og 1. Andre notater. En enkel matematisk formel karakteriserer de andre notene på kromatisk skala. De er delt likt på en logaritmisk (base 2) skala: det er tolv notater på kromatisk skala, og vi får det første notatet over et gitt notat ved å multiplisere frekvensen med den (i 12) kraften på 2. Når du doble eller halve frekvensen, flytter du opp eller ned en oktav på skalaen. For eksempel er 880 Hertz en oktav over konsert A og 110 Hertz er to oktaver under konsert A. Prøvetaking. For digital lyd representerer vi en kurve ved å prøve det med jevne mellomrom, akkurat på samme måte som når vi plotter funksjonsgrafer. Vi prøver tilstrekkelig ofte at vi har en nøyaktig representasjon av kurvemdasha mye brukt prøvetakningsrate er 44,100 prøver per sekund. Det er så enkelt: vi representerer lyd som en rekke tall (ekte tall som er mellom minus1 og 1).For eksempel spiller følgende kodefilm konsert A i 10 sekunder. Spill den melodien. PlayThatTune. java er et eksempel som viser hvor enkelt vi kan lage musikk med StdAudio. Det tar notater fra standardinngang, indeksert på kromatisk skala fra konsert A, og spiller dem på standard lyd. Skriv et program MaxMin. java som leser i heltall (så mange som brukeren kommer inn) fra standardinngang og skriver ut maksimums - og minimumverdiene. Skriv et program Stats. java som tar et heltall kommandolinje argument n. leser n flytende punkt tall fra standardinngang, og skriver ut deres gjennomsnittlige (gjennomsnittsverdi) og utvalgsstandardavvik (kvadratrot av summen av rutene av forskjellene fra gjennomsnittet divideres med n minus1). Skriv et program LongestRun. java som leser i en sekvens av heltall og skriver ut både heltallet som vises i lengste rekkefølge og lengden på løp. For eksempel, hvis inngangen er 1 2 2 1 5 1 1 7 7 7 7 1 1. da skal programmet skrive ut lengste løp: 4 påfølgende 7s. Skriv et program WordCount. java som leser i tekst fra standardinngang og skriver ut antall ord i teksten. I denne øvelsen er et ord en sekvens av ikke-hvite mellomrom som er omgitt av hvite rom. Skriv et program Closest. java som tar tre flytende punkt kommandolinjeparametere (x, y, z), leser fra standardinngang en sekvens av punktkoordinater ((xi, yi, zi)) og skriver ut koordinatene til punktet nærmest ((x, y, z)). Husk at kvadratet av avstanden mellom ((x, y, z)) og ((xi, yi, zi)) er (x - xi) 2 (y - yi) 2 (z - zi) 2). For effektivitet, bruk ikke Math. sqrt () eller Math. pow (). Gitt posisjonene og massene av en sekvens av objekter, skriv et program for å beregne midtpunktet eller midtpunktet. Centroid er den gjennomsnittlige posisjonen til n objekter, vektet av masse. Hvis posisjonene og massene er gitt av (xi. Yi. Mi), blir sentroid (x. Y. M) gitt ved: Skriv et program Centroid. java som leser i en sekvens av posisjoner og masser (xi. Yi. mi) fra standardinngang og skriver ut sitt midtpunkt (x. y. m). Hint. modell programmet ditt etter Average. java. Skriv et program Checkerboard. java som tar en kommandolinjeprøve n og plotter et n-by-n kontrollpanel med røde og svarte firkanter. Farge den nedre venstre røde ruten. Skriv et program Rose. java som tar en kommandolinjeprøve n og plotter en rose med n kronblad (hvis n er merkelig) eller 2n petals (hvis n er jevn) ved å plotte polar koordinatene (r, theta) til funksjonen r synd (n ganger theta) for theta som strekker seg fra 0 til 2pi radianer. Nedenfor er ønsket utskrift for n 4, 7 og 8. Skriv et program Banner. java som tar en streng s fra kommandolinjen og viser den i bannerstil på skjermen, flytter fra venstre til høyre og pakkes tilbake til begynnelsen av strengen når slutten er nådd. Legg til et annet kommandolinjeprøving for å kontrollere hastigheten. Skriv et program Circles. java som trekker fylte sirkler av tilfeldig størrelse til tilfeldige posisjoner i enhetens firkant, og produserer bilder som de nedenfor. Programmet ditt bør ta fire kommandolinjeparametere: antall sirkler, sannsynligheten for at hver sirkel er svart, minimumradius og maksimal radius. Kreative øvelser Spirographs. Skriv et program Spirograph. java som tar tre kommandolinje argumenter R, r, og a og tegner den resulterende spirografen. En spirograph (teknisk, en epicykloid) er en kurve dannet ved å rulle en radius sirkel r rundt en større fast sirkel eller radius R. Hvis pennforskyvningen fra sirkelens senter er (ra), så er ligningen av den resulterende kurve på tidspunktet t er gitt av Slike kurver ble populert av et bestselgende leketøy som inneholder skiver med tannhjul på kantene og små hull som du kunne sette inn en penn for å spore spirografier. For en dramatisk 3d-effekt, tegne et sirkulært bilde, f. eks. earth. gif i stedet for en prikk, og vis den roterende over tid. Heres et bilde av den resulterende spirografen når R 180, r 40, og en 15. Klokke. Skriv et program Clock. java som viser en animasjon av andre, minutt og timer hender på en analog klokke. Bruk metoden StdDraw. show (1000) for å oppdatere skjermen omtrent en gang per sekund. Hint. Dette kan være en av de sjeldne tider når du vil bruke operatøren med en dobbel - det fungerer som du forventer. Oscilloskop. Skriv et program Oscilloscope. java for å simulere produksjonen av et oscilloskop og produsere Lissajous-mønstre. Disse mønstrene er oppkalt etter den franske fysikeren Jules A. Lissajous, som studerte mønstrene som oppstår når to gjensidig perpendikulære periodiske forstyrrelser oppstår samtidig. Anta at inngangene er sinusformede, så de følgende parametriske ligninger beskriver kurven: Ta de seks parameterne A x. w x. theta x. theta y. w y. og theta y fra kommandolinjen. For eksempel har det første bildet under Ax Ay 1, w x 2, w y 3, theta x 20 grader, theta y 45 grader. Den andre har parametere (1, 1, 5, 3, 30, 45) Nettøvelser Word og linjestykke. Endre WordCount. java slik at det leser i tekst fra standardinngang og skriver ut antall tegn, ord og linjer i teksten. Regnproblemer. Skriv et program Rainfall. java som leser i nonnegative heltall (representerer nedbør) en om gangen til 999999, skrives inn, og skriver deretter ut gjennomsnittet av verdien (ikke inkludert 999999). Fjern duplikater. Skriv et program Duplicates. java som leser i en sekvens av heltall og skriver ut heltallene, bortsett fra at det fjerner gjentatte verdier hvis de vises fortløpende. For eksempel, hvis inngangen er 1 2 2 1 5 1 1 7 7 7 7 1 1, bør programmet skrive ut 1 2 1 5 1 7 1. Kjørlengdekoding. Skriv et program RunLengthEncoder. java som koder for et binært inngang ved hjelp av kjølelengdekoding. Skriv et program RunLengthDecoder. java som dekoder en kjørelengdekodet melding. Hodet og halen. Skriv programmer Head. java og Tail. java som tar et heltall kommandolinjeinngang N og skriv ut de første eller siste N linjene i den oppgitte filen. (Skriv ut hele filen hvis den består av For eksempel meldingen VENI, VIDI, VICI konverteres til YHQL, YLGL, YLFL. Skriv et program Caesar. java som tar en kommandolinjeprøve k og bruker en Caesar-kryptering med shift k til en bokstavssekvens leses fra standardinngang. Hvis et brev ikke er et stor bokstav, skriv det bare ut igjen. Caesar-kryptering av dekoding. Hvordan ville du dekode en melding kryptert ved hjelp av en Caesar-krypteringstips. Du trenger ikke å skrive mer kode Paritetskontroll En boolsk matrise har paritetsegenskapen når hver rad og hver kolonne har en jevn sum. Dette er en enkel type feilkorrigeringskode fordi hvis en bit er skadet i overføring (bit er vendt fra 0 til 1 eller fra 1 til 0) det kan detekteres og repareres. Heres en 4 x 4-inngangsfil som har paritetsegenskapen: Skriv et program ParityCheck. java som tar et heltall N som en kommandolinjeinngang og leser i en N-by-N Boolean matrise fra standardinngang og utdata hvis (i) matrisen har paritetsegenskapen , eller (ii) indikerer hvilken enkelt ødelagt bit (i, j) kan vendes for å gjenopprette paritetsegenskapen, eller (iii) indikerer at matrisen var ødelagt (mer enn to biter måtte endres for å gjenopprette paritetsegenskapen) . Bruk så lite intern lagring som mulig. Tips: Du trenger ikke engang å lagre Matrix Takagis-funksjonen. Plot Takagis funksjon: Overalt kontinuerlig, ingensteds differensibel. Hitchhiker problem. Du intervjuer N kandidater for den eneste posisjonen til American Idol. Hvert minutt får du se en ny kandidat, og du har ett minutt å bestemme om du skal deklarere den amerikanske idolen eller ikke. Du kan ikke forandre deg når du er ferdig med å intervjue kandidaten. Anta at du umiddelbart kan rangere hver kandidat med et enkelt ekte tall mellom 0 og 1, men selvfølgelig vet du ikke vurderingene av kandidatene som ennå ikke er sett. Utarbeide en strategi og skriv et program AmericanIdol som har minst 25 sjanser til å velge den beste kandidaten (forutsatt at kandidatene kommer i tilfeldig rekkefølge), leser 500 dataverdier fra standardinngang. Løsning: Intervju for N2 minutter og registrer karakteren til den beste kandidaten som hittil er sett. I de neste N2 minuttene velger du den første kandidaten som har en høyere karakter enn den registrerte. Dette gir minst 25 sjanse siden du vil få den beste kandidaten hvis den nest beste kandidaten kommer i de første N2 minuttene, og den beste kandidaten kommer i det endelige N2-minuttet. Dette kan forbedres litt til 1e 0,36788 ved å bruke hovedsakelig samme strategi, men bytte over på tid Ne. Nestede diamanter. Skriv et program Diamonds. java som tar en kommandolinjeinngang N og plotter N nestede firkanter og diamanter. Nedenfor er ønsket utgang for N 3, 4 og 5. Regelmessige polygoner. Lag en funksjon for å plotte en N-gon, sentrert på (x, y) med lengde s. Bruk funksjonen til å tegne nestede polygoner som bildet nedenfor. Bulging firkanter. Skriv et program BulgingSquares. java som trekker følgende optisk illusjon fra Akiyoshi Kitaoka Senteret ser ut til å bukke utover, selv om alle firkantene er like store. Spirende mus. Anta at N-mus som starter på hjørnene av en vanlig polygon med N-sider, og de hver leder mot nærmeste andre mus (mot urviseren) til de alle møtes. Skriv et program for å tegne logaritmiske spiralbaner som de sporer ut ved å tegne nestede N-gons, roteres og krympes som i denne animasjonen. Spiral. Skriv et program for å tegne en spiral som den nedenfor. Kloden. Skriv et program Globe. java som tar en reell kommandolinjeprengjøring alfa og plotter et globe-lignende mønster med parameter alpha. Plot polar koordinatene (r, theta) av funksjonen f (theta) cos (alfa ganger theta) for teta i området fra 0 til 7200 grader. Nedenfor er ønsket utgang for alfa 0,8, 0,9 og 0,95. Tegningstrenge. Skriv et program RandomText. java som tar en streng s og et heltall N som kommandolinjeinnganger, og skriver strengen N ganger på et tilfeldig sted, og i tilfeldig farge. 2D tilfeldig spasertur. Skriv et program RandomWalk. java for å simulere en 2D tilfeldig tur og animere resultatene. Start i midten av et 2N-by-2N-rutenett. Den nåværende plasseringen vises i blått stien i hvitt. Roterende bord. Du sitter ved et roterende firkantet bord (som en lat Susan), og det er fire mynter plassert i de fire hjørnene av bordet. Målet ditt er å vende mynten slik at de er enten alle hoder eller alle haler, hvoretter en ring ringer for å varsle deg om at du er ferdig. Du kan velge hvilken som helst av dem, bestemme retningen deres, og (eventuelt) bla enten eller begge deler over. For å gjøre ting utfordrende, er du blindfoldet, og bordet spinnes etter hver gang du velger to mynter. Skriv et program RotatingTable. java som initierer mynten til tilfeldige orienteringer. Deretter ber det brukeren å velge to posisjoner (1-4), og identifiserer orienteringen til hver mynt. Deretter kan brukeren spesifisere hvilken, hvis noen av de to mynter skal vende. Prosessen gjentar til brukeren løser puslespillet. Roterende bordsløsning. Skriv et annet program RotatingTableSolver. java for å løse rotasjonsbordet. En effektiv strategi er å velge to mynter tilfeldig og vende dem til hodene. Men hvis du blir veldig uheldig, kan dette ta et vilkårlig antall trinn. Målsetning: Utarbeide en strategi som alltid løser puslespillet i de fleste 5 trinn. Hex. Hex er et tospillerbrettspil populært av John Nash, mens han er utdannet student ved Princeton University, og senere kommersialisert av Parker Brothers. Det spilles på et sekskantet rutenett i form av en 11-til-11-diamant. Skriv et program Hex. java som trekker brettet. Projektilbevegelse med dra. Skriv et program BallisticMotion. java som plotter banen til en ball som er skutt med hastighet v ved en vinkel theta. Redegjør for gravitasjons - og drakrefter. Anta at drakkraften er proporsjonal med firkantet av hastigheten. Ved hjelp av Newtons-bevegelsesbevis og Euler-Cromer-metoden oppdaterer du posisjonen, hastigheten og akselerasjonen i henhold til følgende ligninger: Bruk G 9.8, C 0.002, og still inn starthastigheten til 180 og vinkelen til 60 grader. Hjerte. Skriv et program Heart. java for å tegne et rosa hjerte: Tegn en diamant, og trekk deretter to sirkler til øverste venstre og øverste høyre side. Endre firkant. Skriv et program som tegner et firkant og endrer fargen hvert sekund. Enkel harmonisk bevegelse. Gjenta den forrige øvelsen, men animer Lissajous-mønstrene som i denne appleten. Eks: A B w x w y 1, men hver gang t tegner 100 (eller så) poeng med phi x som strekker seg fra 0 til 720 grader, og phi x varierer fra 0 til 1080 grader. Bresenhams line drawing algoritme. For å plotte et linjesegment fra (x1, y1) til (x2, y2) på en skjerm, si 1024-by-1024, må du gjøre en diskret tilnærming til den kontinuerlige linjen og bestemme nøyaktig hvilke piksler som skal slås på. Bresenhams line drawing algoritme er en smart løsning som fungerer når hellingen er mellom 0 og 1 og x1 Modifiser Bresenhams algoritmen for å håndtere vilkårlig linjesegmenter. Millers galskap. Skriv et program Madness. java for å plotte parametrisk ligning: hvor parameteren t er i radianer. Du bør få følgende komplekse bilde. Forsøk ved å endre parametrene og produsere originale bilder. Fays sommerfugl. Skriv et program Butterfly. java for å plotte polarligningen: hvor parameteren t er i radianer. Du bør få et bilde som den følgende sommerfugllignende figuren. Forsøk ved å endre parametrene og produsere originale bilder. Studentdatabase. Filen students. txt inneholder en liste over studenter som er innmeldt i en introduksjonskompetanse på Princeton. Den første linjen inneholder et heltall N som angir antall studenter i databasen. Hver av de neste N-linjene består av fire opplysninger, adskilt av hvitt plass: fornavn, etternavn, e-postadresse og seksjonsnummer. Programmet Students. java leser i hele tallet N og deretter N linjer med data av standardinngang, lagrer dataene i fire parallelle arrays (et heltall for delenummeret og strengarrayene for de andre feltene). Deretter skriver programmet ut en liste over studenter i seksjon 4 og 5. Shuffling. I den 7. oktober 2003 California State Runoff valg for guvernør, var det 135 offisielle kandidater. For å unngå den naturlige fordom mot kandidater hvis navn vises i slutten av alfabetet (Jon W. Zellhoefer), forsøkte California-valgtjenestemenn å bestille kandidatene i tilfeldig rekkefølge. Skriv et programprogram Shuffle. java som tar et kommandolinjeprøve N, leser i N-strengene fra standardinngangen, og skriver dem ut igjen i blandet rekkefølge. (California decided to randomize the alphabet instead of shuffling the candidates. Using this strategy, not all N possible outcomes are equally likely or even possible For example, two candidates with very similar last names will always end up next to each other.) Reverse. Write a program Reverse. java that reads in an arbitrary number of real values from standard input and prints them in reverse order. Time series analysis. This problem investigates two methods for forecasting in time series analysis. Moving average or exponential smoothing. Polar plots. Create any of these polar plots. Java games. Use StdDraw. java to implement one of the games at javaunlimited. Consider the following program. Suppose the file input. txt contains the following integers: What is the contents of the array a after running the following command High-low. Shuffle a deck of cards, and deal one to the player. Prompt the player to guess whether the next card is higher or lower than the current card. Repeat until player guesses it wrong. Game show. used this. Elastic collisions. Write a program CollidingBalls. java that takes a command-line argument n and plots the trajectories of n bouncing balls that bounce of the walls and each other according to the laws of elastic collisions. Assume all the balls have the same mass. Elastic collisions with obstacles. Each ball should have its own mass. Put a large ball in the center with zero initial velocity. Brownian motion. Statistical outliers. Modify Average. java to print out all the values that are larger than 1.5 standard deviations from the mean. You will need an array to store the values. Optical illusions. Create a Kofka ring or one of the other optical illusions collected by Edward Adelson. Computer animation. In 1995 James Gosling presented a demonstration of Java to Sun executives, illustrating its potential to deliver dynamic and interactive Web content. At the time, web pages were fixed and non-interactive. To demonstrate what the Web could be, Gosling presented applets to rotate 3D molecules, visualize sorting routines, and Duke cart-wheeling across the screen. Java was officially introduced in May 1995 and widely adopted in the technology sector. The Internet would never be the same. Program Duke. java reads in the 17 images T1.gif through T17.gif and produces the animation. To execute on your computer, download the 17 GIF files and put in the same directory as Duke. java . (Alternatively, download and unzip the file duke. zip or duke. jar to extract all 17 GIFs.) Cart-wheeling Duke. Modify Duke. java so that it cartwheels 5 times across the screen, from right to left, wrapping around when it hits the window boundary. Repeat this cart-wheeling cycle 100 times. Hint. after displaying a sequence of 17 frames, move 57 pixels to the left and repeat. Name your program MoreDuke. java. Tac (cat backwards). Write a program Tac. java that reads lines of text from standard input and prints the lines out in reverse order. Game. Implement the game dodge using StdDraw . move a blue disc within the unit square to touch a randomly placed green disc, while avoiding the moving red discs. After each touch, add a new moving red disc. Simple harmonic motion. Create an animation like the one below from Wikipedia of simple harmonic motion. Yin yang. Draw a yin yang using StdDraw. arc() . Twenty questions. Write a program QuestionsTwenty. java that plays 20 questions from the opposite point of view: the user thinks of a number between 1 and a million and the computer makes the guesses. Use binary search to ensure that the computer needs at most 20 guesses. Write a program DeleteX. java that reads in text from standard input and deletes all occurrences of the letter X. To filter a file and remove all Xs, run your program with the following command: Write a program ThreeLargest. java that reads integers from standard input and prints out the three largest inputs. Write a program Pnorm. java that takes a command-line argument p, reads in real numbers from standard input, and prints out their p-norm . The p-norm norm of a vector (x 1 . x N ) is defined to be the pth root of (x 1 p x 2 p . x N p ). Consider the following Java program. Suppose that the file input. txt contains the integers 1 and 1. What does the following command do Modify Add. java so that it re-asks the user to enter two positive integers if the user types in a non-positive integer. Modify TwentyQuestions. java so that it re-asks the user to enter a response if the user types in something other than true or false . Hint: add a do-while loop within the main loop. Nonagram. Write a program to plot a nonagram. Star polygons. Write a program StarPolygon. java that takes two command line inputs p and q, and plots the - star polygon. Complete graph. Write a program to plot that takes an integer N, plots an N-gon, where each vertex lies on a circle of radius 256. Then draw a gray line connecting each pair of vertices. Necker cube. Write a program NeckerCube. java to plot a Necker cube. What happens if you move the StdDraw. clear(Color. BLACK) command to before the beginning of the while loop in BouncingBall. java. Answer . try it and observe a nice woven 3d pattern with the given starting velocity and position. What happens if you change the parameter of StdDraw. show() to 0 or 1000 in BouncingBall. java. Write a program to plot a circular ring of width 10 like the one below using two calls to StdDraw. filledCircle() . Write a program to plot a circular ring of width 10 like the one below using a nested for loop and many calls to StdDraw. point() . Write a program to plot the Olympic rings. Write a program BouncingBallDeluxe. java that embellishes BouncingBall. java by playing a sound effect upon collision with the wall using StdAudio and the sound file pipebang. wav. Last modified on February 20, 2017. Copyright copy 2000ndash2016 Robert Sedgewick and Kevin Wayne. All rights reserved. Slightly Skeptical View on Sorting Algorithms This is a very special page: here students can find several references and actual implementation for Bubblesort :-). Actually b ubblesort is a rather weak sorting algorithm for arrays that for some strange reason dominates introductory courses. It39s not that bad on lists and on already sorted arrays (or quotalmost sortedquot arrays), but that39s another story. An important point is that it is very often implemented incorrectly. Note: When writing or debugging soft algorithms, UNIX sort can often be used to check results for correctness (you can automate it to check several tricky cases, not just one sample). Diff with Unix sort results will instantly tell you if you algorithms works correctly or not if all keys are distinct. If there are multiple identical keys your mileage may vary -). Sorting algorithms can be stable (which preserve the initial sequence of records with identical keys and non-stable -- which, as you can guess, do not. Among simple sorting algorithms, the insertion sort seems to be better for small sets. It is stable and works perfectly on quotalmost sortedquot arrays. The latter case is probably the most important class of input data for sorting algorithms. Selection sort . while not bad, does not takes advantage of the preexisting sorting order and is not stable . At the same time it moves quotdissidentquot elements by larger distances then insertion sort, so the total number of moves might well be less. But a move typically cost about the same as unsuccessful comparison (on modern computer with predictive execution comparison that results in a jump which cost 10 or more times then when comparison that does not change order of execution (typically successful comparison). So it is total number of comparisons plus total number of moves that counts. De spite this fact it is still make sense to judge algorithms by just the number of comparisons. And it is clear that algorithms do not use comparisons at all have significant advantages on modern computers. Again, total number of comparisons and moves is a better metric. But not all comparisons are reated equal -- what really matter are unsuccessful comparisons, not so much successful one. An Unsucessful comparison results in a jump in compiled code which forces the flush of the instruction pipeline. The second important fact is the size of the set. There is no and cant be a sorting algorithms that is equally efficient of small sets and on large sets. For small sets quotoverheadquot of the algorithms itself is an important factor so the simpler algorithm is the better it performs on small sets. Several more complex algorithms such as radixsort (which does not used comparisons), shellsort. mergesort. heapsort. and even quite fragile, but still fashionable quicksort are much faster on larger sets. Mergesort is now used by several scripting languages as internal sorting algorithm instead of Quicksort. A least significant digit (LSD) radix sort recently has resurfaced as an alternative to other high performance comparison-based sorting algorithms for integer keys and short strings (like Heapsort and Mergesort) because it does not use comparisons and can utilize modern CPUs much better then traditional comparison based algorithms. Anyway, IMHO if an instructor uses bubblesort as an example you should be slightly vary -). The same is true if Quicksort is over-emphasized in the course as all singing-all dancing solution for sorting large sets. But the most dangerous case is when the instructor emphasizes object oriented programming while describing sorting. That applies to book authors too. It39s better to get a second book in such case, as typically those guys try to obscure the subject making it more complex (and less interesting) than it should be. Of course, as a student you have no choice and need to pass the exam, but be very wary of this trap of mixing apples and oranges. You might fail to understand the course material just because the instructor is too preoccupied with OO machinery instead of algorithms. So while you may feel that you are incapable to master the subject, in reality that simply means that the instructor is an overcomplexity junky, nothing more nothing less -). In any case OO obscures the elegance of sorting algorithms to such an extent that most students hate the subject for the rest of their life. If this is the case, that only means that you are normal. Classic treatise on sorting algorithms remains Volume 3 of TAoCP by Donald Knuth. The part of the book in which sorting algorithms are explained is very short (the volume also covers searching and several other subjects). Just the first 180 pages. You can buy the first edition for 3-5 dollars (and they are still as good as later editions for teaching purposes as Knuth did s good job in the first edition and never improved on it in later editions -- changes are mostly small corrections and typographic niceties please not the flowcharts in the book are a horrible mess -- shame on Knuth) Unfortunately the third volume was written when Knuth was already pretty much exhausted by publishing the first two volumes and that shows. The third volume also was based not on Knuth own research but on lecture notes of Professor Robert W. Floyd. one of the few winners of ACM Turing prise. the top 50 scientists and technologists of the USA early computer science explosion. Also at the moment of writing the field still quickly developed and this fact is reflected in the unevenness of the book content, where some algorithms are well covered but other not so well. Now it can be viewed as the most outdated volume out of three, despite the fact that it was published last. Nevertheless it remains classic because Knuth is Knuth, and his touch on the subject can39t be replicated easily. As any classic, it is quite difficult to read (examples are in MIX assembler and growing on ancient IBM 650 Knuth missed the value of System360 instruction set). Still like classic should, it produces insights that you never get reading regular textbooks. The most valuable are probably not the content but exercises. Most of the content of volume 3 can now be found in other books, although in somewhat emasculated fashion. Again I would like to warn you that the main disaster in courses quotData structures and algorithmsquot happens when they try to mix applies with oranges, poisoning sorting algorithms by injecting into the course pretty much unrelated subject -- OO. And it is students in this case who suffer, not the instructor -) Complexity of the algorithms is just one way to classify sorting algorithms. Det er mange andre. One important classification is based on the internal structure of the algorithm: Swap-based sorting algorithms begin conceptually with the entire list, and exchange particular pairs of elements (adjacent elements like in bubblesort or elements with a certain step like in Shell sort) moving toward a more sorted list. Merge-based sorting algorithms creates initial quotnaturallyquot or quotunnaturallyquot sorted sequences, and then add either element by element to it preserving sorting order (insertion sort) or merge two already sorted sequences until there is a single sorting segment, encompassing all the data. Tree-based sorting algorithms store the data, at least conceptually, in a binary tree there are two different approaches, one based on heaps, and the other based on search trees. Sorting by distribution algorithms (See Knuth Vol 3, 5.2.5. Sorting by distribution. P.168) use additional key-value information . implicit in storing digits and strings in computer. The classic example of this type of algorithms is so called radix sort. Radix Sort processes array elements one digit at a time, starting either from the most significant digit (MSD) or the least significant digit (LSD). MSD radix sorts use lexicographic order, which is especially suitable for sorting strings, such as words, or fixed-length integer representations. A least significant digit (LSD) radix sort is suitable only for short keys (for example integers or IP addresses) and when all keys have the same length (or can padded to the same length) and is a fast stable sorting algorithm. It is suitable, for example for sorting log records by IP address. See also Bucket sort and postman sort We can also classify sorting algorithms by several other criteria such as: Computational complexity (worst, average and best number of comparisons for several typical test cases, see below) in terms of the size of the list ( n ). Typically, good average number of comparisons is O ( n log n ) and bad is O( n 2 ). Please note that O matters. Even if both algorithms belong to O ( n log n ) class, algorithm for which O1 is 100 times faster then algorithm for which O100. Another problem with O notation is that this asymptotic analysis does not tell about algorithms behavior on small lists, or worst case behavior. This is actually one of the drawback of Knuth book in which he was carried too much by the attempt to establish theoretical bounds on algorithms. Worst case behavior is probably more important then average. For example quotplain-vanillaquot quicksort requires O( n 2 ) comparisons in case of already sorted or almost sorted array: a very important in practice case as in many case sorting is used as quot incompetent people merge quot instead of merging two sets the second set concatenated to the sorted set and then the whole array is resorted. If you get statistic of usage of Unix sort in some large datacenter you will be see that a lot of sorting used for processing huge log files and then resorting them for additional key. For example the pipeline can be applied to 100M or larger file and this script can be processed daily. Sort algorithms which only use generic key comparison operation always need at least O( n log n ) comparisons on average while sort algorithms which exploit the structure of the key space cannot sort faster than O(n log k) where k is the size of the keyspace. So if key space is much less then N (a lot of records with identical keys), no comparison algorithms is completive with radix type sorting. Please note that the number of comparison is just convenient theoretical metric. In reality both moves and comparisons matter, and failed comparisons matter more then successful also on short keys the cost of move is comparable to the cost of successful comparison (even if pointers are used). Stability: stable sorting algorithms maintain the relative order of records with equal keys. If all keys are different then this distinction does not make any sense. But if there are equal keys, then a sorting algorithm is stable if whenever there are two records R and S with the same key and with R appearing before S in the original list, R will appear before S in the sorted list. Among simple algorithms bubble sort and insertion sort are stable. Among efficient complex algorithms only Mergesort is stable. A least significant digit (LSD) radix sort is suitable only for short keys (for example integers or IP addresses) and when all keys have the same length (or can padded to the same length) and is a fast stable sorting algorithm. Staqbility is a valuable property of sorting algorithms. Memory usage (and use of other computer resources). One large class of algorithms are quotin-place sorting. They are generally slower than algorithms that use additional memory . additional memory can be used for mapping of keyspace. Most fast stable algorithms use additional memory. With the current 16GB typical memory size on laptops and 64GB typical memory size on the servers as well as virtual memory used in all major OSes, the old emphasis on algorithms that does not require additional memory should probably be abandoned. Speedup that can be achieved by using of a small amount of additional memory is considerable and it is stupid to ignore it. Moreover even for classic in-place algorithms you can always use pointers to speed up moving records. for long records this additional space proportional to N actually speed up moved dramatically and just due to this such an implementation will outcompete other algorithms. In other words when sorting records not to use pointers in modern machines in any case when the record of the sorting array is larger then 64 bit is not a good strategy. In real life sorting records usually are size several times bigger then the size of a pointers (4 bytes in 32 bit CPUs, 8 bytes on 64 bit). That means that, essentially, study of sorting algorithms on just integer arrays is a much more realistic abstraction, then it appear from the first site. In modern computer multi-level memory is used. Cache-aware versions of the sort algorithms, whose operations have been specifically chosen to minimize the movement of pages in and out cache, can be dramatically quicker. One example is the tiled merge sort algorithm which stops partitioning sub arrays when subarrays of size S are reached, where S is the number of data items fitting into a single page in memory. Each of these subarrays is sorted with an in-place sorting algorithm, to discourage memory swaps, and normal merge sort is then completed in the standard recursive fashion. This algorithm has demonstrated better performance on machines that benefit from cache optimization. (LaMarca amp Ladner 1997 ) Modern CPUs designs try to minimize wait states of CPU that are inevitable due to the fact that it is connected to much slower (often 3 or more times) memory using a variety of techniques such as CPU caches. instruction pipelines. instruction prefetch. branch prediction. For example, the number of instruction pipeline (see also Classic RISC pipeline - Wikipedia ) flushes (misses) on typical data greatly influence the speed of algorithm execution. Modern CPU typically use branch prediction (for example The Intel Core i7 has two branch target buffers and possibly two or more branch predictors). If branch guessed incorrectly penalty is significant and proportional to the number of stages in the pipeline. So one possible optimization of code strategy for modern CPUs is reordering branches, so that higher probability code was located after the branch instruction. This is a difficult optimization that requires thorously instrumentation of algorithms and its profiling. gathering set of statistics about branching behaviors based on relevant data samples as well as some compiler pragma to implement it. In any case this is important factor for modern CPUs which have 7, 10 and even 20 stages pipelines (like in the Intel Pentium 4 ) and were cost of a pipeline miss can cost as much as three or fours instructions executed sequentially. The difference between worst case and average behavior . For example, quicksort is efficient only on the average, and its worst case is n 2. while heapsort has an interesting property that the worst case is not much different from the an average case. Behaviors on practically important data sets such as completely sorted (you will be surprised how many sorting operations are performed on already sorted data, inversely sorted and 39almost sorted39 (1 to K permutations, where K is less then N10). The latter is often used as a perverted way of inserting one or two records into a large data set: instead of merging them they are added to the bottom and the whole dataset is sorted. Those has tremendous practical implications which are often not addressed or addressed incorrectly in textbooks that devote some pages to sorting. Among non-stable algorithms heapsort and Shellsort are probably the most underappreciated and quicksort is one of the most overhyped. Please note the quicksort is a fragile algorithm that is not that good in using predictive execution of instructions in pipeline (typical feature of modern CPUs). There are practically valuable sequences (quotnear sortedquot data sets) in which for example shellsort is twice faster the n quicksort (see examples below). It is fragile because the choice of pivot is equal to guessing an important property of the data to be sorted (and if it went wrong the performance can be close to quadratic). There is also some experimental evidence that on very large sets Quicksort runs into quotsuboptimal partitioningquot on a regular basis, so it becomes a feature, not a bug. It does not work well on already sorted or quotalmost sortedquot (with a couple or permutations) data as well as data sorted in a reverse order. It does not work well on data that contain a lot of identical keys. Those are important cases that are frequent in real world usage of sorting. Again I would like to stress that one will be surprised to find what percentage of sorting is performed on already sorted datasets or datasets with less then 10 of permutations. For those (and not only for those -) reasons you need to be skeptical about quot quicksort lobbyquot with Robert Sedgewick (at least in the past) as the main cheerleader. Quicksort is a really elegant algorithm invented by Hoare in Moscow in 1961, but in real life other qualities then elegance and speed of random data are more valuable -). On important practical case of quotsemi-sortedquot and quotalmost reverse sortedquot data quicksort is far from being optimal and often demonstrates dismal performance. You need to do some experiments to see how horrible quicksort can be in case of already sorted data (simple variants exhibit quadratic behavior, the fact that is not mentioned in many textbooks on the subject) and how good shellsort is -). And on typical corporate data sets including log records heapsort usually beats quicksort because performance of quicksort too much depends of the choice of pivot and series of bad choices increase time considerably. Each time the pivot element is close to minimum (or maximum) the performance of this stage goes into the drain and on large sets such degenerative cases are not only common, they can happen in series (I suspect that on large data setsquick sort quotself-createdquot such cases -- in other words quicksort poisons its data during partitions making bad choices of pivot progressively more probable). Here are results from one contrarian article written by Paul Hsieh in 2004 Athlon XP 1.620Ghz Data is time in seconds taken to sort 10000 lists of varying size of about 3000 integers each. Download test here Please note that total time while important does not tell you the whole story. Actually it reveals that using Intel compiler Heapsort can beat Quicksort even quoton averagequot -- not a small feat. You need also know the standard deviation. Actually one need to read volume 3 of Knuth to appreciate the beauty and complexity of some advanced sorting algorithms. Please note that sorting algorithms published in textbooks are more often then not implemented with errors. Even insertion sort presents a serious challenge to many book authors -). Sometimes the author does not know the programming language heshe uses well, sometimes details of the algorithm are implemented incorrectly. And it is not that easy to debug them. In this sense Knuth remains quotthe referencequot, one of the few books where the author took a great effort to debug each and every algorithm he presented. Please take any predictions about relative efficiency of algorithms with the grain of salt unless they are provided for at least a dozen typical sets of data as described below. Shallow authors usually limit themselves to random sets, which are of little practical importance. So please do not spend much time browsing web references below. They are not as good as Knuth39s volume. It is clear the you never will use sorting algorithms in worst case O( n 2 ) in real time avionics computers -). In order to judge suitability of a sorting algorithms to a particular application you need to see: Are the data that application needs to sort tend to have some preexisting order. What are properties of keyspace Do you need a stable sort Can you use some quotextraquot memory or need quotin-placequot soft. (with the current computer memory sizes you usually can afford some additional memory so quotin-placequot algorithms no longer have any advantages). Generally the more we know about the properties of data to be sorted, the faster we can sort them. As we already mentioned the size of key space is one of the most important dimensions (sort algorithms that use the size of key space can sort any sequence for time O(n log k) ). For example if we are sorting subset of a card deck we can take into account that there are only 52 keys in any input sequence and select an algorithms that uses limited keyspace for dramatic speeding of the sorting. In this case using generic sorting algorithm is just a waist. Moreover, the relative speed of the algorithms depends on the size of the data set: one algorithm can be faster then the other for sorting less then, say, 64 or 128 items and slower on larger sequences. Simpler algorithms with minimal housekeeping tend to perform better on small sets even if the are O( n 2 ) type of algorithms. Especially algorithms that have less number of jump statement in compiled version of code. For example insertion sort is competitive with more complex algorithms up to N25 or so. There is not quotbest sorting algorithmquot for all data. Various algorithms have their own strength and weaknesses. For example some quotsensequot already sorted or quotalmost sortedquot data sequences and perform faster on such sets. In this sense Knuth math analysis is insufficient althouth quotworst timequot estimates are useful. As for input data it is useful to distinguish between the following broad categories that all should be used in testing (random number sorting is a very artificial test and as such the estimate it provides does not have much practical value, unless we know that other cases behave similarly or better): Completely randomly reshuffled array (this is the only test that naive people use in evaluating sorting algorithms). Already sorted array (you need to see how horrible Quicksort is on this case and how good shellsort is -). This is actually a pretty important case as often sorting is actually resorting of previously sorted data done after minimal modifications of the data set. There are three imortant case of already sorted array Array of distinct elements sorted in quotrightquot direction for which no any reordering is required (triangular array). Already sorted array consisting of small number of identical elements (stairs). The worst case is rectangular array in when single element is present (all values are identical). Already sorted in reverse order array (many algorithms, such as insertion sort work slow on such an array) Array that consisted of merged already sorted arrays(Chainsaw array). Arrays can be sorted in right direction in opposite direction of have arrays both sorted in right and opposite direction (one case is quotsymmetrical chainsawquot). Array consisting of small number of identical elements (sometimes called or quotfew uniquequot case). If number of distinct elements is large this is the case similar to chainsaw but without advantage of preordering. So it can be generated by quotinflictingquot certain number of permutations on chainsaw array. Worst case is when there is just two values of elements in the array (binary array). Quicksort is horrible on such data. Many other algorithms work slow on such an array. Already sorted in right direction array with N permutations (with N from 0.1 to 10 of the size). Insrtion soft does well on such arrays. Shellsort also is quick. Quick sort do not adapt well to nearly sorted data. Already sorted array in reverse order array with N permutations Large data sets with normal distribution of keys. Pseudorandom data (daily values of SampP500 or other index for a decade or two might be a good test set here they are available from Yahoo ) Behavior on quotalmost sortedquot data and worst case behavior are a very important characteristics of sorting algorithms. For example, in sorting n objects, merge sort has an average and worst-case performance of O ( n log n ). If the input is already sorted, its complexity falls to O ( n ). Specifically, n-1 comparisons and zero moves are performed, which is the same as for simply running through the input, checking if it is pre-sorted. In Perl 5.8, merge sort is its default sorting algorithm (it was quicksort in previous versions of Perl). Python uses timsort. a hybrid of merge sort and insertion sort, which will become the standard sort algorithm for Java SE 7. Calculation of the number of comparisons and number of data moves can be done in any language. C and other compiled languages provide an opportunity to see the effect of computer instruction set and CPU speed on the sorting performance. Usually the test program is written as a subroutine that is called, say, 1000 times. Then data entry time (running just data coping or data generating part the same number of times without any sorting) is subtracted from the first. Such a method can provide more or less accurate estimate of actual algorithms run time on a particular data set and particular CPU architecture. Modern CPUs that have a lot of general purpose registers tend to perform better on sorting: sorting algorithms tend to belong to the class of algorithms with tight inner loop and speed of this inner loop has disproportionate effect on the total run time. If most scalar variables used in this inner look can be kept in registers times improves considerably. Artificial computers like Knuth MIXX can be used too. In this case the time is calculated based on the time table of performing of each instruction (instruction cost metric). While choosing the language is somewhat a religious issue, there are good and bad language for sorting algorithms implementations. See Language Design and Programming Quotes for enlightened discussion of this touchy subject -) BTW you can use Perl or other interpreted scripting language in a similar way as assembler of artificial computer. I actually prefer Perl as a tool of exploring sorting as this is an interpreted language (you do not need to compile anything) with a very good debugger and powerful control structures. And availability of powerful control structures is one thing that matter in implementation of sorting algorithms. Life is more complex then proponents of structured programming are were trying us to convince. Please note that a lot of examples in the books are implemented with errors. That39s especially true for Java books and Java demo implementations. Use Knuth book for reference. An alternative taxonomy (to that of Knuth and others) of sorting algorithms is proposed. It emerges naturally out of a top-down approach to the derivation of sorting algorithms. Work done in automatic program synthesis has produced interesting results about sorting algorithms that suggest this approach. In particular, all sorts are divided into two categories: hardspliteasyjoin and easysplithardjoin. Quicksort and merge sort, respectively, are the canonical examples in these categories. Insertion sort and selection sort are seen to be instances of merge sort and quicksort, respectively, and sinking sort and bubble sort are in-place versions of insertion sort and selection sort. Such an organization introduces new insights into the connections and symmetries among sorting algorithms, and is based on a higher level, more abstract, and conceptually simple basis. It is proposed as an alternative way of understanding, describing, and teaching sorting algorithms. Data Structures and Algorithms with Object-Oriented Design Patterns in C online book by Bruno R. Preiss B. A.Sc. M. A.Sc. Ph. D. P. Eng. Associate Professor Department of Electrical and Computer Engineering University of Waterloo, Waterloo, Canada sortchk is a simple test suite I wrote in order to measure the costs (in terms of needed comparisons and data moves, not in terms of time consumed by the algorithm, as this is too dependend on things like type of computer, programming language or operating system) of different sorting algorithms. The software is meant to be easy extensible and easy to use. It was developed on NetBSD. but it will also compile and run well on other systems, such as FreeBSD, OpenBSD, Darwin, AIX and Linux. With little work, it should also be able to run on foreign platforms such as Microsoft Windows or MacOS 9. Sorting Algorithms Implementations of sorting algorithms. Sorting Algorithms Demo Demonstrated with 15 java applets. Cool The Improved Sorting Algorithm Demo Lots of sorting (18) algorithms demos. Heap sort visualization A short primer on the heap sort algorithm a user39s guide to learn the applet39s interface and how it works. Finally, check out the visualization applet itself to dissect this truly elegent sorting algorithm. Technical documentation is also available for anyone wanting to see how this applet was designed and implemented in the Java language. From there, the source code is explained. Merge Sort Algorithm Simulation With good explanation. Sandeep Mitra39s Java Sorting Animation Page Nine classic algorithms with explanation. MergeSort demo with comparison bounds With merge sort description. The Sorting Algorithm Demo Sequential and parallel - includes also time analysis. Sorting Algorithms Nine algorithms demonstrated. Sort Animator Bubble, Insertion, Selection, Quicksort, Shell, Merge sort demonstrated. The Sorting Algorithm Demo 6 classics algorithms (Bubble Bi, Quick, Insert, Heap and Shell). Analysis of Sorting Algorithm Merge Sort, Insertion Sort, and a combination MergeInsertion Sort compared. Don Stone39s Program Visualization Page Different sorts visualized on your PC (Old MsDos view) Sorting Algorithms Bookmark for sorting algorithms demos. Welcome to Sorting Animation Insertion, Shell, Heap, Radix and Quicksort explained in clear way, by Yin-So Chen. Animation of Sort Algorithms Java - five algorithms. Illustration of sorting algorithms BubbleSort, Bidirectional BubbleSort, QuickSort, SelectionSort, Insertionsort and ShellSort Sorting Demo is a powerful tool for demonstrating how sorting algorithms work. It was designed to alleviate some of the difficulty instructors often have in conveying these concepts to students due to lack of blackboard space and having to constantly erase. This program started out as a quicksort demonstration applet, and after proposing the idea to Seton Hall39s math and computer science department, I was given permission to expand the idea to encompass many of the sorts commonly taught in a data structuresalgorithms class. There are currently 9 algorithms featured, all of which allow you to either type in your own array or make the computer generate a random array of a milestone size. Although graphics limit the input array to a length of 25 elements, there is the option to run the algorithm without graphics in order to get an understanding of its running time in comparison with the other sorts. We all know that Quicksort is one of the fastest algorithms for sorting. It39s not often, however, that we get a chance to see exactly how fast Quicksort really is. The following applets chart the progress of several common sorting algorthms while sorting an array of data using constant space algorithms. (This is inspired by the algorithm animation work at Brown University and the video Sorting out Sorting from the University of Toronto (circa 1970).) This applet lets you observe the dynamic operation of several basic sort algorithms. The implementations, explanations and display technique are all taken from Algorithms in C, third Edition, Sedgewick, 1998. Generate a data set by clicking one of the data set buttons. This generates a data set with the appropriate characteristics. Each data set is an array of 512 values in the range 0..511. Data sets have no duplicate entries except the Gaussian distribution. Run one or more sort algorithms on the data set to see how the algorithm works. Each execution of a sort runs on the same data set until you generate a new one. Animator for selection sort Provided by - Peter Brummund through the Hope College Summer Research Program. Algorithms covered: Bubble Sort -- incorrect implementation Insertion Sort Merge Sort Quick Sort Selection Sort Shell Sort Softpanorama hot topic of the month Softpanorama Recommended Sorting - Wikipedia, the free encyclopedia This is a collection of algorithms for sorting and searching. Descriptions are brief and intuitive, with just enough theory thrown in to make you nervous. I assume you know a high-level language, such as C, and that you are familiar with programming concepts including arrays and pointers. The first section introduces basic data structures and notation. The next section presents several sorting algorithms. This is followed by a section on dictionaries . structures that allow efficient insert . search . and delete operations. The last section describes algorithms that sort data and implement dictionaries for very large files. Source code for each algorithm, in ANSI C, is included. Most algorithms have also been coded in Visual Basic. If you are programming in Visual Basic, I recommend you read Visual Basic Collections and Hash Tables. for an explanation of hashing and node representation. If you are interested in translating this document to another language, please send me email. Special thanks go to Pavel Dubner, whose numerous suggestions were much appreciated. The following files may be downloaded: shetot-ch3.htm shetot-ch4.htm Sorting Algorithms -- some explanation of simple sorting algorithms Sorting Algorithms - Skolnick -- very good explanation of insertion sort and selection sort. Insertion sort quotinsertsquot each element of the array into a sorted sub-array of increasing size. Initially, the subarray is of size 0. It depends on the insert function shown below to insert an element somewhere into a sorted array, shifting everything to the right of that element over one space. Sorting Algorithms Page -- several C programs for simple sorting argorithms (Insertion, Bubblesort, Selection sort) and several advanced (Quicksort, Mergesort, Shellsort, Heapsort) Definitions of Algorithms Data Structures and Problems Algorithms A Help Site -- a pretty raw Mustafa39s Modified Sorting Algorithms Outline Chapter 8 the source code for the chapter on Sorting from Algorithms, Data Structures, and Problem Solving with C, by Mark Allen Weiss. Sorting Algorithms -- tutorial with animations Sorting Algorithms The Complete Collection of Algorithm Animations Some sorting algorithms -- Pascal Sorting Algorithms P. M. McIlroy, K. Bostic and M. D. McIlroy, Engineering radix sort . Computing Systems 6 (1993) 5-27 gzipped PostScript (preprint) M. D. McIlroy, A killer adversary for quicksort . Software--Practice and Experience 29 (1999) 341-344, gzipped PostScript or pdfCategory:Programming Tasks Programming tasks are problems that may be solved through programming. When such a task is defined, Rosetta Code users are encouraged to solve them using as many different languages as they know. The end goal is to demonstrate how the same task is accomplished in different languages. These are the Programming Tasks that have been defined and solved. Feel free to add solutions in languages not already included. The Category:Simple is a small subset with only really simple tasks, like Hello World, and demonstrations of basic language-features. The Category:Draft Programming Tasks is a list of tasks, some of which are just awaiting more implementations before they can be promoted to tasks. Others may well have problems, (check their discussion and history pages). Read the guidelines on creating new tasks. If you need help, check the discussion for this page. Pages in category Programming Tasks The following 834 pages are in this category, out of 834 total.
Comments
Post a Comment