Complessità algoritmo in C

di il
17 risposte

17 Risposte - Pagina 2

  • Re: Complessità algoritmo in C

    L'approccio completamente differente
    che avevo preannunciato prima
    per valori sufficientemente grandi di n nessun approccio è veloce, si tratta di trovarne il meno peggio

    e qui ho idea alternativa
    non ci sono molte alternative al calcolo di tutte le distanza per tutte le coppie di punti, purtroppo
    però la cosa si può fare magari in due passi:
    prima calcolo tutte le differenze nei due assi e ne carico un vettore (un vettore di punti, struct a due membri oppure due vettori paralleli, non mi interessa)
    duplico questo vettore e riordino, una copia secondo l'asse x e l'altra secondo l'asse y

    a questo punto ho due vettori di differenze in x e y, che mi serviranno per calcolare la distanza tra i punti
    ciclo uno dei due vettori (quale non importa) e NON calcolo la distanza, ma mi tengo la somma dei due quadrati (non termino Pitagora, ma uso il quadrato della distanza), chiamiamola "quadro"
    ma, e qui viene la novità, non la cerco in un vettore di quadrati di distanze
    applico la teoria dei numeri e (adesso non entro nei dettagli, che mi ricordo abbastanza poco, ma non importa: casomai si cerca)
    dicevo: applico la teoria dei numeri e vedo se e quante maniere ci sono per suddividere "quadro" in somme di due quadrati
    ogni numero intero positivo è suddivisibile in somma di 4 quadrati, ma ci sono altre possibili suddivisioni
    in particolare si può trovare il "numero" di possibili suddivisioni in due quadrati e le suddivisioni stesse
    siccome quadro "è" la somma di due quadrati sono sicuro che almeno una maniera per esprimelo in somme di due quadrati esiste, ma se la teoria dei numeri ci dicesse che ne esiste solo una mollo tutto e "so per certo" che non ci sono altre coppie di punti che hanno la stessa distanza della coppia in esame
    se invece trovassi che esistono più soluzioni le cerco,e per ogni soluzione uso i due vettori per cercare il più basso tra il valore x o il valore y
    il più basso evidentemente per ridurre i tempi di ricerca
    se lo trovo e anche l'altro asse corrisponde ........
    ho trovato due scomposizioni in somme di due quadrati differenti dello stesso numero, ovvero due coppie di punti tra di loro alla stessa distanza

    questo metodo sarebbe effettivamente più veloce di altri?
    ai posteri l'ardua sentenza, ma considerando che l'analisi della scomposizione mi permette di non cercare nemmeno i candidati che non possono avere soluzione, forse, per numeri abbastanza grandi, converrebbe

    ah, e per soprammercato ci aggiungo anche che ordinando i due vettori di differenze di due assi, se per caso trovo direttamente le stesse coppie di numeri evito del tutto di fare il resto dei calcoli
  • Re: Complessità algoritmo in C

    @StadardOil, lo so che non mi leggi MA ogni tanto anche tu c'azzecchi qualcosa
    a) inverto l'ordine: calcolo la distanza, controllo che non sia uguale ed eventualmente la inserisco nel vettore

    b) tengo il vettore ordinato, cosa che mi permetterà di cercare la prossima distanza calcolata con una ricerca dicotomica invece che con un semplice scorrimento, al prezzo di un continuo "riordinamento parziale" del vettore ho un forte alleggerimento della ricerca

    c) quando cerco una distanza, se non la trovo sono almeno già nel punto del vettore dove devo inserirla, questo ammetto sia un po' una banalità, discende del punto b), ma io sono dell'idea che "tutto fa brodo",
    ma quella che spero essere la vera differenza è un'altra

    d) pre-ordino il vettore dei punti (ok, ok, i vettori delle due coordinate, ma io ragiono come se fosse un singolo vettore di punti)
    perché ne effettuo un pre-ordinamento?

    e) ho pensato che la distanza tra due punti è "non maggiore" della somma delle distanze dei due punti dall'origine degli assi
    da questo discende che il valore massimo delle distanze è tanto più basso tanto i punti sono vicini all'origine degli assi
    da questo discende che la probabilità di trovare distanze basse è tra i punti vicini all'origine... da adesso li chiamo punti "bassi"
    se i punti sono distribuiti casualmente la probabilità di avere "doppioni" di distanze (credo, non ho una dimostrazione formale di questo) scende con l'aumentare della distanza dall'origine degli assi (in soldoni: è più facile trovare doppioni se i numeri sono piccoli)
    e quindi io testo per primi i punti bassi, sperando che mi vada bene
    ultimo (ma poi magari ne trovo ancora) trucco:

    f) tengo traccia del massimo (e magari del minimo) valore finora trovato, con un semplice test "prima" di cominciare la ricerca nell'array so già se per caso ho sforato il massimo, e siccome mi aspetto che i valori (dopo aver pre-ordinato i punti) mi si presentino tendenzialmente in salita (dai punti bassi ai punti alti), spero di poter abbastanza spesso, evitare proprio la ricerca nell'array e limitarmi ad aggiungere in fondo
    a) giusto,
    b) corretto, MA non consideri il COSTO dell'inserimento: devi spostare un blocco di dati si una cella verso il basso. Fare una copia NON COSTA ZERO, anzi, se vogliamo, COSTA DI PIU' di un semplice confronto, perche' il confronto e' tra valori che probabilmente sono gia' nei registri della CPU, mentre SICURAMENTE leggere una cella di memoria e riscriverla costa moooolti piu' cicli di clock
    c) perfetto
    d) non serve perche' d.1) non esiste il concetto di ordine TOTALE in 2 o piu' dimensioni, d.2) da nessuna parte c'e' scritto che i punti piu' vicini debbano essere necessariamente vicini allo zero
    e) quasi: e.1) stai enunciando, in modo poco ortodosso,la priprieta' "triangolare" di una distanza, in cui i punti sono A, B, e O (origine)
    e.2) TUTTO questo ragionamenti non ha senso. Ad esempio (1000,3000) e (1000, 3001) sono molto vicini tra loro ma sono MOLTO DISTANTI dall'origine. OVVIAMENTE le speranze vengono SEMPRE disattese: Lege di Murphy

    Ed ora la svista:

    f) l'autore sta cercando DUE DISTANZE UGUALI, NON due punti vicini!
  • Re: Complessità algoritmo in C

    Questo approccio NON FUNZIONA!

    StandardOil ha scritto:


    ...
    1) applico la teoria dei numeri e (adesso non entro nei dettagli, che mi ricordo abbastanza poco, ma non importa: casomai si cerca)
    2) dicevo: applico la teoria dei numeri e vedo se e quante maniere ci sono per suddividere "quadro" in somme di due quadrati
    3) ogni numero intero positivo è suddivisibile in somma di 4 quadrati, ma ci sono altre possibili suddivisioni
    4) in particolare si può trovare il "numero" di possibili suddivisioni in due quadrati e le suddivisioni stesse
    ...
    Mi dispiace ancora che non leggerai la risposta, ma, senza offesa, qui stai intrando in un mondo che non conosci affatto.

    Fondamentalmente NON TI STAI MINIMAMENTE RENDENDO CONTO della COMPLESSITA' COMPUTAZIONALE di quello che stai dicendo e della complessita' degli algoritmi coinvolti:

    Stiamo parlando di
    1) numeri primi
    2) fattoriali
    3) fattorizzazione di un numero in numeri primi
    4) calcolo in precisione arbitraria

    Per la questione della somma dei 4 quadrati

    https://it.wikipedia.org/wiki/Teorema_dei_quattro_quadrati

    e' una CONGETTURA, non ancora dimostrata.
    Oltre al fatto che trovare questi quattro quadrati e' NON E' CERTO una passeggiata.
    questo metodo sarebbe effettivamente più veloce di altri?
    Un uomo potrebbe soppravivere nello spazio SENZA tuta spaziale?
    Serve chiederlo? E serve rispondere?
Devi accedere o registrarti per scrivere nel forum
17 risposte