Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi
Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi
Mate X7 rinnova la sfida nel segmento dei pieghevoli premium puntando su un design ancora più sottile e resistente, unito al ritorno dei processori proprietari della serie Kirin. L'assenza dei servizi Google e del 5G pesa ancora sull'esperienza utente, ma il comparto fotografico e la qualità costruttiva cercano di compensare queste mancanze strutturali con soluzioni ingegneristiche di altissimo livello
Nioh 3: souls-like punitivo e Action RPG
Nioh 3: souls-like punitivo e Action RPG
Nioh 3 aggiorna la formula Team NINJA con aree esplorabili più grandi, due stili di combattimento intercambiabili al volo (Samurai e Ninja) e un sistema di progressione pieno di attività, basi nemiche e sfide legate al Crogiolo. La recensione entra nel dettaglio su combattimento, build, progressione e requisiti PC
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti
La facilità di installazione e la completa automazione di tutte le fasi di utilizzo, rendono questo prodotto l'ideale per molti clienti. Ecco com'è andata la nostra prova in anteprima
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: 2787
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: 2787
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: 2787
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


Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi Recensione HUAWEI Mate X7: un foldable ottimo, m...
Nioh 3: souls-like punitivo e Action RPG Nioh 3: souls-like punitivo e Action RPG
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti Test in super anteprima di Navimow i220 LiDAR: i...
Dark Perk Ergo e Sym provati tra wireless, software via browser e peso ridotto Dark Perk Ergo e Sym provati tra wireless, softw...
DJI RS 5: stabilizzazione e tracking intelligente per ogni videomaker DJI RS 5: stabilizzazione e tracking intelligent...
Elon Musk ora guarda alla Luna: SpaceX p...
La Cina ha lanciato nuovamente lo spazio...
Blue Origin potrebbe realizzare il lande...
Artemis II: il prossimo Wet Dress Rehear...
Il nuovo HONOR 600 sta arrivando e avr&a...
La crisi delle memorie non coinvolger&ag...
Windows domina su Steam, ma molti utenti...
Per non incorrere in nuovi aumenti delle...
Cubi Z AI 8M visto da vicino, un mini-PC...
Datacenter nello Spazio, affascinante ma...
Social e minori, Butti apre al dibattito...
Tutte le offerte Amazon del weekend, sol...
Amazon spinge sull'usato garantito: 10% ...
TikTok rischia una maxi-multa in Europa:...
Bose su Amazon: QuietComfort SC over ear...
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: 20:36.


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