Code 2.4 priorità Molte applicazioni richiedono che elaboriamo gli elementi che hanno le chiavi in ordine, ma non necessariamente in piena modo ordinato e non necessariamente tutti in una volta. Spesso, raccogliamo una serie di elementi, quindi elaborare quella con la chiave grande, allora forse raccogliere più elementi, quindi elaborare quella con la chiave corrente grande, e così via. Un tipo di dati appropriato in un ambiente del genere supporta due operazioni: rimuovere il massimo e inserire. Tale tipo di dati è chiamato una coda di priorità. code di priorità sono caratterizzati dalla cancellazione del massimo e inserire operazioni. Per convenzione, metteremo a confronto i tasti solo con un metodo meno (), come abbiamo fatto per l'ordinamento. Così, se i record possono avere chiavi duplicate, massimo, qualsiasi record con il più grande valore della chiave. Per completare l'API, abbiamo anche bisogno di aggiungere costruttori e un test se l'operazione vuoto. Per una maggiore flessibilità, si usa una implementazione generica con una chiave di tipo generico che implementa Comparable. Programma TopM. java è un client coda di priorità che richiede una riga di comando argomenti M. legge transazioni dallo standard input, e stampa il M maggiori transazioni. implementazioni elementari. Le strutture dati di base che abbiamo discusso nella sezione 1.3 ci forniscono con quattro punti di partenza per l'attuazione immediata code di priorità. rappresentazione Array (non ordinato). Forse la più semplice implementazione coda di priorità sulla base delle nostre codice per uno stack. Il codice per l'inserimento nella coda di priorità è la stessa per spingere nella pila. Per implementare cancellazione del massimo. possiamo aggiungere codice come il ciclo interno di selezione tipo per scambiare l'articolo massima con la voce alla fine e quindi eliminare quella, come abbiamo fatto con il pop () per pile. Programma UnorderedArrayMaxPQ. java implementa una coda di priorità utilizzando questo approccio. rappresentazione Array (ordinato). Un altro approccio è quello di aggiungere il codice per l'inserimento di spostare le voci più grandi di una posizione a destra, mantenendo così le voci nella matrice in ordine (come in insertion sort). Così l'elemento più grande è sempre alla fine, e il codice per rimuovere la massima nella coda di priorità è la stessa che per pop nella pila. Programma OrderedArrayMaxPQ. java implementa una coda di priorità utilizzando questo approccio. Liste concatenate (non ordinato e retromarcia-ordinata). Allo stesso modo, possiamo iniziare con il nostro codice lista concatenata per uno stack, sia modificando il codice per pop () per trovare e restituire il massimo o il codice per push () per mantenere gli elementi in ordine inverso e al codice per il pop () per scollegare e restituire la prima voce (massimo) sulla lista. Tutte le implementazioni elementari appena discusse hanno la proprietà che sia l'inserimento o la rimozione del massimo funzionamento richiede tempo lineare nel caso peggiore. Trovare un'implementazione in cui entrambe le operazioni sono garantiti per essere veloce è un compito più interessante, ed è l'oggetto principale di questa sezione. definizioni heap. Il mucchio binario è una struttura di dati che può efficacemente supportare le operazioni di base coda con priorità. In un mucchio binario, gli elementi vengono memorizzati in una matrice tale che ogni tasto è garantito per essere maggiore (o uguale a) le chiavi in altre due posizioni specifiche. A sua volta, ciascuna di queste chiavi deve essere maggiore di più di due chiavi, e così via. Questo ordinamento è facile da vedere se consideriamo i tasti come in una struttura ad albero binario con i bordi di ogni chiave per le due chiavi noti per essere più piccoli. Definizione. Un albero binario è heap-ordinato se la chiave di ciascun nodo è maggiore (o uguale a) le chiavi che i nodi due bambini (se presente). Proposizione. Il più grande chiave in un albero binario heap-ordinato si trova alla radice. Siamo in grado di imporre la restrizione heap-ordinamento su qualsiasi albero binario. È particolarmente conveniente, tuttavia, utilizzare un albero binario completo come quella qui sotto. Noi rappresentiamo alberi binari completi in sequenza all'interno di un array, mettendo i nodi con ordine di livello. con la radice in posizione 1, i suoi figli nelle posizioni 2 e 3, i loro bambini in posizioni 4, 5, 6 e 7, e così via. Definizione. Un mucchio binario è un insieme di nodi con chiavi disposti in un albero binario completo heap-ordinato, rappresentato per livello in un array (non utilizzando il primo ingresso). In un mucchio, il genitore del nodo in posizione k è in posizione k2 e, viceversa, i due figli del nodo in posizione k sono in posizioni 2K e 2K 1. Possiamo viaggiare su e giù facendo semplice aritmetica su indici degli array : per spostarsi in alto l'albero da ak siamo insieme k al K2 per spostare l'albero che insieme k di 2k o 2k1. Algoritmi di cumuli. Noi rappresentiamo un mucchio di dimensione N in serie pq privata di lunghezza N1, con PQ0 inutilizzato e il mucchio in pq1 attraverso PQN. Noi accedere alle chiavi solo attraverso le funzioni helper private meno () e Exch (). Le operazioni di heap che consideriamo il lavoro facendo prima una semplice modifica che potrebbe violare i vincoli dello heap, poi viaggio attraverso il cumulo, la modifica del mucchio necessarie per assicurare che la condizione heap viene soddisfatta in tutto il mondo. Ci riferiamo a questo processo come reheapifying. o il ripristino di ordine mucchio. reheapify bottom-up (nuoto). Se l'ordine di heap viene violata perché una chiave nodi diventa più grande di quello nodi chiave genitori, quindi siamo in grado di fare progressi verso fissa la violazione scambiando il nodo con la controllante. Dopo lo scambio, il nodo è maggiore di entrambi i suoi figli (uno è il vecchio genitore, e l'altro è più piccolo del vecchio genitore perché era un bambino di quel nodo), ma il nodo può essere ancora più grande del suo genitore. Siamo in grado di risolvere il problema che la violazione allo stesso modo, e così via, risalendo il mucchio fino a raggiungere un nodo con una chiave più grande, o la radice. Top-down heapify (sink). Se l'ordine di heap viene violata perché una chiave nodi diventa più piccolo di uno o di entrambi che i nodi per bambini chiavi, quindi siamo in grado di fare progressi verso fissa la violazione scambiando il nodo con il maggiore dei suoi figli. Questo interruttore può causare una violazione al bambino che si fissa violazione allo stesso modo, e così via, si muove verso il basso il mucchio fino a raggiungere un nodo con entrambi i bambini più piccoli, o il fondo. Heap-based coda di priorità. Queste operazioni lavandino () e nuotare () forniscono la base per un efficace implementazione delle API di coda con priorità, come diagrammed qui sotto e implementato in MaxPQ. java e MinPQ. java. Inserire. Si aggiunge il nuovo elemento alla fine dell'array, incremento della dimensione della memoria, e poi nuotare attraverso il cumulo con tale elemento per ripristinare la condizione di cumulo. Rimuovere il massimo. Prendiamo l'elemento più grande la parte superiore, inserire l'elemento dalla fine del cumulo in alto, decrementare la dimensione della memoria, e poi affondare giù attraverso il cumulo con tale elemento per ripristinare la condizione di cumulo. Proposizione. In una coda di priorità N-voce, gli algoritmi mucchio non richiedono più di 1 lg N confronto per inserto e non più di 2 lg N confronto per rimuovere la massima. Considerazioni pratiche. Concludiamo il nostro studio della coda API priorità mucchio con alcune considerazioni pratiche. cumuli più vie. Non è difficile modificare il nostro codice di costruire cumuli sulla base di una rappresentazione serie di alberi heap-ordinati completi ternari o d ario. Vi è un compromesso tra il costo inferiore dall'altezza albero ridotta ed il maggior costo di trovare la più grande delle tre o d figli ad ogni nodo. Array ridimensionamento. Siamo in grado di aggiungere un costruttore senza argomenti, il codice per la serie raddoppio in insert (). e il codice per array di dimezzamento in delMax (). proprio come abbiamo fatto per le pile nella Sezione 1.3. I limiti temporali logaritmiche sono ammortizzate quando la dimensione della coda priorità è arbitraria e gli array vengono ridimensionati. Immutabilità delle chiavi. La coda di priorità contiene oggetti che vengono creati dai clienti, ma si presuppone che il codice client non modifica le chiavi (che potrebbero invalidare le invarianti heap). coda di indice di priorità. In molte applicazioni, ha senso per consentire ai clienti di fare riferimento a elementi che sono già in coda di priorità. Un modo semplice per farlo è associare un indice intero unico con ciascun elemento. IndexMinPQ. java è un'implementazione heap-based di questa API IndexMaxPQ. java è simile, ma per le code massimo orientata priorità. Multiway. java è un client che fonde insieme diverse ingresso ordinato flussi in un unico flusso di output ordinato. Possiamo usare qualsiasi coda di priorità di sviluppare un metodo di ordinamento. Inseriamo tutte le chiavi da ordinare in una coda minima orientata priorità, poi ripetutamente usare rimuovere il minimo per rimuoverli tutti in ordine. Quando si utilizza un mucchio per la coda di priorità, otteniamo heapsort. Concentrandosi sul compito di ordinamento, abbandoniamo l'idea di nascondere la rappresentazione mucchio di coda di priorità e l'uso di nuoto () e lavandino () direttamente. In questo modo ci permette di ordinare un array senza bisogno di spazio in più, mantenendo il cumulo all'interno dell'array da ordinare. Heapsort spezza in due fasi: la costruzione mucchio. dove riorganizzare la matrice originale in un mucchio, e la sortdown. dove tiriamo le voci fuori dal mucchio al fine di costruire il risultato ordinato diminuzione. la costruzione mucchio. Possiamo esegue questa operazione in tempo proporzionale a N lg N, procedendo da sinistra a destra attraverso la matrice, utilizzando nuoto () per garantire che le entrate alla sinistra del puntatore scansione formano un albero completo heap-ordinato, come successive inserimenti coda di priorità. Un metodo intelligente che è molto più efficiente è quello di procedere da destra a sinistra, con lavandino () per rendere subheaps come andiamo. Ogni posizione nella matrice è la radice di un piccolo lavandino subheap () funziona o tali subheaps, pure. Se i due figli di un nodo sono cumuli, quindi chiamando lavandino () su tale nodo rende la sottostruttura radicata c'è un mucchio. Sortdown. La maggior parte del lavoro durante heapsort è fatto durante la seconda fase, in cui togliamo le più grandi voci rimanenti dal mucchio e lo mettiamo nella posizione di matrice lasciata libera come il mucchio si restringe. Heap. java è un'implementazione completa di heapsort. Sotto è una traccia del contenuto dell'array dopo ogni lavandino. Proposizione. costruzione mucchio Sink-based è tempo lineare. Proposizione. gli utenti heapsort meno di lg 2n n confronto e di scambio per ordinare n elementi. La maggior parte degli elementi reinseriti nel mucchio durante sortdown andare fino in fondo. Possiamo quindi risparmiare tempo evitando il controllo per se l'elemento ha raggiunto la posizione, semplicemente promuovendo il più grande dei due figli finché la parte inferiore è raggiunto, poi risalendo mucchio nella posizione corretta. Questa idea riduce il numero di confronto di un fattore 2 a scapito della contabilità supplementare. Supponiamo che la sequenza (dove una lettera indica inserire e un asterisco significa rimuovere il massimo) viene applicato ad una coda di priorità inizialmente vuota. Dare la sequenza dei valori restituiti dalle rimuovere le operazioni massimi. Soluzione. R R P O T Y I I U D E U (E a sinistra sulla PQ) criticare l'idea seguente: per implementare trovare il massimo in tempo costante, perché non tenere traccia del valore massimo inserito finora, per poi tornare quel valore per trovare il massimo. Soluzione. Sarà necessario aggiornare il valore massimo da zero dopo una operazione di cancellazione del massimo. Fornire implementazioni coda di priorità che supportano inserire e rimuovere la massima. uno per ciascuna delle seguenti strutture di dati sottostanti: array non ordinato, array ordinato, lista collegata non ordinata, e ha ordinato lista collegata. Dare una tabella dei peggiori limiti per ogni operazione per ciascuno dei tuoi quattro implementazioni dall'esercizio precedente. Soluzione parziale. OrderedArrayMaxPQ. java e UnorderedArrayMaxPQ. java è un array che è ordinato in ordine un mucchio max orientata decrescente. Risposta. Sì. Supponiamo che l'applicazione avrà un gran numero di operazioni di inserimento, ma solo pochi rimuovere le operazioni massimi. Quale implementazione coda con priorità pensi sarebbe più efficace: mucchio, array non ordinato, ordinato allineamento risposta. array non ordinato. Insert è tempo costante. Supponiamo che l'applicazione avrà un numero enorme di trovare le operazioni massimo, ma un numero relativamente piccolo di inserire e rimuovere la operazioni massimi. Quale implementazione coda di priorità pensi sarebbe più efficace: mucchio, array non ordinato, ordinato allineamento risposta. array ordinato. Trova il massimo è costante di tempo. Qual è il numero minimo di elementi che devono essere scambiati durante una rimozione funzionamento massima in un mucchio di dimensione N senza chiavi duplicate Fai un mucchio di dimensioni 15 per il quale si realizza il minimo. Rispondere alla stessa domanda per due e tre successivi eliminano le operazioni massimi. risposta parziale. (A) 2. Progettare un algoritmo di certificazione tempo lineare per verificare se un PQ array è un cumulo min-oriented. Soluzione. Vedere il metodo isMinHeap () in MinPQ. java. Dimostrare che la costruzione mucchio lavello-based utilizza al massimo 2 n confronta e alla maggior parte degli scambi n. Soluzione. Basta dimostrare che la costruzione mucchio sink-based utilizza meno di n scambi perché il numero di confronto è al massimo due volte il numero di scambi. Per semplicità, si supponga che il cumulo binario è perfetta (cioè un albero binario in cui ogni livello è completato riempito) e ha altezza h. Definiamo l'altezza di un nodo in un albero per essere l'altezza del sottoalbero con radice in quel nodo. Una chiave all'altezza k può essere scambiato con al massimo k chiavi sotto di esso quando è affondato verso il basso. Dal momento che ci sono 2 h meno k nodi all'altezza k. il numero totale di scambi è al massimo: La prima uguaglianza è per una somma non standard, ma è immediato verificare che la formula contiene tramite induzione matematica. La seconda uguaglianza vale perché un albero binario perfetto di altezza h ha 2 h 1 meno 1 nodi. Dimostrando che il risultato vale quando l'albero binario non è perfetto richiede un po 'più cura. È possibile farlo utilizzando il fatto che il numero di nodi ad altezza k in un mucchio binario n nodi è al massimo ceil (n 2 k 1). soluzione alternativa. Ancora una volta, per semplicità, si supponga che il cumulo binario è perfetta (cioè un albero binario in cui viene completato riempito ogni livello). Definiamo l'altezza di un nodo in un albero per essere l'altezza del sottoalbero con radice in quel nodo. In primo luogo, osservare che un mucchio binario n nodi ha n meno 1 link (perché ogni link è il genitore di un nodo e ogni nodo ha un collegamento genitore tranne la radice). Sinking un nodo di altezza k richiede maggior parte degli scambi k. Verrà addebitato collegamenti k per ogni nodo all'altezza k. ma non necessariamente i link sulla strada intrapresa quando affondare il nodo. Invece, verrà addebitato il nodo dei collegamenti k lungo il percorso dal nodo che va sinistra-destra-destra-destra. Ad esempio, nello schema qui sotto, il nodo radice paga i 4 link rosso il nodo blu sono a carico dei 3 collegamenti blu e così via. Si noti che nessun collegamento è addebitato più di un nodo. (In realtà, ci sono due collegamenti non richiesti al qualsiasi nodo:. Collegamento destro dalla radice e il collegamento padre dal nodo più a destra in basso) Così, il numero totale di scambi è al massimo n. Poiché ci sono al massimo 2 confronta per scambio, il numero di confronto è al massimo 2 n. Creativo numero di problemi computazionali teoria. Scrivi un CubeSum. java programma che stampi tutti gli interi della forma a 3 b 3, dove a e b sono numeri interi compresi tra 0 e N in modo ordinato, senza l'utilizzo di uno spazio eccessivo. Cioè, invece di calcolare una matrice di N 2 somme e ordinamento, costruire una coda minima orientato priorità, contenente inizialmente (0 3. 0, 0), (1 3. 1, 0), (2 3. 2 , 0). (N 3. N, 0). Poi, mentre la coda di priorità è non vuota, rimuovere l'elemento più piccolo (i 3 j 3. i, j), stamparlo, e poi, se j 3 (J1) 3. I, J1). Utilizzare questo programma per trovare tutti interi distinti a, b, c, d e compreso tra 0 e 106 tale che un 3 b 3 c 3 d 3. es 1729 93 103 13 123. Trova il minimo. Aggiungere un metodo min () per MaxPQ. java. L'implementazione dovrebbe usare costante di tempo e spazio in più costante. Soluzione. aggiungere una variabile di istanza in più che fa riferimento al punto minimo. Aggiornamento dopo ogni chiamata per inserire (). Ripristino a NULL se la coda di priorità diventa vuota. ritrovamento dinamico-mediana. Progettare un tipo di dati che supporta inserto in tempo logaritmico, trova la mediana in tempo costante, e rimuovere la mediana in tempo logaritmico. Soluzione. Mantenere la chiave mediana in v utilizzare un mucchio max-oriented per i tasti in meno rispetto alla chiave di v Utilizzare un mucchio min-oriented per i tasti superiori la chiave di v. Per inserire, aggiungere la nuova chiave nel mucchio del caso, sostituire v con la chiave estratta dal mucchio. Limite inferiore. Dimostrare che è impossibile sviluppare un'implementazione delle API MinPQ in modo tale che sia inserire ed eliminare la garanzia minima di utilizzare N log log N confronto. Soluzione. Ciò produrrebbe un registro di log N N confrontare a base di algoritmo di ordinamento (inserire gli elementi N, quindi rimuovere più volte il minimo), violando la proposizione della Sezione 2.3. implementazione coda con priorità Index. Implementare IndexMaxPQ. java modificando MaxPQ. java come segue: Modifica pq per tenere indici, aggiungere un chiavi degli array per contenere i valori chiave, e aggiungere una serie QP che è l'inverso di pq mdash QPI dà la posizione di i nel pq (il indice j tale che PQJ è i). Poi modificare il codice per mantenere queste strutture di dati. Utilizzare la convenzione che QPI è -1 se non è sulla coda, e includere un metodo contiene () che verifica questa condizione. È necessario modificare il Exch metodi di supporto () e meno (), ma non affondare () o nuotare (). Web Esercizi Best, media, e nel peggiore dei casi di heapsort. Che cosa sono il caso migliore, caso medio, e il peggio numero del caso di confronto per heapsorting una serie di lunghezza N Solution. Se permettiamo duplicati, il caso migliore è tempo lineare (N chiavi uguali), se noi non ammettere duplicati, il caso migliore è N lg N confronto (ma il migliore di ingresso caso è banale). Il numero medio e peggiore caso di confronto è 2 N lg N confronto. Si veda l'analisi di Heapsort per i dettagli. Migliore e peggiore caso di heapify. Qual è il numero minor numero e la maggior parte di comparesexchanges necessari per heapify una serie di N elementi Solution. Heapifying un array di N elementi in ordine decrescente richiede 0 scambi e N - 1 confronta. Heapifying un array di N elementi in ordine crescente richiede N scambi e 2N confronto. numeri di taxi. Trova i più piccoli numeri interi che possono essere espressi come la somma di cubetti di interi in due modi diversi (1.729), tre modi diversi (87,539,319), quattro modi diversi (6,963,472,309,248), cinque modi diversi (48,988,659,276,962,496), e sei modi diversi (24,153,319,581,254,312,065,344 ). Tali numeri interi sono chiamati numero taxicab dopo la famosa storia Ramanujan. I più piccoli numeri interi che possono essere espressi come la somma di cubetti di interi in sette modi diversi è attualmente sconosciuto. Scrivi un Taxicab. java programma che legge in un parametro di riga di comando N e stampa tutte le soluzioni non banali di 3 b 3 c 3 d 3. tale che a, b, c, d, è inferiore o uguale a N. Computational teoria dei numeri. Trova soluzioni dell'equazione 2b 2 3c 3 4d 4 per cui a, b, c, d sono meno di 100.000. Hint. utilizzare uno min heap e un mucchio max. La gestione degli interrupt. Quando si programma un sistema in tempo reale che può essere interrotto (ad esempio con un clic del mouse o connessione wireless), è necessario partecipare alle interruzioni immediatamente, prima di procedere con l'attività corrente. Se gli interrupt devono essere manipolati nello stesso ordine arrivano, poi una coda FIFO è la struttura dati appropriata. Tuttavia, se diversi interrupt hanno priorità diverse (ad esempio), quindi abbiamo bisogno di una coda di priorità. Simulazione di reti di code. coda MM1 per le code parallele doppie, ecc difficili da analizzare reti di code complesse matematicamente. Invece utilizzare la simulazione per tracciare la distribuzione dei tempi di attesa, ecc bisogno di coda di priorità per determinare quale evento di processo successivo. la distribuzione Zipf. Utilizzare il risultato dell'esercizio precedente (s) per campionare dalla distribuzione Zipfian con il parametro s e N. La distribuzione può assumere valori interi da 1 a N, e assume il valore k con 1ks probabilità sum (i 1 a N) 1è . Esempio: parole di Shakespeare Amleto con s circa uguale a 1. processo casuale. Inizia con N bidoni, ognuno composto da una palla. Casualmente selezionare una delle sfere N e spostare la palla a un bidone presso tale caso che la probabilità che una palla è collocato in un contenitore con m sfere è mN. Qual è la distribuzione delle sfere che si traduce, dopo molte iterazioni Utilizzare il metodo di campionamento casuale sopra descritto per rendere la simulazione efficiente. vicini più prossimi. Dato N vettori x 1. x 2. x N di lunghezza M e un altro vettore x della stessa lunghezza, per i 20 vettori che sono vicini a x. Cerchio disegnato su un foglio di carta millimetrata. Scrivere un programma per trovare il raggio di un cerchio, centrato sull'origine, che tocca 32 punti con numeri interi x e coordinate y. Suggerimento: cerca un numero che può essere espresso come la somma di due quadrati in diversi modi. Risposta: ci sono due terne pitagoriche con ipotenusa 25: 152 202 252, 72 242 252 20 cedere tali punti reticolari ci sono 22 diverse terne pitagoriche con ipotenusa 5.525 questo porta a 180 punti reticolo. 27.625 è il raggio più piccolo che tocca più di 64. 154.136.450 ha 35 terne pitagoriche. poteri perfette. Scrivi un PerfectPower. java programma per stampare tutti i poteri perfette che possono essere rappresentati come 64 bit interi long: 4, 8, 9, 16, 25, 27. Un potere perfetto è un numero che può essere scritta come ab per gli interi a e b ge 2. addizioni in virgola mobile. Aggiungere i numeri in virgola mobile N, evitando l'errore di arrotondamento. Eliminare più piccolo due: aggiungere due tra di loro, e reinserire. First-fit per l'imballaggio bin. 1710 OPT 2, 119 OPT 4 (più basso). Utilizzare albero torneo max in cui i giocatori sono N cassonetti e il valore della capacità disponibile. Stack con MinMax. Progettare un tipo di dati che supporta la spinta, pop, dimensione, min e max (dove min e max sono il minimo e massimo di elementi nello stack). Tutte le operazioni devono prendere tempo costante nel caso peggiore. Suggerimento: associare ad ogni ingresso dello stack minimo e massimo di elementi attualmente in pila. Coda con MinMax. Progettare un tipo di dati che supporta enqueue, dequeue, dimensione, min e max (dove min e max sono il minimo e massimo di elementi nella coda). Tutte le operazioni devono prendere tempo ammortizzato costante. Suggerimento: fare l'esercizio precedente e simulare una coda con due pile. 2i 5j. numero di stampa della forma 2i 5j in ordine crescente. mucchio min-max. Progettare una struttura dati che supporta minimo e massimo in tempo costante, inserire, eliminare min ed eliminare max in tempo logaritmico mettendo gli elementi in un singolo array di dimensione N con le seguenti proprietà: La matrice rappresenta un albero binario completo. La chiave in un nodo a un livello ancora è inferiore (o uguale a) le chiavi del suo sottoalbero chiave in un nodo a un livello dispari è maggiore (o uguale a) le chiavi nel suo sottoalbero. Si noti che il valore massimo viene memorizzato nella radice e il valore minimo è memorizzato in una delle radici children. Solution. Min-max Cumuli e code di priorità generalizzate gamma di query minima. Data una sequenza di N elementi, un intervallo di query minima dall'indice i a j è l'indice dell'elemento minimo tra i e j. Progettare una struttura di dati che preprocessa la sequenza di N elementi in tempo lineare per supportare le query minimi gamma in tempo logaritmico. Dimostrare che un albero binario completo di N nodi ha esattamente soffitto (N2) nodi foglia (nodi senza figli). Max-oriented coda di priorità min. Qual è l'ordine della crescita del tempo di esecuzione di trovare una chiave minimo in un mucchio massima oriented binario. Soluzione. linearmdashthe chiave minima potrebbe essere in una qualsiasi delle soffitto (N2) nodi foglia. Max-oriented coda di priorità min. Progettare un tipo di dati che supporta inserire e rimuovere del massimo in tempo logaritmico con entrambi max un min in tempo costante. Soluzione. Creare un mucchio binario max-oriented e anche archiviare la chiave inserita minima finora (che non potrà mai aumentare a meno che questo mucchio diventa vuoto). KTH più grande voce maggiore di x. Dato un mucchio binario massima orientato, progettare un algoritmo per determinare se la voce più k-esimo è maggiore o uguale a x. Il vostro algoritmo dovrebbe essere eseguito in tempo proporzionale a k. Soluzione. se la chiave nel nodo è maggiore o uguale a x, ricorsivamente verificare sia la sottostruttura sinistra e sottoalbero destro. Fermarsi quando il numero di nodi esplorata è pari a k (la risposta è sì) o non ci sono più nodi da esplorare (no). kth più piccolo elemento in un mucchio binario min-oriented. Progettare un algoritmo di log k k per trovare il k-esimo più piccolo elemento in un mucchio H binario min-oriented contenente N elementi. Soluzione. Costruire un nuovo heap H. min-oriented Non modificheremo H. Inserire la radice di H in H insieme con il suo indice di cumulo 1. Ora, più volte eliminare l'elemento minimo di x in H e inserire H i due figli di x da H . l'elemento KTH cancellato dal H è l'elemento più piccolo kth in H. coda randomizzato. Implementare un RandomQueue in modo che ogni operazione è garantito per prendere tempo al massimo logaritmico. Hint. potete permettervi di matrice raddoppio. In nessun modo semplice con liste collegate per individuare un elemento casuale a O (1) tempo. Invece, usare un albero binario completo di collegamenti espliciti. coda FIFO con delezione casuale. Implementare un tipo di dati che supporta le seguenti operazioni: inserire un elemento. eliminare l'elemento che è stato meno di recente aggiunto. ed eliminare un elemento casuale. Ciascuna operazione dovrebbe richiedere (al massimo) tempo logaritmico nel caso peggiore. Soluzione. Utilizzare un albero binario con i collegamenti espliciti assegnare la priorità intero lungo i per l'i-esimo elemento aggiunto alla struttura di dati. Top somme k di due array ordinati. Dato due array ordinati a e b, ciascuna di lunghezza N, trova la più grande k somme di forma Ai Bj. Hint. Utilizzando una coda di priorità (simile al problema taxi), è possibile ottenere un algoritmo O (k log N). Sorprendentemente, è possibile farlo in O (k) tempo, ma l'algoritmo è complicata. Analisi empirica di costruzione mucchio. confrontare empiricamente la bottom-up costruzione mucchio tempo lineare rispetto al ingenuo linearitmico tempo top-down costruzione mucchio. Assicurarsi di comprae sopra una catena di valori di N. LaMarca e rapporto Ladner che a causa della cache di località, l'algoritmo ingenuo può eseguire meglio, in pratica, che l'approccio più intelligente per grandi valori di N (quando il cumulo non è più adatta in cache) anche se quest'ultimo esegue molte meno confronta e gli scambi. Analisi empirica dei cumuli più vie. confrontare empiricamente le prestazioni dei cumuli 2- 4 e 8 vie. LaMarca e Ladner suggeriscono diverse ottimizzazioni, tenendo conto degli effetti di caching. Analisi empirica di heapsort. confrontare empiricamente la performance del 2- 4 e 8 vie Heapsort. LaMarca e Ladner suggeriscono diverse ottimizzazioni, tenendo conto degli effetti di caching. La loro dati indicano che un ottimizzato (e la memoria a punto) a 8 vie heapsort possono essere due volte più veloce Heapsort classico. Heapify per inserimenti. Si supponga di tobulid una mucchio binario sui tasti N ripetutamente inserendo la chiave successiva nel mucchio binario. Mostrano che il numero totale di confronto è al massimo risposta. il numero di confronto è al massimo lg lg 1 2. lg N lg (N) N lg N. heapify limite inferiore. (Gonnet e Munro) Dimostrare che qualsiasi algoritmo a base di confronto per la costruzione di un mucchio binario sui tasti N vogliono almeno 1,3644 N nel caso peggiore. Risposta . usare un argomento teorico informazioni, ala di smistamento limite inferiore. Ci sono N possibili cumuli (permutazione degli interi N) su N chiavi distinte, ma ci sono molti cumuli che corrispondono allo stesso ordine. Per esempio, ci sono due cumuli (C A B e C B A), che corrispondono ai 3 elementi aLets immaginare abbiamo un array di interi in questo modo: la media è ottenuta con la seguente formula A (1n) xi (con i 1 a n). Quindi: X1n X2N. xnn Dividiamo il valore corrente per il numero di valori e aggiungere il risultato precedente al valore restituito. La firma ridurre metodo è la funzione di ridurre di callback accetta i seguenti parametri: p. Risultato del calcolo precedente c. Valore attuale (dall'indice corrente) i. elementi di un array attuale valore di indice a. L'attuale Array ridotta Il secondo parametro è riduce il valore di default. (Utilizzato in caso la matrice è vuota). Così la media ridurre metodo sarà: Se si preferisce è possibile creare una funzione separata e poi semplicemente riferimento alla firma del metodo di callback o aumentare direttamente il prototipo Array. La sua possibile dividere il valore ogni volta che il metodo di ridurre viene chiamato. O ancora meglio. con il metodo precedentemente definito Array. protoype. sum (), ottimizzare il processo mia chiamando la divisione solo una volta :) Poi su qualsiasi oggetto Array del campo di applicazione: NB: una matrice vuota con un desiderio di ritorno Nan è più corretto di 0 a mio punto di vista e può essere utile in particolare ingresso uso cases.1.5 e uscita in questa sezione estendiamo l'insieme di astrazioni semplici (ingresso a linea di comando e di uscita standard) che abbiamo usato come interfaccia tra i nostri programmi Java e l'esterno mondo ad includere standard input. disegno standard. e audio standard. standard input rende conveniente per noi di scrivere programmi che elaborano quantità arbitrarie di input e di interagire con i nostri programmi di trazione standard rende possibile per noi di lavorare con la grafica e audio standard aggiunge suono. veduta panoramica. Un programma Java prende valori di input dalla riga di comando e stampa una stringa di caratteri come output. Per impostazione predefinita, entrambi gli argomenti della riga di comando e standard output sono associati a un'applicazione che prende i comandi, che ci riferiamo a come la finestra del terminale. Ecco alcune istruzioni per utilizzare la riga di comando nel sistema. gli argomenti della riga di comando di Windows Mac middot middot Linux. Tutte le nostre classi hanno un metodo main () che prende un array di stringhe args come argomento. Questo array è la sequenza di argomenti della riga di comando che abbiamo tipo. Se si intende per un argomento per essere un numero, dobbiamo usare un metodo come Integer. parseInt () per convertire da stringa al tipo appropriato. Uscita standard. Per stampare i valori di uscita nei nostri programmi, abbiamo usato System. out. println (). Java invia i risultati di un flusso astratto di personaggi noti come standard output. Per impostazione predefinita, il sistema operativo si collega lo standard output alla finestra del terminale. Tutto l'uscita nei nostri programmi finora è stato che compare nella finestra del terminale. RandomSeq. java utilizza questo modello: Ci vuole una riga di comando argomento n e stampe standard output una sequenza di numeri casuali n compreso tra 0 e 1. Per completare il nostro modello di programmazione, si aggiungono i seguenti librerie: input standard. Leggi numeri e stringhe da parte dell'utente. disegno standard. Grafica trama. audio standard. Creare un suono. Uscita standard. metodi Javas System. out. print () e System. out. println () implementano l'astrazione standard output di base di cui abbiamo bisogno. Tuttavia, per il trattamento standard input e output standard in modo uniforme (e per fornire alcuni miglioramenti tecnici), utilizziamo metodi simili che sono definiti nella nostra biblioteca StdOut: Javas print () e println () I metodi sono quelli che avete stato usando. Il metodo printf () ci dà più controllo sull'aspetto dell'output. Principi basilari di stampa formattato. Nella sua forma più semplice, printf () accetta due argomenti. Il primo argomento è chiamata la stringa di formato. Esso contiene una specifica di conversione che descrive come il secondo argomento deve essere convertito in una stringa per l'output. stringhe di formato cominciano con e terminano con un codice di conversione uno-lettera. La tabella seguente riassume i codici più frequentemente utilizzati: stringa di formato. La stringa di formato può contenere caratteri oltre a quelli per la specifica di conversione. The conversion specification is replaced by the argument value (converted to a string as specified) and all remaining characters are passed through to the output. Multiple arguments. The printf() function can take more than two arguments. In this case, the format string will have an additional conversion specification for each additional argument. Here is more documentation on printf format string syntax. Standard input. Our StdIn library takes data from a standard input stream that contains a sequence of values separated by whitespace. Each value is a string or a value from one of Javas primitive types. One of the key features of the standard input stream is that your program consumes values when it reads them. Once your program has read a value, it cannot back up and read it again. The library is defined by the following API: We now consider several examples in detail. 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. 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. Tutti i diritti riservati.
No comments:
Post a Comment