Please ignore secret bonuses. Secret tests do NOT award bonus. Max hw grade is 30+2 bonus efficiency

Do you need help?

Notice Board

Per partecipare al corso di Fondamenti di programmazione 2023-24 loggatevi e attivatelo nella vostra pagina dei corsi preferiti. A quel punto il corso appare nel menù personale cliccando sul proprio avatar. Per i materiali degli anni precedenti seguite lo stesso metodo.

To join the Programming/Lab 2023-24 course, log-on and select it on the my courses page. It will appear on the personal menu of your avatar. For earlier years use the same method.

ottimizzazione es2

e
el_libregome (870 points)
11 35 43
in Es2 by (870 points)
closed by
qualcuno sa come ottimizzare i tempi del secondo esercizio? utilizzo un ciclo per scorrere i valori da 1 a n, un ciclo per individuare quali siano i divisori di un 'n' numero.

I valori di cui calcolare i divisori sono scelti in base alle lampadine accese: se sono accese li salto.

con i divisori invece: se è accesso lo spengo(lo tolgo dalla lista della lampadine accese); se è spento lo accendo(lo aggiungo alla lista delle lampadine accese)

i divisori sono calcolati fino alla radice quadrata

i valori di cui ho calcolato i divisori di volta in volta sono stati inseriti nella lista che viene mandata in ouyput.

non saprei come migliorare la cosa. grazie in anticipo per le risposte.
953 views
closed with the note: answered

3 Answers

a.capobianco1 (16770 points)
14 54 165
by (16.8k points)
Beh. La strategia è proprio quella. Il discorso cambia in base al modo in cui la altrui ad esempio:
- usi dizionari?
- come calcoli i divisori?
e
el_libregome (870 points)
11 35 43
by (870 points)
edited by
uso un ciclo for che aggiunge ad una lista, se la divisione è zero, sia il numero che lo divide sia il numero che si ottiene: cosi ottengo i due valori in una volta
e
el_libregome (870 points)
11 35 43
by (870 points)
poi li metto in un'insieme per evitare il problema delle molteplicità
jef (4930 points)
1 2 16
by (4.9k points)
Non ti conviene cercare i divisori da 1 ad N considerando che il divisore più grande sarà al più N/2 se N non è dispari. Già così hai dimezzato il numero di volte che devi cercare i numeri.

È ancora più conveniente cercare i divisori utilizzando la radice. Considera N = x*y : ciò significa che hai due divisori, x e N/x (ovvero y).

Edit: ho letto male io mi sa
e
el_libregome (870 points)
11 35 43
by (870 points)
i divisori gia li cerco tra 1 e radice ddel numero
jef (4930 points)
1 2 16
by (4.9k points)
Hai provato ad usare un insieme al posto di una lista per tener traccia delle lampadine accese o spente? Sperimentando mi è sembrato più veloce.
e
el_libregome (870 points)
11 35 43
by (870 points)
può ridurre i tempi?
jef (4930 points)
1 2 16
by (4.9k points)
In genere i set sono molto più veloci delle liste in determinate operazioni, ad esempio per vedere se x è in set.
e
el_libregome (870 points)
11 35 43
by (870 points)
ah okay perfetto. grazie mille
VincenzoImperati (6290 points)
6 15 58
by (6.3k points)
Se hai già ottimizzato la ricerca dei divisori, se lavori con delle liste cambia approccio è prova insiemi o dizionari
e
el_libregome (870 points)
11 35 43
by (870 points)
cambia notevolmente a livello di tempi?
VincenzoImperati (6290 points)
6 15 58
by (6.3k points)
Si assolutamente. Prova ad usare dizionari o insiemi non solo per trovare divisori ma anche nel codice al posto delle liste
e
el_libregome (870 points)
11 35 43
by (870 points)
tu hai usato questa opzione? e rientri nei tempi?
VincenzoImperati (6290 points)
6 15 58
by (6.3k points)
Mezzo secondo tutto. Prova e vedrai
e
el_libregome (870 points)
11 35 43
by (870 points)
ah okay ora provo.
speriamo bene.
 grazie mille