Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Due mesi di Battlefield 6: dalla campagna al battle royale, è l'FPS che stavamo aspettando
Due mesi di Battlefield 6: dalla campagna al battle royale, è l'FPS che stavamo aspettando
Abbiamo giocato a lungo a Battlefield 6, abbiamo provato tutte le modalità multiplayer, Redsec, e le numerose personalizzazioni. In sintesi, ci siamo concentrati su ogni aspetto del titolo per comprendere al meglio uno degli FPS più ambiziosi della storia dei videogiochi e, dopo quasi due mesi, abbiamo tirato le somme. In questo articolo, condividiamo con voi tutto ciò che è Battlefield 6, un gioco che, a nostro avviso, rappresenta esattamente ciò che questo genere attendeva da tempo
Antigravity A1: drone futuristico per riprese a 360° in 8K con qualche lacuna da colmare
Antigravity A1: drone futuristico per riprese a 360° in 8K con qualche lacuna da colmare
Abbiamo messo alla prova il drone Antigravity A1 capace di riprese in 8K a 360° che permette un reframe in post-produzione ad eliche ferme. Il concetto è molto valido, permette al pilota di concentrarsi sul volo e le manovre in tutta sicurezza e decidere con tutta tranquillità come gestire le riprese. La qualità dei video, tuttavia, ha bisogno di uno step in più per essere competitiva
Sony Alpha 7 V, anteprima e novità della nuova 30fps, che tende la mano anche ai creator
Sony Alpha 7 V, anteprima e novità della nuova 30fps, che tende la mano anche ai creator
Dopo oltre 4 anni si rinnova la serie Sony Alpha 7 con la quinta generazione, che porta in dote veramente tante novità a partire dai 30fps e dal nuovo sensore partially stacked da 33Mpixel. L'abbiamo provata per un breve periodo, ecco come è andata dopo averla messa alle strette.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 27-08-2009, 21:13   #1
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
[Generico] Algoritmo

Salve, sto provando a risolvere questo esercizio:
Quote:
Progettare un algoritmo con tempo di esecuzione O(n log n) che, dato in input un vettore T contenente n interi (con n > 0), conti il numeri di indici i n tali che il numero di elementi in T strettamente minore di T[i] è esattamente uguale ad i. T può contenere elementi ripetuti.
Per risolverlo, ho pensato a questo algoritmo:
Codice:
algoritmo Conta(T)
{
    S = Sorted(T)

    i = 0
    count = 0

    while (i < Length[T])
    {
        j = BinarySearch(S, T[i])

        if (i = j - 1)
        {
            count += 1
        }

        i += 1
    }

    return count
}
Il mio ragionamento è il seguente: se effettuo una copia S dell'array (O(n)) ed un ordinamento della copia (O(n*log(n))), allora per ogni elemento dell'array posso fare una ricerca binaria nell'array ordinato (n * O(log(n)) = O(n*log(n))) e calcolare l'indice j in cui T[i] compare in S (e cioè per cui S[j] = T[i]). A questo punto, siccome S è ordinato, alla sua sinistra ci sono j - 1 elementi strettamente minori di T[i], per cui basta controllare che sia i = j - 1 ed incrementare il conteggio in corrispondenza.

Il problema viene quando l'array originale contiene elementi ripetuti. Ad esempio, un'array simile:
Codice:
T = [4; 5; 3; 4; 2; 0; 1]
Ordinato, diventerebbe:
Codice:
S = [0; 1; 2; 3; 4; 4; 5]
Il problema è che se viene selezionato il secondo dei due 4, il conteggio mi riporterà un numero in più del dovuto (alla sua sinistra c'è anche il primo dei 4, non solo i numeri ad esso minori). Ho pensato a tornare indietro fino alla prima posizione utile precedente a j, ma credo che alzi la complessità asintotica nel caso peggiore, se non sbaglio. Eliminare le ripetizioni, invece, darebbe risultati inesatti per i numeri più grandi (e quindi più a destra nell'array ordinato).

Qualcuno ha migliori idee?
ciao
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!

Ultima modifica di DanieleC88 : 28-08-2009 alle 13:19.
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 28-08-2009, 00:38   #2
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2782
Potresti cercare invece del valore stesso il suo precedente (tanto sono interi) e poi usare, invece del solito BinarySearch, quello che se l'elemento non è presente restituisce la posizione in cui andrebbe inserito.
Comunque hai dimenticato di incrementare i nel ciclo.

Edit: cazzata, se il valore precedente è ripetuto sei punto e a capo. Continuo a rifletterci comunque, sembra interessante

Edit2: forse ho trovato! E se il BinarySearch non si fermasse quando trova l'elemento ma solo quando la porzione esaminata è un solo elemento? Così potresti pilotare la ricerca sull'elemento più a destra (se usi la mia soluzione) oppure più a sinistra se usi la tua. Così l'algoritmo di ricerca non è più log(n) solo nel caso peggiore ma in tutti i casi ma a te questo non importa.

Ultima modifica di wingman87 : 28-08-2009 alle 00:45.
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 28-08-2009, 02:47   #3
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Quote:
Originariamente inviato da wingman87 Guarda i messaggi
Comunque hai dimenticato di incrementare i nel ciclo.
Ops, vero, correggo (inizialmente era un "per ogni i in 1..n", poi ho modificato al volo).
Quote:
Originariamente inviato da wingman87 Guarda i messaggi
Edit: cazzata, se il valore precedente è ripetuto sei punto e a capo. Continuo a rifletterci comunque, sembra interessante
Sì, e comunque non posso conoscere a priori il valore precedente, sempre ammesso che esista.
Quote:
Originariamente inviato da wingman87 Guarda i messaggi
Edit2: forse ho trovato! E se il BinarySearch non si fermasse quando trova l'elemento ma solo quando la porzione esaminata è un solo elemento? Così potresti pilotare la ricerca sull'elemento più a destra (se usi la mia soluzione) oppure più a sinistra se usi la tua. Così l'algoritmo di ricerca non è più log(n) solo nel caso peggiore ma in tutti i casi ma a te questo non importa.
Hmm, non sono sicuro di aver capito bene in che modo intendi. Una volta trovato il numero esatto, secondo quale criterio dovrei continuare la ricerca? Diciamo che, oltre una comune ricerca binaria, dovrei poi scartare gli elementi uguali andando verso sinistra o verso destra? Mi resta il dubbio sulla complessità asintotica e sulla corrispondenza degli indici. Ma magari ho solo capito male!

Intanto grazie mille della risposta: spesso quando posto dubbi amletici come questo passo piuttosto inosservata, quindi grazie già per aver impegnato il tuo tempo a rispondermi.
ciao
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 28-08-2009, 12:46   #4
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2782
Allora, quello che intendo è questo:
la ricerca binaria in genere esamina una porzione di array, controlla l'elemento centrale e poi ci sono 3 casi:
1) se l'elemento è quello cercato hai finito
2) se è minore esamini la mezza porzione destra
3) se è maggiore esamini la mezza porzione sinistra
Io dicevo di modificare il punto 1 nel seguente modo, tenendo buona la tua soluzione di cercare l'elemento stesso:
1) se l'elemento è quello cercato esamino la mezza porzione sinistra compreso l'elemento stesso.
Bisogna solo fare attenzione nella condizione di terminazione.
Il risultato alla fine dovrebbe essere la posizione dell'elemento più a sinistra.
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 28-08-2009, 13:12   #5
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Ok, ho capito, e penso che possa funzionare, rispettando anche il tempo O(log(n))... In fondo mi interessava più che altro la correttezza dell'algoritmo, e credo che ci sia. Se ti vengono in mente altre strade fammi sapere.

ciao e ancora grazie
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 28-08-2009, 19:57   #6
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Secondo me sta tutto nell'ordinamento...se fai un ordinamento in O(n log n) sei a posto.
Mi spiego meglio:

Dato T:
T = [4; 6; 3; 4; 2; 0; 1; 6]

Il vettore ordinato è:

S = [0; 1; 2; 3; 4; 4; 6; 6]

Ti scorri il vettore e nel farlo tieni conto dell'indice del primo elemento uguale all'elemento corrente. Dovrebbe bastare un semplice

index = (S[i] == S[index]) ? index : i;

Userai questo indice per vedere se la condizione è verificata. A questo punto la soluzione è banale.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 28-08-2009, 21:40   #7
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Infatti, se noti, è ciò che avevo proposto inizialmente: il problema è esattamente quello di trovare il primo numero nell'array ordinato che sia uguale al numero cercato. Una ricerca lineare darebbe un costo O(n^2), una ricerca binaria invece darebbe un costo O(n*log(n)), ma restava il problema di assicurarsi che l'elemento trovato fosse il primo utile senza alzare la complessità.

ciao
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 29-08-2009, 01:13   #8
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2782
Non sono sicuro che quello che sto per dire sia la stessa cosa che ha detto cionci perché non sono sicuro di aver capito ma leggendo il suo post mi è venuta in mente questa cosa, riprendendo l'esempio di cionci abbiamo:

Dato T:
T = [4; 6; 3; 4; 2; 0; 1; 6]

Il vettore ordinato è:
S = [0; 1; 2; 3; 4; 4; 6; 6]

ora scorri il vettore T e per ogni elemento T[i] se
Codice:
S[i]==T[i] && ( i==0 || S[i-1]!=T[i])
incrementi il contatore.
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 29-08-2009, 02:07   #9
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Hai ragione, credo che questa cosa possa funzionare, domani provo a dimostrarlo in qualche modo. Adesso non sono in grado di formulare molto ragionamenti arguti vista l'ora.

ciao
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 29-08-2009, 08:01   #10
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da DanieleC88 Guarda i messaggi
Infatti, se noti, è ciò che avevo proposto inizialmente: il problema è esattamente quello di trovare il primo numero nell'array ordinato che sia uguale al numero cercato. Una ricerca lineare darebbe un costo O(n^2), una ricerca binaria invece darebbe un costo O(n*log(n)), ma restava il problema di assicurarsi che l'elemento trovato fosse il primo utile senza alzare la complessità.

ciao
Non devi fare alcuna ricerca

E' lineare in O(n) perché, una volta ordinato, devi scorrere una sola volta il vettore.

Codice:
index = 0;
count = 0;
for(i = 0; i < n; i++)
{
  index = (S[i] == S[index]) ? index : i;
  if(verifica la condizione usando index)
     count++;
}
index ad ogni iterazione contiene l'indice del primo numero incontrato uguale al numero corrente.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 29-08-2009, 13:43   #11
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Hmm, mi sa allora che avevo letto male il tuo vecchio post. Be' essenzialmente il funzionamento è lo stesso di quello proposto ieri da wingman87, che nel frattempo ho dimostrato essere corretto.

Vi ringrazio ancora!
ciao
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Due mesi di Battlefield 6: dalla campagna al battle royale, è l'FPS che stavamo aspettando Due mesi di Battlefield 6: dalla campagna al bat...
Antigravity A1: drone futuristico per riprese a 360° in 8K con qualche lacuna da colmare Antigravity A1: drone futuristico per riprese a ...
Sony Alpha 7 V, anteprima e novità della nuova 30fps, che tende la mano anche ai creator Sony Alpha 7 V, anteprima e novità della ...
realme GT 8 Pro Dream Edition: prestazioni da flagship e anima racing da F1 realme GT 8 Pro Dream Edition: prestazioni da fl...
OVHcloud Summit 2025: le novità del cloud europeo tra sovranità, IA e quantum OVHcloud Summit 2025: le novità del cloud...
La costruzione del telescopio spaziale N...
HBO ha cancellato la produzione della se...
OpenAI ha pensato a una partnership (o a...
Starlink Mobile: SpaceX potrebbe lanciar...
Volkswagen trasforma lo stabilimento di ...
Meta AI più reattivo e imparziale...
In Cina la prima GPU discreta al mondo c...
Vertiv CoolCenter, il sistema di raffred...
Konecta entra nel Kraken BPO Partner Pro...
Un dialogo con l'AI sposta voti meglio d...
iPhone 17 al minimo storico: oggi il 256...
Gli utenti italiani scelgono ChatGPT: &e...
Anche Xiaomi avrà il suo trifold:...
È Natale in casa Tesla: arriva la...
Shai-Hulud diventa più cattivo: e...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 03:20.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v