salve, volevo chiedere se esisteva un modo per trovare il numero massimo (o minimo) in un array più veloce che quello di confrontare uno per uno i valori. Grazie ![]()
1) You can keep the array sorted
2) Use a hash table instead of an array
3) Use a binary tree instead of array (heap)
- È possibile mantenere l'array ordinato
- Utilizzare una tabella di hash invece di un array
- Utilizzare un albero binario invece di array (heap)
Come ti ha suggerito robtillaart, se tu hai l'array ordinato (in una delle possibili forme), ovvero in cui ogni elemento è più grande del suo precedente e più piccolo del suo successivo, allora SI, si può fare una "ricerca dicotomica" che è molto veloce (bastano log2(numero_elementi) tentativi) altrimenti ... purtroppo no ... ![]()
Guglielmo
scusa l'ignoranza, ma in che senso
(in una delle possibili forme)
? A me arrivano dei dati da un sensore e li inserisco in un array... :~
If you add the data from the sensor to the array put them in the sorted place.
The preferred algorithm is insertion sort
Se si aggiungono i dati dal sensore alla matrice metterli nel posto ordinato.
L'algoritmo preferito è insertion sort
(cercando di imparare un po 'di italiano)
@ robtillaart : ... just to improve your Italian, for one-dimensional array (like this one) in Italian you use "vettore", for multidimensional array you use "matrice" ![]()
Anyway, your Italian is already quite good XD
@ federico99 : ... o li inserisci in modo ordinato con l'algoritmo che ti ha indicato robtillaart e che trovi descritto anche QUI, o c'è poco da fare ... ![]()
Guglielmo
Federico99:
scusa l'ignoranza, ma in che senso(in una delle possibili forme)
? A me arrivano dei dati da un sensore e li inserisco in un array... :~
Scusa ma se i dati li ricevi da un sensore, allora mettili pure nell'array, ma usa una variabile di appoggio myMin o myMax dove ogni volta che ricevi il dato lo confronti con questa variabile.
esempio se dato < myMin allora myMin=dato ovvero in myMin avrai sempre il minore fino a quel momento.
myMin deve partire con un valore massimo (per interi senza segno 32768)
myMax deve partire con un valore minimo (per interi senza segno 0)
[off topic]
Anyway, your Italian is already quite good
Thanks,
To be honest it is google translate I use, and by reading translations I pick up words.
When reading italian (or other language) with a technical question I feel like I understand the question without knowing the words. Recognition of the tech terms I guess.
Grazie
Ad essere onesti è google translate io uso, e leggendo le traduzioni prendo parole.
Quando si legge italiana (o altra lingua) con una domanda tecnica mi sento come se avessi capito la domanda senza conoscere le parole. Riconoscimento dei termini tecnici credo.
penso che proverò ad usare per prima cosa il metodo di nid, che mi sembra il piu semplice...
Grazie comunque a tutti, vi anticipo che nel mio progetto c'è ancora una parte che non riesco a "codificare"
, quindi aspettatevi ancora una domandina ![]()
Federico99:
penso che proverò ad usare per prima cosa il metodo di nid, che mi sembra il piu semplice...
Se, mano mano che leggi, devi solo identificare il valore maggiore/minore ... sicuramente SI, se invece le ricerche le devi fare poi in un secondo tempo, allora NO. XD
Guglielmo
allora per spiegarvi meglio vi illustro il codice... Sembra funzionare ![]()
#include <Ultrasonic.h>
#define TRIGGER_PIN 10
#define ECHO_PIN 7
Ultrasonic ultrasonic(TRIGGER_PIN, ECHO_PIN);
int intervallo = 105; // ca 10°
float cmMsec;
long microsec;
int distanceDx[8];
int myMin = 2000;
void setup()
{
Serial.begin(9600);
pinMode(3,OUTPUT);
pinMode(11,OUTPUT);
pinMode(12,OUTPUT);
pinMode(13,OUTPUT);
pinMode(8,OUTPUT);
pinMode(9,OUTPUT);
}
void loop()
{
for(int i = 0; i <= 8; i++)
{
digitalWrite(8,LOW);
digitalWrite(9,LOW); //Sblocca i motori
digitalWrite(12,LOW);
digitalWrite(13,HIGH); //Direzione Dx
analogWrite(3,100);
analogWrite(11,100); //Avanti
delay(intervallo);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH); //Blocca i motori
microsec = ultrasonic.timing();
cmMsec = ultrasonic.convert(microsec, Ultrasonic::CM);
distanceDx[i] = cmMsec;
myMin= min(distanceDx[i], myMin);
delay(intervallo);
}
delay(3000);
for(int n=0; n<8; n++)
{
Serial.println(distanceDx[n]);
}
Serial.print(myMin);
while(millis()>1)
{
}
}
Appoggio l'idea di nid69. Visto che i dati ti arrivano durante l'esecuzione, ciò che ti suggerisce è molto valido.
Parlando di array in generale, se i dati da analizzare sono pochi si fa prima a fare una scansione dell'array che mettersi a fare altre operazioni preliminari, come ad esempio l'ordinamento, che invece in termini di prestazioni è quasi indispensabile se i dati sono molti e non ordinati.