Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Ecovacs Goat O1200 LiDAR Pro: la prova del robot tagliaerba con tagliabordi integrato
Ecovacs Goat O1200 LiDAR Pro: la prova del robot tagliaerba con tagliabordi integrato
Nuova frontiera per i robot tagliaerba, con Ecovacs GOAT O1200 LiDAR Pro che riconosce l'ambiente in maniera perfetta, grazie a due sensori LiDAR, e dopo la falciatura può anche rifinire il bordo con il tagliabordi a filo integrato
Recensione Samsung Galaxy S26+: sfida l'Ultra, ma ha senso di esistere?
Recensione Samsung Galaxy S26+: sfida l'Ultra, ma ha senso di esistere?
Equilibrio e potenza definiscono il Samsung Galaxy S26+, un flagship che sfida la variante Ultra e la fascia alta del mercato con il primo processore mobile a 2nm. Pur mantenendo l'hardware fotografico precedente, lo smartphone brilla per un display QHD+ da 6,7 pollici d'eccellenza, privo però del trattamento antiriflesso dell'Ultra, e per prestazioni molto elevate. Completano il quadro la ricarica wireless a 20W e, soprattutto, un supporto software settennale
Zeekr X e 7X provate: prezzi, autonomia fino a 615 km e ricarica in 13 minuti
Zeekr X e 7X provate: prezzi, autonomia fino a 615 km e ricarica in 13 minuti
Zeekr sbarca ufficialmente in Italia con tre modelli elettrici premium, X, 7X e 001, distribuiti da Jameel Motors su una rete di 52 punti vendita già attivi. La Zeekr X parte da 39.900 euro, la 7X da 54.100: piattaforma a 800V, chip Snapdragon di ultima generazione, ricarica ultraveloce e un'autonomia dichiarata fino a 615 km WLTP. Le prime consegne sono previste a metà aprile
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 27-08-2009, 20: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 12:19.
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 27-08-2009, 23:38   #2
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2788
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 : 27-08-2009 alle 23:45.
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 28-08-2009, 01: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, 11:46   #4
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2788
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, 12: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, 18: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, 20: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, 00:13   #8
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2788
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, 01: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, 07: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, 12: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


Ecovacs Goat O1200 LiDAR Pro: la prova del robot tagliaerba con tagliabordi integrato Ecovacs Goat O1200 LiDAR Pro: la prova del robot...
Recensione Samsung Galaxy S26+: sfida l'Ultra, ma ha senso di esistere? Recensione Samsung Galaxy S26+: sfida l'Ultra, m...
Zeekr X e 7X provate: prezzi, autonomia fino a 615 km e ricarica in 13 minuti Zeekr X e 7X provate: prezzi, autonomia fino a 6...
Marathon: arriva il Fortnite hardcore Marathon: arriva il Fortnite hardcore
HP Imagine 2026: abbiamo visto HP IQ all’opera, ecco cosa può (e non può) fare HP Imagine 2026: abbiamo visto HP IQ all’opera, ...
Le 10 migliori offerte Amazon di Pasqua:...
Nuove fotografie dagli astronauti di Art...
La toilette della capsula Orion Integrit...
GeForce NOW: ecco tutte le novità in arr...
Il Realme 16 5G debutta sul mercato glob...
HONOR svela tre nuovi tablet: il più int...
Tineco Floor One S9 Master: aspira e pul...
Vivo X300 Ultra, il lancio globale è ini...
Offerte robot aspirapolvere Amazon: ECOV...
L'AI genera codice in 8 minuti e i senio...
Ring Intercom Audio a 44,99€ su Amazon: ...
Apple iPhone 16 crolla a 689€: ecco perc...
Google Pixel 9 a 449,90€ con caricatore ...
Ecco la top 7 delle offerte Amazon, aggi...
Ex ingegnere ammette il sabotaggio: migl...
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: 22:05.


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