Tuesday, 21 November 2017

Flytting Gjennomsnitt Matrise Java


2.4 Prioritetskøer Mange applikasjoner krever at vi behandler elementer som har nøkler i orden, men ikke nødvendigvis i full sortert rekkefølge og ikke nødvendigvis alle samtidig. Ofte samler vi et sett med elementer, og prosesserer den med den største nøkkelen, så samler kanskje flere elementer, og prosesserer den med den nåværende største nøkkelen og så videre. En passende datatype i et slikt miljø støtter to operasjoner: Fjern maksimum og sett inn. En slik datatype kalles en prioritetskø. Prioritetskøer kjennetegnes ved å fjerne maksimal - og innsatsoperasjonen. Ved konvensjon vil vi bare sammenligne nøkler med en mindre () metode, som vi har gjort for sortering. Dermed, hvis poster kan ha dupliserte nøkler, betyr maksimum som enhver plate med den største nøkkelverdien. For å fullføre API-en, må vi også legge til konstruktører og en test hvis den er tom. For fleksibilitet bruker vi en generell implementering med en generisk type Nøkkel som implementerer Comparable. Program TopM. java er en prioritetskøsklient som tar et kommandolinjemargument M. leser transaksjoner fra standardinngang, og skriver ut de største transaksjonene M. Elementære implementeringer. De grunnleggende datastrukturene som vi diskuterte i avsnitt 1.3 gir oss fire umiddelbare utgangspunkt for å implementere prioritetskøer. Array representasjon (uordnet). Kanskje den enkleste prioritetskøen implementeringen er basert på vår kode for pushdown stabler. Koden for innsetting i prioritetskøen er den samme som for å trykke på stakken. For å implementere, fjern maksimalt. Vi kan legge til kode som den indre sløyfen for utvalg, sortere for å utveksle det maksimale elementet med elementet på slutten, og deretter slette det som vi gjorde med pop () for stabler. Program UnorderedArrayMaxPQ. java implementerer en prioritetskø med denne tilnærmingen. Array representasjon (bestilt). En annen tilnærming er å legge til kode for innsetting for å flytte større oppføringer en posisjon til høyre, og dermed holde oppføringene i arrayet i rekkefølge (som i innsettingssort). Dermed er det største elementet alltid på slutten, og koden for å fjerne maksimumet i prioritetskøen er det samme som for pop i stakken. Program OrderedArrayMaxPQ. java implementerer en prioritetskø med denne tilnærmingen. Tilknyttede representasjoner (uordnet og omvendt bestilt). På samme måte kan vi starte med vår koblede liste kode for pushdown-stabler, enten ved å endre koden for pop () for å finne og returnere maksimum eller koden for push () for å beholde elementer i omvendt rekkefølge og koden for pop () til Fjern koblingen og returner den første (maksimale) elementet på listen. Alle elementære implementeringer som nettopp er diskutert, har egenskapen om at enten innsatsen eller fjerningen av maksimal operasjon tar lineær tid i verste fall. Å finne en implementering der begge operasjonene er garantert å være raske, er en mer interessant oppgave, og det er hovedfeltet i denne delen. Hoppdefinisjoner. Den binære bunken er en datastruktur som effektivt kan støtte de grunnleggende prioritetskøoperasjoner. I en binær haug lagres elementene i en matrise slik at hver nøkkel er garantert å være større enn (eller lik) nøklene ved to andre spesifikke posisjoner. I sin tur må hver av disse nøklene være større enn to nøkler og så videre. Denne bestillingen er lett å se om vi ser nøklene som i en binær trestruktur med kanter fra hver tast til de to tastene som er kjent for å være mindre. Definisjon. Et binært tre er heap-bestilt hvis nøkkelen i hver node er større enn (eller lik) nøklene i det noder to barn (hvis noen). Forslag. Den største nøkkelen i et bunkebestilt binært tre er funnet på roten. Vi kan pålegge bunkebestillingsbegrensningen på et binært tre. Det er imidlertid spesielt praktisk å bruke et komplett binært tre som det nedenfor. Vi representerer komplette binære trær i rekkefølge innenfor en matrise ved å sette knutepunktene med nivåordre. med roten i stilling 1, sine barn i stillinger 2 og 3, deres barn i stillinger 4, 5, 6 og 7, og så videre. Definisjon. En binær haug er et sett med noder med nøkler som er arrangert i et komplett heapordret binærtre, representert i nivåordre i en matrise (ikke ved bruk av første oppføring). I en haug er forelderen til noden i posisjon k i posisjon k2 og omvendt er de to barnene til node i posisjon k i stillingene 2k og 2k 1. Vi kan reise opp og ned ved å gjøre enkle aritmetiske på matriseindekser : å flytte opp treet fra ak settes k til k2 for å flytte ned treet vi stiller k til 2k eller 2k1. Algoritmer på hauger. Vi representerer en bunke av størrelse N i private array pq av lengde N1, med pq0 ubrukt og bunken i pq1 til pqN. Vi får tilgang til nøkler bare gjennom private hjelpefunksjoner mindre () og exch (). Hoppoperasjoner som vi anser fungerer ved å først lage en enkel modifikasjon som kan krenke bunksbetingelsen, og deretter reise gjennom bunken og modifisere bunken som nødvendig for å sikre at bunkebetingelsen er fornøyd overalt. Vi refererer til denne prosessen som reorifisering. eller gjenopprette bunkeordre. Bottom-up reheapify (svømme). Hvis bunkeordren brytes, fordi en nodernøkkel blir større enn det nodernes foreldre nøkkel, kan vi gjøre fremskritt mot å fikse bruddet ved å bytte knutepunktet med foreldrene. Etter utvekslingen er noden større enn begge sine barn (den ene er den gamle forelder, den andre er mindre enn den gamle forelder fordi det var et barn av den node), men noden kan fortsatt være større enn foreldrene. Vi kan fikse dette bruddet på samme måte, og så videre, flytte opp bunken til vi kommer til en knutepunkt med en større nøkkel eller roten. Top-down heapify (vask). Hvis bunkeordren brytes fordi en knutepunkt blir mindre enn en eller begge knutepunktene barnesnøkler, kan vi gjøre fremskritt mot å fikse bruddet ved å bytte knutepunktet med den største av sine to barn. Denne bryteren kan føre til brudd på barnet vi fastsetter det bruddet på samme måte, og så videre, beveger oss ned i bunken til vi når en knutepunkt med både barn mindre eller bunn. Heap-basert prioritetskø. Disse sink () og swim () operasjonene danner grunnlaget for effektiv implementering av API for prioritetskøen, som vist nedenfor og implementert i MaxPQ. java og MinPQ. java. Sett inn. Vi legger til det nye elementet på slutten av matrisen, øker størrelsen på bunken og svømmer opp gjennom bunken med det aktuelle elementet for å gjenopprette bunkebetingelsen. Fjern maksimalt. Vi tar det største elementet fra toppen, legger varen fra enden av bunken på toppen, senker størrelsen på bunken, og senker den ned gjennom bunken med det aktuelle elementet for å gjenopprette bunkebetingelsen. Forslag. I en N-punkts prioritetskø, krever heapalgoritmene ikke mer enn 1 lg sammenlignet for innsetting og ikke mer enn 2 lg N sammenlikner for å fjerne maksimumet. Praktiske hensyn. Vi konkluderer med studien av API-høyprioriteringskøen med noen få praktiske hensyn. Multiway heaps. Det er ikke vanskelig å endre koden vår for å bygge hauger basert på en array-representasjon av komplette heapbestilt ternære eller darytende trær. Det er en bytte mellom lavere kostnader fra redusert trehøyde og høyere kostnad for å finne den største av de tre eller d-barna på hver knute. Array resizing. Vi kan legge til en ikke-argumentkonstruktor, kode for array-fordobling i insert (). og kode for array halving i delMax (). akkurat som vi gjorde for stabler i avsnitt 1.3. Logaritmiske tidsgrenser blir amortisert når størrelsen på prioritetskøen er vilkårlig, og arrayene blir endret. Immutability av nøkler. Prioritetskøen inneholder objekter som er opprettet av klienter, men forutsetter at klientkoden ikke endrer nøklene (som kan ugyldiggjøre bunkeinvarianter). Indeks prioritetskø. I mange applikasjoner er det fornuftig å tillate kundene å referere til elementer som allerede er på prioritetskøen. En enkel måte å gjøre det på er å knytte en unik helhetsindeks med hvert element. IndexMinPQ. java er en haugbasert implementering av denne API IndexMaxPQ. java er lik, men for maksimalorienterte prioritetskøer. Multiway. java er en klient som sammenføyer flere sorterte inngangsstrømmer til en sortert utgangsstrøm. Vi kan bruke en hvilken som helst prioritetskø for å utvikle en sorteringsmetode. Vi setter inn alle tastene som skal sorteres i en minimumsrettet prioritets kø, og bruk gjentatte ganger for å fjerne dem alt i orden. Når du bruker en haug for prioritetskøen, får vi heapsort. Med fokus på oppgaven med sortering, forlater vi tanken om å gjemme høydenes representasjon av prioritetskøen og bruk svømme () og sink () direkte. Hvis du gjør det, kan vi sortere en matrise uten å trenge ekstra plass ved å opprettholde bunken i arrayet som skal sorteres. Heapsort går i to faser: heap konstruksjon. hvor vi reorganiserer den opprinnelige gruppen i en bunke og sorteringen. hvor vi trekker varene ut av bunken i avtagende rekkefølge for å bygge det sorterte resultatet. Heap konstruksjon. Vi kan utføre denne oppgaven i tide proporsjonal med N lg N, ved å gå fra venstre til høyre gjennom matrisen, ved å bruke svømmer () for å sikre at oppføringene til venstre for skanningspekeren utgjør et heapbestilt fullstendig tre, som etterfølgende prioritetskøinnlegginger. En smart metode som er mye mer effektiv, er å fortsette fra høyre til venstre, ved hjelp av sink () for å lage underlag som vi går. Hver posisjon i gruppen er roten til en liten subheap sink () - verk eller lignende underlag. Hvis de to barna i en knute er hauger, så kalles vasken () på den knutepunktet, som gjør subtreet rotet der en bunke. Sortdown. Det meste av arbeidet under heapsort er gjort i den andre fasen, hvor vi fjerner de største gjenværende gjenstandene fra bunken og legger den inn i stillingsposisjonen som er forlatt når bunken krymper. Heap. java er en full implementering av heapsort. Nedenfor er et spor av innholdet i matrisen etter hver vask. Forslag. Vaskbasert haugekonstruksjon er lineær tid. Forslag. Heapsort brukere mindre enn 2n lg n sammenligne og utveksle for å sortere n elementer. De fleste gjenstander som er satt inn i bunken under sortering, går helt til bunnen. Vi kan dermed spare tid ved å unngå kontrollen for om varen har nådd sin posisjon, bare fremme den største av de to barna til bunnen er nådd, og deretter flytte opp bakken til riktig posisjon. Denne ideen reduserer antall sammenligninger med en faktor 2 på bekostning av ekstra bokføring. Anta at sekvensen (der et brev betyr å sette inn og en stjerne betyr å fjerne maksimumet) blir brukt til en først og fremst tom prioritetskø. Gi sekvensen av verdier returnert ved å fjerne de maksimale operasjonene. Løsning. R R P O T Y I I U Q E U (E igjen på PQ) Kritisér følgende ide: For å finne maksimalt i konstant tid, hvorfor ikke holde oversikt over maksimalverdien som er satt inn så langt, og returner den verdien for å finne maksimum. Løsning. Vil nødvendigvis oppdatere maksimumsverdien fra bunnen av etter en maksimal drift. Gi prioritetskø implementeringer som støtter innsatsen og fjern maksimalt. en for hver av følgende underliggende datastrukturer: uordnet array, bestilt array, uordnet koblet liste og bestilt koblet liste. Gi en tabell med worst case-grensene for hver operasjon for hver av dine fire implementeringer fra forrige øvelse. Delvis løsning. OrderedArrayMaxPQ. java og UnorderedArrayMaxPQ. java Er en matrise som er sortert i synkende rekkefølge en maksimal orientering. Svar. Ja. Anta at søknaden din vil ha et stort antall innsatsoperasjoner, men bare få fjerner de maksimale operasjonene. Hvilken implementering av prioritetskøen tror du vil være mest effektiv: heap, uordnet array, bestilt array Svar. Uordnet array. Sett inn er konstant tid. Anta at søknaden din vil ha et stort antall finne de maksimale operasjonene, men et relativt lite antall innsatser og fjerne maksimal drift. Hvilken prioritetskøimplementasjon tror du vil være mest effektiv: heap, uordnet array, bestilt array Svar. Ordnet array. Finn maksimum er konstant tid. Hva er minimum antall elementer som må byttes under en fjern maksimal drift i en haug av størrelse N uten dupliserte nøkler Gi en haug med størrelse 15 som minimumet oppnås. Svar på det samme spørsmålet for to og tre påfølgende, fjern de maksimale operasjonene. Delvis svar. (a) 2. Utform en algoritme for lineær tidssertifisering for å kontrollere om et array pq er en minorientert bunke. Løsning. Se metoden isMinHeap () i MinPQ. java. Bevis at sinkbasert haugekonstruksjon bruker maksimalt 2 n sammenlignet og maksimalt n utveksling. Løsning. Det er nok å bevise at sinkbasert haugekonstruksjon bruker færre enn n utveksling fordi antall sammenlikninger er høyst dobbelt så mange utvekslinger. For å forenkle, anta at binærhøyden er perfekt (dvs. et binært tre hvor hvert nivå er ferdig fylt) og har høyde h. Vi definerer høyden på en node i et tre for å være subtreetes høyde rotfestet på den noden. En nøkkel i høyden k kan byttes med maksimalt k-taster under den når den senkes ned. Siden det er 2 timer minus k noder i høyden k. Det totale antall utvekslinger er høyst: Den første likestilling er for en ikke-standard sum, men det er greit å verifisere at formelen holder seg gjennom matematisk induksjon. Den andre likestilling holder fordi et perfekt binært tre med høyde h har 2 h 1 minus 1 noder. Å bevise at resultatet holder når det binære treet ikke er perfekt krever litt mer omsorg. Du kan gjøre det ved å bruke det faktum at antall noder i høyden k i en binær bunke på n noder er høyst nivå (n 2 k 1). Alternativ løsning. Igjen, for enkelhet, anta at binærhøyden er perfekt (dvs. et binært tre hvor hvert nivå er fullført). Vi definerer høyden på en node i et tre for å være subtreetes høyde rotfestet på den noden. Først observere at en binær haug på n noder har n minus 1 koblinger (fordi hver lenke er forelder til en node og hver node har en foreldre lenke bortsett fra roten). Å senke en node med høyde k krever mest k utvekslinger. Vi vil lade k-koblinger til hver knute i høyden k. men ikke nødvendigvis koblingene på banen som er tatt når du synker noden. I stedet belaster vi noden k-koden langs stien fra noden som går til venstre-høyre-høyre-høyre-. For eksempel, i diagrammet under, er rotnoden ladet de 4 røde koblingene den blå noden er ladet de 3 blå koblingene og så videre. Merk at ingen kobling er belastet mer enn ett node. (Faktisk er det to koblinger som ikke er belastet noen knutepunkt: den riktige lenken fra rot - og stamkoblingen fra nederste høyre knutepunkt.) Det totale antall utvekslinger er dermed nesten ikke n. Siden det maksimalt er 2 sammenligninger per utveksling, er antall sammenligninger maksimalt 2 n. Kreative problemer Beregningsnummerteori. Skriv et program CubeSum. java som skriver ut alle heltallene av skjemaet en 3 b 3 hvor a og b er heltall mellom 0 og N i rekkefølge, uten å bruke for mye plass. Det er, i stedet for å beregne en rekke N2-summene og sortere dem, bygge en minimumsrettet prioritetskø, som først inneholder (0 3 0, 0), (1 3 1, 0), (2 3 2 , 0). (N3N, 0). Deretter, mens prioritetskøen ikke er tillatt, fjern det minste elementet (i 3 j 3. i, j), skriv det ut, og så, hvis j 3 (j1) 3. i, j1). Bruk dette programmet til å finne alle de forskjellige heltallene a, b, c og d mellom 0 og 106 slik at en 3 b 3 c 3 d 3. f. eks. 1729 93 103 13 123. Finn minimum. Legg til en min () metode til MaxPQ. java. Din implementering skal bruke konstant tid og konstant ekstra plass. Løsning . Legg til en ekstra instansvariabel som peker på det minste elementet. Oppdater det etter hvert anrop for å sette inn (). Tilbakestill den til null hvis prioritetskøen blir tom. Dynamisk-median funnet. Lag en datatype som støtter innsats i logaritmisk tid, finn medianen i konstant tid, og fjern medianen i logaritmisk tid. Løsning . Hold mediannøkkelen inn v bruk en maksimalorientert haug for nøkler mindre enn nøkkelen til v bruk en minorientert haug for nøkler som er større enn nøkkelen til v. For å sette inn, legg til den nye nøkkelen i riktig haug, erstatt v med nøkkelen hentet fra den bunken. Nedre grense. Bevis at det er umulig å utvikle en implementering av MinPQ API slik at både sette inn og slette minimumsgarantien for å bruke N logglogg N, sammenlignes. Løsning. Dette ville gi en N-logg N-sammenligningsbasert sorteringsalgoritme (sett inn N-elementene, fjern gjentatte ganger gjentatte ganger), og bryter med forslaget til Seksjon 2.3. Indeks prioritering-kø implementering. Implementer IndexMaxPQ. java ved å endre MaxPQ. java som følger: Endre pq for å holde indekser, legge til en array nøkler for å holde nøkkelverdiene, og legg til en array qp som er den inverse av pq mdash qpi gir posisjonen til i i pq indeks j slik at pqj er i). Endre koden for å opprettholde disse datastrukturene. Bruk konvensjonen som qpi er -1 hvis jeg ikke er i køen, og inkludere en metode som inneholder () som tester denne tilstanden. Du må endre hjelpemetoder exch () og mindre (), men ikke synke () eller svømme (). Nettøvelser Beste, gjennomsnittlige og verste fall av heapsort. Hva er det beste tilfellet, gjennomsnittlig tilfelle, og verste fall antall sammenligner for heapsorting en rekke lengde N Solution. Hvis vi tillater duplikater, er det beste tilfellet lineær tid (N like nøkler) hvis vi forkaster duplikater, det beste tilfellet er N lg N sammenligner (men det beste tilfelleinngangen er ubehagelig). Det gjennomsnittlige og verste tilfelle antall sammenligninger er 2 N lg N sammenlikninger. Se analysen av Heapsort for detaljer. Beste og verste tilfelle av heapify. Hva er det færre og mest antall sammenligningseksempler som trengs for å heapify en rekke N-produkter Løsning. Hoving av en rekke N-elementer i synkende rekkefølge krever 0-utvekslinger og N-1 sammenligner. Å heapere en rekke N-elementer i stigende rekkefølge krever N-utvekslinger og 2N sammenligner. Taxicab nummer. Finn de minste heltalene som kan uttrykkes som summen av heltalene på to forskjellige måter (1.729), tre forskjellige måter (87.539.319), fire forskjellige måter (6,963,472,309,248), fem forskjellige måter (48.988.659.276.962.496) og seks forskjellige måter (24.153.319.581.254.312.065.344 ). Slike heltall heter Taxicab-tall etter den berømte Ramanujan-historien. De minste heltallene som kan uttrykkes som summen av kubene av heltall på syv forskjellige måter er foreløpig ukjent. Skriv et program Taxicab. java som leser i en kommandolinjeparameter N og skriver ut alle nontrivielle løsninger med en 3 b 3 c 3 d 3. slik at a, b, c og d er mindre enn eller lik N. Beregn tallteori. Finn alle løsninger til ligningen a 2b 2 3c 3 4d 4 for hvilke a, b, c og d er mindre enn 100.000. Hint. bruk en minhurt og en maxhøyde. Avbruddshåndtering. Når du programmerer et sanntidssystem som kan avbrytes (for eksempel med et museklikk eller en trådløs forbindelse), er det nødvendig å følge avbruddene umiddelbart, før du fortsetter med gjeldende aktivitet. Hvis avbruddene skal håndteres i samme rekkefølge de kommer, er en FIFO-kø den riktige datastrukturen. Men hvis forskjellige forstyrrelser har forskjellige prioriteringer (f. eks.), Trenger vi en prioritetskø. Simulering av køenettverk. MM1 kø for dobbel parallell køer, etc. Vanskelig å analysere komplekse køenettverk matematisk. I stedet bruk simulering for å plotte distribusjon av ventetider, etc. Trenger prioritetskø for å avgjøre hvilken hendelse som skal behandles neste. Zipf distribusjon. Bruk resultatet av den forrige øvelsen (e) til å prøve fra Zipfian-fordelingen med parameter s og N. Fordelingen kan ta på heltallverdier fra 1 til N, og tar på verdien k med sannsynlighet 1ks sum (i 1 til N) 1is . Eksempel: Ord i Shakespeare spiller Hamlet med s omtrentlig lik 1. Tilfeldig prosess. Begynn med N-skuffer, hver bestående av en ball. Velg tilfeldig en av N-ballene og flytte ballen til en kasse tilfeldig slik at sannsynligheten for at en ball plasseres i en kasse med m baller er mN. Hva er fordelingen av baller som resulterer etter mange iterasjoner Bruk den tilfeldige prøvetakingsmetoden beskrevet ovenfor for å gjøre simuleringen effektiv. Nærmeste naboer. Gitt N vektorer x 1. x 2. x N med lengde M og en annen vektor x av samme lengde, finn de 20 vektorene som er nærmest x. Sirkel tegnet på et stykke grafpapir. Skriv et program for å finne radius av en sirkel, sentrert på opprinnelsen, som berører 32 poeng med heltall x - og y-koordinater. Hint: se etter et tall enn det kan uttrykkes som summen av to firkanter på flere forskjellige måter. Svar: Det er to pythagoranske tripler med hypotenuse 25: 152 202 252, 72 242 252, og gir 20 slike gitterpunkter. Det er 22 forskjellige Pythagorean-tripper med hypotenuse 5.525, dette fører til 180 gitterpunkter. 27.625 er minste radius som berører mer enn 64. 154.136.450 har 35 Pythagorean tripler. Perfekte krefter. Skriv et program PerfectPower. java for å skrive ut alle perfekte krefter som kan representeres som 64-biters lange heltall: 4, 8, 9, 16, 25, 27. En perfekt kraft er et tall som kan skrives som ab for heltall a og b ge 2. Flytende punkt tillegg. Legg opp N flytpunktsnumre, unngå rundefeil. Slett minst to: Legg til to hverandre, og sett inn igjen. Første passform for binpakking. 1710 OPT 2, 119 OPT 4 (avtagende). Bruk maks turneringstreet hvor spillere er N-bokser og verdien tilgjengelig kapasitet. Stack med minmax. Design en datatype som støtter push, pop, størrelse, min og max (hvor min og max er minimum og maksimale elementer på stakken). Alle operasjoner bør ta konstant tid i verste fall. Hint: Tilknytt hver enkelt stakkoppføring med minimum og maksimalt antall elementer som står på stakken. Kø med minmax. Design en datatype som støtter enqueue, dequeue, size, min og max (hvor min og max er minimum og maksimale elementer i køen). Alle operasjoner bør ta konstant avkortet tid. Tips: Gjør den forrige øvelsen og simuler en kø med to stabler. 2i 5j. Skriv ut tallene på skjemaet 2i 5j i stigende rekkefølge. Min-max bunke. Design en datastruktur som støtter min og max i konstant tid, sett inn, slett min og slett maks i logaritmisk tid ved å sette elementene i et enkelt utvalg av størrelse N med følgende egenskaper: Strukturen representerer et komplett binært tre. Nøkkelen i en node på et jevnt nivå er mindre enn (eller liknende) nøklene i dens undertreet nøkkelen i en node på et ulikt nivå er større enn (eller liknende) nøklene i dens undertreet. Vær oppmerksom på at maksimumverdien er lagret ved roten og minimumsverdien er lagret på en av røttene children. Solution. Min-Max Hopper og Generalized Priority Queues Range minimum spørring. Gitt en sekvens av N-elementer, er en rekkeminimumsforespørsel fra indeksen i til j indeksen for det minste elementet mellom i og j. Utform en datastruktur som preprocesserer sekvensen av N-elementer i lineær tid for å støtte minimumsintervall i logaritmisk tid. Bevis at et komplett binært tre med N noder har nøyaktig tak (N2) blad noder (noder uten barn). Maksimalorientert prioritetskø med min. Hva er rekkefølgen av veksten av kjøretiden for å finne en minimumsnøkkel i en maksimal-orientert binær haug. Løsning . linearmdashthe minimum nøkkelen kan være i noen av taket (N2) blad noder. Maksimalorientert prioritetskø med min. Design en datatype som støtter innstikk og fjern-maksimum i logaritmisk tid sammen med både maks en min i konstant tid. Løsning. Opprett en maksimal orientert binær bunke og lagre også minsteknappen så langt (som aldri vil øke med mindre denne bunken blir tom). kth største objektet større enn x. Gitt en maksimal orientert binær haug, utform en algoritme for å avgjøre om kth største objektet er større enn eller lik x. Din algoritme skal løpe i tid proporsjonal med k. Løsning . Hvis nøkkelen i noden er større enn eller lik x, søker du rekursivt både til venstre undertreet og høyre undertreet. Stopp når antall noder utforsket er lik k (svaret er ja) eller det er ikke flere noder å utforske (nei). kth minste gjenstand i en minorientert binær haug. Opprett en k log k algoritme for å finne det kth minste elementet i en min-orientert binærhakke H som inneholder N elementer. Løsning. Bygg en ny minorientert bunke H. Vi vil ikke modifisere H. Sett inn roten til H i ​​H sammen med bunkeindeksen 1. Gjenta gjentatte ganger det minste elementet x i H og sett inn i H de to barna x fra H . Kth-elementet slettet fra H er kth minste punkt i H. Randomized kø. Implementer en RandomQueue slik at hver operasjon er garantert å ta mest logaritmisk tid. Hint. kan ikke råd til array dobling. Ingen enkel måte med koblede lister for å finne et tilfeldig element i O (1) tid. I stedet bruker du et komplett binært tre med eksplisitte lenker. FIFO-kø med tilfeldig sletting. Implementere en datatype som støtter følgende operasjoner: sett inn et element. slette elementet som sist ble lagt til og slett et tilfeldig element. Hver operasjon bør i det minste ta (høyst) logaritmisk tid. Løsning . Bruk et komplett binært tre med eksplisitte koblinger tilordne den lange heltalsprioriteten jeg til den i posten lagt til datastrukturen. Topp k summer av to sorterte arrays. Gitt to sorterte arrays a og b, finner hver lengde N de største k-summene av skjemaet ai bj. Hint. Ved å bruke en prioritetskø (tilsvarende taxicabproblemet), kan du oppnå en O (k log N) algoritme. Overraskende er det mulig å gjøre det i O (k) tid, men algoritmen er komplisert. Empirisk analyse av haugkonstruksjon. Sammenligne empirisk line-time bottom-up heap konstruksjon versus den naive linearithmic-time topp-down heap konstruksjon. Vær sikker på å kompradere den over en rekke verdier av N. LaMarca og Ladner rapporterer at på grunn av cache-lokalitet kan naivalgoritmen utføre bedre i praksis enn den mer klare tilnærmingen til store verdier av N (når bunken ikke lenger passer i cache) selv om sistnevnte utfører mange færre sammenligninger og utvekslinger. Empirisk analyse av flerveishunder. Empirisk sammenligne ytelsen på 2- 4- og 8-veis hauger. LaMarca og Ladner foreslår flere optimaliseringer, med tanke på caching-effekter. Empirisk analyse av heapsort. Empirisk sammenligne ytelsen til 2- 4- og 8-veis heapsort. LaMarca og Ladner foreslår flere optimaliseringer, med tanke på caching-effekter. Deres data indikerer at en optimalisert (og minneinnstilt) 8-veis heapsort kan være dobbelt så rask som klassisk heapsort. Heapify ved innsetting. Anta at du bulider en binær haug på N-tastene ved å gjenta den neste nøkkelen i binærhugen. Vis at totalt antall sammenlikninger er høyst svar. Antall sammenligninger er høyst lg 1 lg 2. Lg N lg (N) N lg N. Forhøy nedre bundet. (Gonnet og Munro) Vis at enhver sammenligningsbasert algoritme for å bygge en binær haug på N-tastene tar minst 1,3644 N i verste fall. Svar . bruk et informasjonsteoretisk argument, ala sortering nedre bundet. Det er N mulige hauger (permutasjon av N-tallene) på N forskjellige taster, men det er mange hauger som tilsvarer samme bestilling. For eksempel er det to habler (c a b og c b a) som tilsvarer de tre elementene aLets forestille vi har en rekke heltall slik: Gjennomsnittet er oppnådd med følgende formel A (1n) xi (med i 1 til n). Så: x1n x2n. xnn Vi deler nåverdien med antall verdier og legger til det forrige resultatet til den returnerte verdien. Reduksjonsmetode underskrift er Reduksjon tilbakeringingsfunksjonen tar følgende parametere: s. Resultat av forrige beregning c. Nåværende verdi (fra gjeldende indeks) i. Nåværende arrayelementer indeksverdi a. Den nåværende reduserte Array Den andre reduserer parameteren er standardverdien. (Brukes dersom arrayet er tomt). Så gjennomsnittlig reduseringsmetode vil være: Hvis du foretrekker at du kan opprette en egen funksjon, og så bare henvise til tilbakekallingsmetoden signaturen eller Øk Array-prototypen direkte. Det er mulig å dele verdien hver gang reduksjonsmetoden kalles. Eller enda bedre. Ved hjelp av den tidligere definerte Array. protoype. sum () - metoden, optimaliserer prosessen min kaller divisjonen bare en gang :) Deretter på et hvilket som helst Array-objekt av omfanget: NB: Et tomt utvalg med retur et NaN-ønske er mer korrekt enn 0 i min synspunkt og kan være nyttig i spesielle brukstilfeller.1.5 Input og Output I denne delen utvider vi settet med enkle abstraksjoner (kommandolinjeinngang og standardutgang) som vi har brukt som grensesnitt mellom våre Java-programmer og utsiden Verden inkluderer 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. Typing input. When you use the java command to invoke a Java program from the command line, you actually are doing three things: (1) issuing a command to start executing your program, (2) specifying the values of the command-line arguments, and (3) beginning to define the standard input stream. The string of characters that you type in the terminal window after the command line is the standard input stream. For example, AddInts. java takes a command-line argument n . then reads n numbers from standard input and adds them, and prints the result to standard output: Input format. If you type abc or 12.2 or true when StdIn. readInt() is expecting an int . then it will respond with an InputMismatchException . StdIn treats strings of consecutive whitespace characters as identical to one space and allows you to delimit your numbers with such strings. Interactive user input. TwentyQuestions. java is a simple example of a program that interacts with its user. The program generates a random integer and then gives clues to a user trying to guess the number. The fundamental difference between this program and others that we have written is that the user has the ability to change the control flow while the program is executing. Processing an arbitrary-size input stream. Typically, input streams are finite: your program marches through the input stream, consuming values until the stream is empty. But there is no restriction of the size of the input stream. Average. java reads in a sequence of real numbers from standard input and prints their average. Redirection and piping. For many applications, typing input data as a standard input stream from the terminal window is untenable because doing so limits our programs processing power by the amount of data that we can type. Similarly, we often want to save the information printed on the standard output stream for later use. We can use operating system mechanisms to address both issues. Redirecting standard output to a file. By adding a simple directive to the command that invokes a program, we can redirect its standard output to a file, either for permanent storage or for input to some other program at a later time. For example, the command specifies that the standard output stream is not to be printed in the terminal window, but instead is to be written to a text file named data. txt . Each call to StdOut. print() or StdOut. println() appends text at the end of that file. In this example, the end result is a file that contains 1,000 random values. Redirecting standard output from a file. Similarly, we can redirect standard input so that StdIn reads data from a file instead of the terminal window. For example, the commandreads a sequence of numbers from the file data. txt and computes their average value. Specifically, the lt symbol is a directive to implement the standard input stream by reading from the file data. txt instead of by waiting for the user to type something into the terminal window. When the program calls StdIn. readDouble() . the operating system reads the value from the file. This facility to redirect standard input from a file enables us to process huge amounts of data from any source with our programs, limited only by the size of the files that we can store. Connecting two programs. The most flexible way to implement the standard input and standard output abstractions is to specify that they are implemented by our own programs This mechanism is called piping . For example, the following commandspecifies that the standard output for RandomSeq and the standard input stream for Average are the same stream. Filters. For many common tasks, it is convenient to think of each program as a filter that converts a standard input stream to a standard output stream in some way, RangeFilter. java takes two command-line arguments and prints on standard output those numbers from standard input that fall within the specified range. Your operating system also provides a number of filters. For example, the sort filter puts the lines on standard input in sorted order: Another useful filter is more . which reads data from standard input and displays it in your terminal window one screenful at a time. For example, if you type you will see as many numbers as fit in your terminal window, but more will wait for you to hit the space bar before displaying each succeeding screenful. Standard drawing. Now we introduce a simple abstraction for producing drawings as output. We imagine an abstract drawing device capable of drawing lines and points on a two-dimensional canvas. The device is capable of responding to the commands that our programs issue in the form of calls to static methods in StdDraw. The primary interface consists of two kinds of methods: drawing commands that cause the device to take an action (such as drawing a line or drawing a point) and control commands that set parameters such as the pen size or the coordinate scales. Basic drawing commands. We first consider the drawing commands: These methods are nearly self-documenting: StdDraw. line(x0, y0, x1, y1) draws a straight line segment connecting the point ( x 0 . y 0 ) with the point ( x 1 . y 1 ). StdDraw. point(x, y) draws a spot centered on the point ( x . y ). The default coordinate scale is the unit square (all x - and y - coordinates between 0 and 1). The standard implementation displays the canvas in a window on your computers screen, with black lines and points on a white background. Your first drawing. The HelloWorld for graphics programming with StdDraw is to draw a triangle with a point inside. Triangle. java accomplishes this with three calls to StdDraw. line() and one call to StdDraw. point() . Control commands. The default canvas size is 512-by-512 pixels and the default coordinate system is the unit square, but we often want to draw plots at different scales. Also, we often want to draw line segments of different thickness or points of different size from the standard. To accommodate these needs, StdDraw has the following methods:For example, the two-call sequence sets the drawing coordinates to be within a bounding box whose lower-left corner is at ( x 0 . y 0 ) and whose upper-right corner is at ( x 1 . y 1 ). Filtering data to a standard drawing. PlotFilter. java reads a sequence of points defined by ( x . y ) coordinates from standard input and draws a spot at each point. It adopts the convention that the first four numbers on standard input specify the bounding box, so that it can scale the plot. Plotting a function graph. FunctionGraph. java plots the function y sin(4 x ) sin(20 x ) in the interval (0, pi). There are an infinite number of points in the interval, so we have to make do with evaluating the function at a finite number of points within the interval. We sample the function by choosing a set of x - values, then computing y - values by evaluating the function at each x - value. Plotting the function by connecting successive points with lines produces what is known as a piecewise linear approximation. Outline and filled shapes. StdDraw also includes methods to draw circles, rectangles, and arbitrary polygons. Each shape defines an outline. When the method name is just the shape name, that outline is traced by the drawing pen. When the method name begins with filled . the named shape is instead filled solid, not traced. The arguments for circle() define a circle of radius r the arguments for square() define a square of side length 2r centered on the given point and the arguments for polygon() define a sequence of points that we connect by lines, including one from the last point to the first point. Text and color. To annotate or highlight various elements in your drawings, StdDraw includes methods for drawing text, setting the font, and setting the the ink in the pen. In this code, java. awt. Font and java. awt. Color are abstractions that are implemented with non-primitive types that you will learn about in Section 3.1. Until then, we leave the details to StdDraw . The default ink color is black the default font is a 16-point plain Serif font. Double buffering. StdDraw supports a powerful computer graphics feature known as double buffering . When double buffering is enabled by calling enableDoubleBuffering() . all drawing takes place on the offscreen canvas . The offscreen canvas is not displayed it exists only in computer memory. Only when you call show() does your drawing get copied from the offscreen canvas to the onscreen canvas . where it is displayed in the standard drawing window. You can think of double buffering as collecting all of the lines, points, shapes, and text that you tell it to draw, and then drawing them all simultaneously, upon request. One reason to use double buffering is for efficiency when performing a large number of drawing commands. Computer animations. Our most important use of double buffering is to produce computer animations . where we create the illusion of motion by rapidly displaying static drawings. We can produce animations by repeating the following four steps: Clear the offscreen canvas. Draw objects on the offscreen Copy the offscreen canvas to the onscreen canvas. Wait for a short while. In support of these steps, the StdDraw has several methods: The Hello, World program for animation is to produce a black ball that appears to move around on the canvas, bouncing off the boundary according to the laws of elastic collision. Suppose that the ball is at position ( x . y ) and we want to create the impression of having it move to a new position, say ( x 0.01, y 0.02). We do so in four steps: Clear the offscreen canvas to white. Draw a black ball at the new position on the offscreen canvas. Copy the offscreen canvas to the onscreen canvas. Wait for a short while. To create the illusion of movement, BouncingBall. java iterates these steps for a whole sequence of positions of the ball. Images. Our standard draw library supports drawing pictures as well as geometric shapes. The command StdDraw. picture(x, y, filename) plots the image in the given filename (either JPEG, GIF, or PNG format) on the canvas, centered on (x, y). BouncingBallDeluxe. java illustrates an example where the bouncing ball is replaced by an image of a tennis ball. User interaction. Our standard draw library also includes methods so that the user can interact with the window using the mouse. A first example. MouseFollower. java is the HelloWorld of mouse interaction. It draws a blue ball, centered on the location of the mouse. When the user holds down the mouse button, the ball changes color from blue to cyan. A simple attractor. OneSimpleAttractor. java simulates the motion of a blue ball that is attracted to the mouse. It also accounts for a drag force. Many simple attractors. SimpleAttractors. java simulates the motion of 20 blue balls that are attracted to the mouse. It also accounts for a drag force. When the user clicks, the balls disperse randomly. Springs. Springs. java implements a spring system. Standard audio. StdAudio is a library that you can use to play and manipulate sound files. It allows you to play, manipulate and synthesize sound. We introduce some some basic concepts behind one of the oldest and most important areas of computer science and scientific computing: digital signal processing . Concert A. Concert A is a sine wave, scaled to oscillate at a frequency of 440 times per second. The function sin( t ) repeats itself once every 2pi units on the x - axis, so if we measure t in seconds and plot the function sin(2pi t times 440) we get a curve that oscillates 440 times per second. The amplitude ( y - value) corresponds to the volume. We assume it is scaled to be between minus1 and 1. Other notes. A simple mathematical formula characterizes the other notes on the chromatic scale. They are divided equally on a logarithmic (base 2) scale: there are twelve notes on the chromatic scale, and we get the i th note above a given note by multiplying its frequency by the ( i 12)th power of 2. When you double or halve the frequency, you move up or down an octave on the scale. For example 880 hertz is one octave above concert A and 110 hertz is two octaves below concert A. Sampling. For digital sound, we represent a curve by sampling it at regular intervals, in precisely the same manner as when we plot function graphs. We sample sufficiently often that we have an accurate representation of the curvemdasha widely used sampling rate is 44,100 samples per second. It is that simple: we represent sound as an array of numbers (real numbers that are between minus1 and 1).For example, the following code fragment plays concert A for 10 seconds. Play that tune. PlayThatTune. java is an example that shows how easily we can create music with StdAudio . It takes notes from standard input, indexed on the chromatic scale from concert A, and plays them on standard audio. Write a program MaxMin. java that reads in integers (as many as the user enters) from standard input and prints out the maximum and minimum values. Write a program Stats. java that takes an integer command-line argument n . reads n floating-point numbers from standard input, and prints their mean (average value) and sample standard deviation (square root of the sum of the squares of their differences from the average, divided by n minus1). Write a program LongestRun. java that reads in a sequence of integers and prints out both the integer that appears in a longest consecutive run and the length of the run. For example, if the input is 1 2 2 1 5 1 1 7 7 7 7 1 1 . then your program should print Longest run: 4 consecutive 7s . Write a program WordCount. java that reads in text from standard input and prints out the number of words in the text. For the purpose of this exercise, a word is a sequence of non-whitespace characters that is surrounded by whitespace. Write a program Closest. java that takes three floating-point command-line arguments (x, y, z), reads from standard input a sequence of point coordinates ((xi, yi, zi)), and prints the coordinates of the point closest to ((x, y, z)). Recall that the square of the distance between ((x, y, z)) and ((xi, yi, zi)) is ((x - xi)2 (y - yi)2 (z - zi)2). For efficiency, do not use Math. sqrt() or Math. pow() . Given the positions and masses of a sequence of objects, write a program to compute their center-of-mass or centroid. The centroid is the average position of the n objects, weighted by mass. If the positions and masses are given by ( x i . y i . m i ), then the centroid ( x . y . m ) is given by: Write a program Centroid. java that reads in a sequence of positions and masses ( x i . y i . m i ) from standard input and prints out their center of mass ( x . y . m ). Hint. model your program after Average. java. Write a program Checkerboard. java that takes a command-line argument n and plots an n-by-n checkerboard with red and black squares. Color the lower-left square red. Write a program Rose. java that takes a command-line argument n and plots a rose with n petals (if n is odd) or 2n petals (if n is even) by plotting the polar coordinates (r, theta) of the function r sin(n times theta) for theta ranging from 0 to 2pi radians. Below is the desired output for n 4, 7, and 8. Write a program Banner. java that takes a string s from the command line and display it in banner style on the screen, moving from left to right and wrapping back to the beginning of the string as the end is reached. Add a second command-line argument to control the speed. Write a program Circles. java that draws filled circles of random size at random positions in the unit square, producing images like those below. Your program should take four command-line arguments: the number of circles, the probability that each circle is black, the minimum radius, and the maximum radius. Creative Exercises Spirographs. Write a program Spirograph. java that takes three command-line arguments R, r, and a and draws the resulting spirograph. A spirograph (technically, an epicycloid) is a curve formed by rolling a circle of radius r around a larger fixed circle or radius R. If the pen offset from the center of the rolling circle is (ra), then the equation of the resulting curve at time t is given by Such curves were popularized by a best-selling toy that contains discs with gear teeth on the edges and small holes that you could put a pen in to trace spirographs. For a dramatic 3d effect, draw a circular image, e. g. earth. gif instead of a dot, and show it rotating over time. Heres a picture of the resulting spirograph when R 180, r 40, and a 15. Clock. Write a program Clock. java that displays an animation of the second, minute, and hour hands of an analog clock. Use the method StdDraw. show(1000) to update the display roughly once per second. Hint. this may be one of the rare times when you want to use the operator with a double - it works the way you would expect. Oscilloscope. Write a program Oscilloscope. java to simulate the output of an oscilloscope and produce Lissajous patterns. These patterns are named after the French physicist, Jules A. Lissajous, who studied the patterns that arise when two mutually perpendicular periodic disturbances occur simultaneously. Assume that the inputs are sinusoidal, so tha the following parametric equations describe the curve: Take the six parameters A x . w x . theta x . theta y . w y . and theta y from the command line. For example, the first image below has Ax Ay 1, w x 2, w y 3, theta x 20 degrees, theta y 45 degrees. The other has parameters (1, 1, 5, 3, 30, 45) Web Exercises Word and line count. Modify WordCount. java so that reads in text from standard input and prints out the number of characters, words, and lines in the text. Rainfall problem. Write a program Rainfall. java that reads in nonnegative integers (representing rainfall) one at a time until 999999 is entered, and then prints out the average of value (not including 999999). Remove duplicates. Write a program Duplicates. java that reads in a sequence of integers and prints back out the integers, except that it removes repeated values if they appear consecutively. For example, if the input is 1 2 2 1 5 1 1 7 7 7 7 1 1, your program should print out 1 2 1 5 1 7 1. Run length encoding. Write a program RunLengthEncoder. java that encodes a binary input using run length encoding. Write a program RunLengthDecoder. java that decodes a run length encoded message. Head and tail. Write programs Head. java and Tail. java that take an integer command line input N and print out the first or last N lines of the given file. (Print the whole file if it consists of For example the message VENI, VIDI, VICI is converted to YHQL, YLGL, YLFL. Write a program Caesar. java that takes a command-line argument k and applies a Caesar cipher with shift k to a sequence of letters read from standard input. If a letter is not an uppercase letter, simply print it back out. Caesar cipher decoding. How would you decode a message encrypted using a Caesar cipher Hint . you should not need to write any more code. Parity check. A Boolean matrix has the parity property when each row and each column has an even sum. This is a simple type of error-correcting code because if one bit is corrupted in transmission (bit is flipped from 0 to 1 or from 1 to 0) it can be detected and repaired. Heres a 4 x 4 input file which has the parity property: Write a program ParityCheck. java that takes an integer N as a command line input and reads in an N-by-N Boolean matrix from standard input, and outputs if (i) the matrix has the parity property , or (ii) indicates which single corrupted bit (i, j) can be flipped to restore the parity property, or (iii) indicates that the matrix was corrupted (more than two bits would need to be changed to restore the parity property). Use as little internal storage as possible. Hint: you do not even have to store the matrix Takagis function. Plot Takagis function: everywhere continuous, nowhere differentiable. Hitchhiker problem. You are interviewing N candidates for the sole position of American Idol. Every minute you get to see a new candidate, and you have one minute to decide whether or not to declare that person the American Idol. You may not change your mind once you finish interviewing the candidate. Suppose that you can immediately rate each candidate with a single real number between 0 and 1, but of course, you dont know the rating of the candidates not yet seen. Devise a strategy and write a program AmericanIdol that has at least a 25 chance of picking the best candidate (assuming the candidates arrive in random order), reading the 500 data values from standard input. Solution: interview for N2 minutes and record the rating of the best candidate seen so far. In the next N2 minutes, pick the first candidate that has a higher rating than the recorded one. This yields at least a 25 chance since you will get the best candidate if the second best candidate arrives in the first N2 minutes, and the best candidate arrives in the final N2 minutes. This can be improved slightly to 1e 0.36788 by using essentially the same strategy, but switching over at time Ne. Nested diamonds. Write a program Diamonds. java that takes a command line input N and plots N nested squares and diamonds. Below is the desired output for N 3, 4, and 5. Regular polygons. Create a function to plot an N-gon, centered on (x, y) of size length s. Use the function to draws nested polygons like the picture below. Bulging squares. Write a program BulgingSquares. java that draws the following optical illusion from Akiyoshi Kitaoka The center appears to bulge outwards even though all squares are the same size. Spiraling mice. Suppose that N mice that start on the vertices of a regular polygon with N sides, and they each head toward the nearest other mouse (in counterclockwise direction) until they all meet. Write a program to draw the logarithmic spiral paths that they trace out by drawing nested N-gons, rotated and shrunk as in this animation. Spiral. Write a program to draw a spiral like the one below. Globe. Write a program Globe. java that takes a real command-line argument alpha and plots a globe-like pattern with parameter alpha. Plot the polar coordinates (r, theta) of the function f(theta) cos(alpha times theta) for theta ranging from 0 to 7200 degrees. Below is the desired output for alpha 0.8, 0.9, and 0.95. Drawing strings. Write a program RandomText. java that takes a string s and an integer N as command line inputs, and writes the string N times at a random location, and in a random color. 2D random walk. Write a program RandomWalk. java to simulate a 2D random walk and animate the results. Start at the center of a 2N-by-2N grid. The current location is displayed in blue the trail in white. Rotating table. You are seated at a rotating square table (like a lazy Susan), and there are four coins placed in the four corners of the table. Your goal is to flip the coins so that they are either all heads or all tails, at which point a bell rings to notify you that you are done. You may select any two of them, determine their orientation, and (optionally) flip either or both of them over. To make things challenging, you are blindfolded, and the table is spun after each time you select two coins. Write a program RotatingTable. java that initializes the coins to random orientations. Then, it prompts the user to select two positions (1-4), and identifies the orientation of each coin. Next, the user can specify which, if any of the two coins to flip. The process repeats until the user solves the puzzle. Rotating table solver. Write another program RotatingTableSolver. java to solve the rotating table puzzle. One effective strategy is to choose two coins at random and flip them to heads. However, if you get really unlucky, this could take an arbitrary number of steps. Goal: devise a strategy that always solves the puzzle in at most 5 steps. Hex. Hex is a two-player board game popularized by John Nash while a graduate student at Princeton University, and later commercialized by Parker Brothers. It is played on a hexagonal grid in the shape of an 11-by-11 diamond. Write a program Hex. java that draws the board. Projectile motion with drag. Write a program BallisticMotion. java that plots the trajectory of a ball that is shot with velocity v at an angle theta. Account for gravitational and drag forces. Assume that the drag force is proportional to the square of the velocity. Using Newtons equations of motions and the Euler-Cromer method, update the position, velocity, and acceleration according to the following equations: Use G 9.8, C 0.002, and set the initial velocity to 180 and the angle to 60 degrees. Heart. Write a program Heart. java to draw a pink heart: Draw a diamond, then draw two circles to the upper left and upper right sides. Changing square. Write a program that draws a square and changes its color each second. Simple harmonic motion. Repeat the previous exercise, but animate the Lissajous patterns as in this applet. Ex: A B w x w y 1, but at each time t draw 100 (or so) points with phi x ranging from 0 to 720 degrees, and phi x ranging from 0 to 1080 degrees. Bresenhams line drawing algorithm. To plot a line segment from (x1, y1) to (x2, y2) on a monitor, say 1024-by-1024, you need to make a discrete approximation to the continuous line and determine exactly which pixels to turn on. Bresenhams line drawing algorithm is a clever solution that works when the slope is between 0 and 1 and x1 Modify Bresenhams algorithm to handle arbitrary line segments. Millers madness. Write a program Madness. java to plot the parametric equation: where the parameter t is in radians. You should get the following complex picture. Experiment by changing the parameters and produce original pictures. Fays butterfly. Write a program Butterfly. java to plot the polar equation: where the parameter t is in radians. You should get an image like the following butterfly-like figure. Experiment by changing the parameters and produce original pictures. Student database. The file students. txt contains a list of students enrolled in an introductory computer science class at Princeton. The first line contains an integer N that specifies the number of students in the database. Each of the next N lines consists of four pieces of information, separated by whitespace: first name, last name, email address, and section number. The program Students. java reads in the integer N and then N lines of data of standard input, stores the data in four parallel arrays (an integer array for the section number and string arrays for the other fields). Then, the program prints out a list of students in section 4 and 5. Shuffling. In the October 7, 2003 California state runoff election for governor, there were 135 official candidates. To avoid the natural prejudice against candidates whose names appear at the end of the alphabet (Jon W. Zellhoefer), California election officials sought to order the candidates in random order. Write a program program Shuffle. java that takes a command-line argument N, reads in N strings from standard input, and prints them back out in shuffled order. (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. Svar . 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. Alle rettigheter reservert.

No comments:

Post a Comment