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

Do you need help?

Problemi HW6

D
Diego Voltolini (580 points)
8 9 11
in HW6 obbligatorio by (580 points)
Ciao a tutti,

Ho un paio di problemini con il programma, dal mio fisso eseguo il test01.py e ho tutti riscontri positivi in 6 secondi.

Appena invece ho caricato il file nella apposita schermata qui, ho ottenuto un risultato abbastanza deludente, non tanto per la complessita' ciclomatica ma proprio i test passati sono soltanto 10 e gli altri errati a causa Timeout.

Sono consapevole che la macchina di correzione e' un po' lenta ma volevo capire come riuscire ad ottimizzare ancora meglio il codice.

Il "rallentamento", secondo me e' dovuto alla funzione per trovare i quadrati, al momento ricerco all' interno della griglia che ho creato ,il lato, nelle varie posizioni. Qualcuno ha dei consigli per ottimizzare questo passaggio?
873 views

9 Answers

A
Alessiorevo (1730 points)
6 6 14
by (1.7k points)
Il controllo dei quadrati devi farlo con una funzione sola e non con 2 dove una controlla i lati orizzontali e una quelli verticali, poi ti consiglio di trovare all'inizio il salto tra un punto verde e l'altro così da sapere già la posizione dei punti verdi....
Simone.A (3750 points)
15 16 26
by (3.8k points)
Ma consigli di usare un While?
s
simone.lioy (1420 points)
28 30 39
by (1.4k points)
io invece ho analizzato ogni punto verde con due for annidati e controllando ogni possibile segmento, se è formato da due segmenti allora è un lato del quadrato e mi sposto di k posizioni avanti però ora sono arrivato al punto di confronto e sono bloccato
A
Alessiorevo (1730 points)
6 6 14
by (1.7k points)
È meno performante rispetto a un for, rallenterebbe solo
s
simone.lioy (1420 points)
28 30 39
by (1.4k points)
eh lo so ma non ho altre soluzioni in mente e tra l'altro non mi esce nemmeno
AlessandraIzzo (6010 points)
6 6 30
by (6.0k points)
Fonte della lentezza del while rispetto al for..?
a
a.pietroluongo (11250 points)
20 39 131
by (11.3k points)
edited by

Penso che il for è leggermente più veloce quando ad esempio hai una variabile a e utilizzi range(a) mentre nel while hai una condizione  c<a  ed  incrementi c di 1 ogni volta.

a
a.pietroluongo (11250 points)
20 39 131
by (11.3k points)
Forse stai controllando ogni pixel di ogni segmento, basta che controlli un pixel per ogni segmento
Antares (7770 points)
5 6 41
by (7.8k points)
Se non l'hai già implementato uno dei sistemi migliori per velocizzare questo homework è di non controllare ogni pixel ma solo i pixel compresi nel range della lunghezza del lato del quadrato che si sta cercando. Ho sentito dire in chat da un ragazzo che è riuscito a passare alcuni test sostituendo i while con i cicli for, ma non ti posso confermare.
J
Jan Rogala (7260 points)
4 4 37
by (7.3k points)
Intanto il solito consiglio di metterti da una parte con carta e penna e fare passo passo quello che fa il codice, dovrebbe aiutarti a vedere se ci sono certi passaggi che sono migliorabili o addirittura inutili. Un altro è come ha consigliato il collega di trovarti la distanza tra i vari pixel verdi e saltare a sto punto da un pixel verde a un'altro. Fatto cio non ci sarà piu bisogno che ti chiedi che il pixel sai verde perchè lo sai gia. Cosi facendo solo nel primo test ti risparmi 4/5 del tempo dato che farai un controllo ogni 5 pixel. Dato che sai la distanza da un pixel verde ad un altro sai anche di quanti pixel è corrisposto un lato, di conseguenza puoi metterla come fine di un for. Spero di esserti stato utile
Tommaso Sgroi (12990 points)
10 11 91
by (13.0k points)
Basta semplicemente guardare il primo bit successivo ai tuoi pixel verdi se è rosso o nero,  salta tra un pixel e un altro usando la larghezza tra 2 pixel verdi e usa le coordinate del pixel verde in alto a sx e in basso a dx per iterare su 2 for e trovare i quadrati.
Un'altra cosa, non so se te fai così o meno, ma non c'è alcun bisogno di rimodellare la griglia. È una perdita di tempo (giusto in caso lo facessi).
P
Paoletto (1010 points)
3 4 8
by (1.0k points)
Ti conviene scorrere solo UNA volta l'immagine per intera,popolando una matrice vuota di volta in vta contente le coordinate dei verdi alla fine,e controllare per ognuna di esse la presenza di pixel rossi subito dopo,nel caso delle colonne,o subito giu nel caso delle righe.
D
DanieleZobel (600 points)
4 4 7
by (600 points)
Cerca di controllare solo la griglia, di controllare il pixel successivo al pixel verde, e usare solo i for.

In questo modo dovresti minimizzare al massimo i tempi
a
andreaamici (1740 points)
11 12 21
by (1.7k points)
il mio consiglio è in primis quello di non cercare dentro la griglia ma semplicemente capire quanto è grande questa griglia(in modo da evitare di andare out of range),il 'ritagliare la griglia porta via del tempo utile...inoltre ti suggerisco di scrivere i tutto in una funzione,in molti fanno una funzione per andare in orizzontale e un per andare in verticale..si puoò benissimo riuscire a scrivere tutto insieme..
Franciscus (6350 points)
7 14 24
by (6.4k points)
Ti consiglio di controllare solo il bit immediatamente successivo al bit verde, controlli se è rosso o nero; forse questo ti risparmia un pò di tempo sui controlli che fai.