Indice dei tutorials: http://gheryd.blogspot.com/2011/06/javascript-gwt-tutorials.html
Utilizzando un semplice script ho implementato qualcosa di simile al Crivello di Eratostene per determinare i numeri primi fino ad un certo numero.
Questo semplice esempio ci consentirà poi di fare qualche analisi su come ottimizzare le performance di esecuzione.
Per eseguirlo basta copiare il contenuto del box in un file .html e aprirlo con il browser.
Eccovi quello che dovrebbe comparire:
Spiegazione.
Sulla funzione "onClickHandler" viene creata una tabella. Successivamente la tabella viene popolata con i numeri interi positivi fino alla cifra indicata nella textbox.
Con la funzione "isPrimeNumber" viene verificato se il numero è primo, in tal caso alla cella che viene aggiunto uno sfondo viola per evidenziare questa caratteristica.
Nella funzione "isPrimeNumber", man mano che viene richiamata, viene aggiunto nella variabile array "primes" l'eventuale numero primo.
Ottimizzazione.
Se si esegue lo script per numeri molto alti (per esempio un milione), i tempi di esecuzione potrebbe essere piuttosto lunghi.
E' possibile ottimizzare i tempi di esecuzione dello script con un controllo all'interno del ciclo che crea le celle della tabella. Infatti si potrebbe aggiungere una variabile contatore che viene azzerata quando raggiunge il valore 10. Quando la variabile assume i valori 2,4,5,6,8,10 sicuramente il numero non è primo, quindi è inutile chiamare la funzione isPrimeNumber che esegue ogni volta un ciclo su tutti i numeri primi.
Chiaramente questo controllo non deve essere fatto al primo giro. Ecco un esempio:
Utilizzando un semplice script ho implementato qualcosa di simile al Crivello di Eratostene per determinare i numeri primi fino ad un certo numero.
Questo semplice esempio ci consentirà poi di fare qualche analisi su come ottimizzare le performance di esecuzione.
Per eseguirlo basta copiare il contenuto del box in un file .html e aprirlo con il browser.
Eccovi quello che dovrebbe comparire:
<html>
<head>
<script type="text/javascript">
var primes;
function onClickHandler() {
var startTime = (new Date()).getTime();
primes = [2];
var n = parseInt( document.getElementById("endN").value );
if(isNaN(n)) {
alert("Is not a number!");
return;
}
var tbody = document.createElement("tbody");
var tr = document.createElement("tr");
tbody.appendChild(tr);
for(var i=1; i<=n; i++) {
if( i%10==1 ){
tr = document.createElement("tr");
tbody.appendChild(tr);
}
var td = document.createElement("td");
td.appendChild( document.createTextNode(i) );
td.style.border = "1px solid gray";
if( isPrimeNumber(i) )
td.style.backgroundColor = "magenta";
tr.appendChild(td);
}
var table = document.createElement("table");
table.setAttribute("cellPadding", "5");
table.appendChild(tbody);
var container = document.getElementById("container");
container.innerHTML = "";
container.appendChild(document.createTextNode("trovati: "+primes.length));
container.appendChild(document.createTextNode(" tempo [s]: "+((new Date()).getTime()-startTime)/1000 ) );
container.appendChild(table);
}
function isPrimeNumber(n) {
if(n==2) return true;
else if(n==1 || n%2==0) return false;
for(var j=0; j<primes.length; j++)
if( n%primes[j]==0 ) return false;
primes.push(n);
return true;
}
</script>
</head>
<body>
<input id="endN" name="endN" type="text" type="text" />
<br/>
<button onclick="onClickHandler()">search</button>
<div id="container"></div>
</body>
</html>
Spiegazione.
Sulla funzione "onClickHandler" viene creata una tabella. Successivamente la tabella viene popolata con i numeri interi positivi fino alla cifra indicata nella textbox.
Con la funzione "isPrimeNumber" viene verificato se il numero è primo, in tal caso alla cella che viene aggiunto uno sfondo viola per evidenziare questa caratteristica.
Nella funzione "isPrimeNumber", man mano che viene richiamata, viene aggiunto nella variabile array "primes" l'eventuale numero primo.
Ottimizzazione.
Se si esegue lo script per numeri molto alti (per esempio un milione), i tempi di esecuzione potrebbe essere piuttosto lunghi.
E' possibile ottimizzare i tempi di esecuzione dello script con un controllo all'interno del ciclo che crea le celle della tabella. Infatti si potrebbe aggiungere una variabile contatore che viene azzerata quando raggiunge il valore 10. Quando la variabile assume i valori 2,4,5,6,8,10 sicuramente il numero non è primo, quindi è inutile chiamare la funzione isPrimeNumber che esegue ogni volta un ciclo su tutti i numeri primi.
Chiaramente questo controllo non deve essere fatto al primo giro. Ecco un esempio:
var c = 1;
for(var i=1; i<=n; i++) {
...
var isPrime = (c!=i && (c%2==0 || c==5)) || isPrimeNumber(i);
if(c==10) c = 1; else c++;
if( isPrime )
td.style.backgroundColor = "magenta";
tr.appendChild(td);
}
Nessun commento:
Posta un commento