Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    Miglior algoritmo per filtrare valori array in base ad altro array

    Ciao a tutti

    Il mio problema riguarda il miglior modo di filtrare i valori di un array in base a quelli di un altro array con strpos. In poche parole devo eliminare da array2 tutte le stringhe che "contengono" una delle stringhe presenti in array1.

    Ho scritto un classico codice con due foreach uno dentro l'altro che per ogni elemento di array1 scorre array2 confrontando i valori con strpos. Mi chiedevo se esistesse un metodo migliore (piu' veloce, meno pesante) per fare la stessa operazione. Ci sono vantaggi a usare, ad esempio, array_filter() o array_walk() per questo scopo?

    Grazie!

  2. #2
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,372
    Devi eliminare tutta la stringa oppure solo la parte che combacia con quella del primo array ?
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  3. #3
    Lo scopo e' quello di ottenere una lista di stringhe "bonificate" (si tratta di keyword) quindi in caso di match elimino l'intero elemento.

    Ho trovato questo interessante articolo da cui si evince che per piccoli array non c'e' praticamente differenza mentre per grandi array foreach sembra essere il metodo piu veloce: https://leve.rs/blog/benchmark-analy...p-array-loops/

  4. #4
    Giusto per dare un'idea delle dimensioni (e del motivo per cui sto cercando di ottimizzare), in media lo script deve processare 160 milioni di iterazioni (ad esempio per comparare un file da 1000 KWs con uno da 160k). Di solito, girando in locale su un computer non potentissimo, ci impiega circa 15-16 minuti.

  5. #5
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,372
    1000 KWs stanno per 1.000.000 di parole e 160 k per 160.000 parole ?
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  6. #6
    Dovendo in ogni caso scorrere completamente due array di N ed M elementi credo sia impossibile individuare un algoritmo con complessità inferiore a O(N x M)
    Andrebbero piuttosto riviste le strutture dati.
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  7. #7
    @badaze

    No, KWs starebbe per keywords.


    @satifal


    No, certo. Pensavo potesse esserci qualche vantaggio a usare funzioni interne di PHP invece di due cicli, come spesso accade per altre operazioni. In che senso andrebbero riviste le strutture dati?

  8. #8
    Quote Originariamente inviata da scitrek Visualizza il messaggio

    @satifal


    No, certo. Pensavo potesse esserci qualche vantaggio a usare funzioni interne di PHP invece di due cicli, come spesso accade per altre operazioni.
    Qualsiasi funzione interna del PHP, per quanto ottimizzata, dovrebbe comunque scorrere l'eventuale o gli eventuali array portando in ogni caso la complessità ad O(N^2)


    Quote Originariamente inviata da scitrek Visualizza il messaggio
    In che senso andrebbero riviste le strutture dati?
    Se ti ritrovi a dover scorrere due array per individuare le stringhe da scartare probabilmente sarebbe opportuno intervenire a monte, ma non conoscendo la logica del tuo applicativo non posso esserti d'aiuto in tal senso.
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  9. #9
    Certo, la complessità è uguale, ma in genere le funzioni interne, non basandosi su un linguaggio interpretato, sono più veloci e meglio ottimizzate, no? Voglio dire, è più efficiente un preg_replace() o una sua emulazione in PHP?

    Purtroppo non è che ci sia molta logica, lo scopo dell'applicativo è quello di prendere due liste di keyword ed eliminare dalla seconda tutte le keyword che contengono al loro interno keyword presenti nella prima. Al momento lo faccio verificando le stringhe tramite stripos() ma sto cercando anche un modo che mi permetta di individuare keyword intere all'interno delle stringhe della seconda lista (ad esempio, far si che "posa" venga individuato in "lunga posa" ma non in "mariposa").

  10. #10
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,372
    Se il primo array è composto da una sola parola e se il secondo è privo di punteggiatura allora potresti fare come da esempio senza ricorrere alle regexp.

    Codice PHP:
    <?php 
    $kw 
    = array();
    $kw[] = 'patto';
    $kw[] = 'pluto';
    $ls = array();
    $ls[] = 'l impatto è stato violente';
    $ls[] = 'il patto dei lupi';
    $ls[] = 'oddio il plutonium';
    $ls[] = 'il cane di topolino si chiama pluto in Francese';
    $count_kw count($kw);
    $count_ls count($ls);
    foreach(
    $kw as $keyword) {
     print 
    "current keyword = $keyword</br>";
     
    $keyword1 ' '.$keyword.' ';
     
    reset($ls);
     foreach(
    $ls as $key => $phrase) {
      
    $phrase1 ' '.$phrase.' ';
      if (
    $phrase1 != str_ireplace($keyword1,"",$phrase1)) {
       print 
    "&nbsp;&nbsp;<strong>scelto : '$keyword' in '$phrase'</strong><br/>";
       
    //---- scelto allora lo tolgo dalla lista
       
    unset($ls[$key]);
      } else {
        print 
    "&nbsp;&nbsp;scartato : '$keyword' in '$phrase'<br/>";
      } 
    //
     
    }
    }
    ?>
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.