Aller au contenu

cherche "coup de pouce" pour un algo de comparaison et de tri


Sujets conseillés

Posté (modifié)

Salut à toutes les Hubeuzes et les Hubeurres,

je voudrais savoir quel est la meilleur façon de faire un algorithme de recherche/comparaison (une sorte de moteur de recherche interne au site ) sur une base de donnée assez complexe (déjà existante ) .

J'ai déjà programmé un petit moteur de recherche interne pour des chaines de caractères (avec des requêtes SQL comportant " [...] LIKE '%monString^^%' [...] " );

bref cette fois ci, le moteur de recherche de comparaison que je veux programmer est plus complexe; en effet on ne rentre aucune chaine de caractère dans un champ de saisie.

Je m'explique:

  1. c'est à dire que c'est une fonction qui prend tout dans une table de la base de donnée (SELECT * FROM ...)

    puis elle prend le champ de l' ID N°1 pour le comparer à touts les autres champs des tout les ID de cette même table pour voir si il y a compatibilité entre eux; une fois cette première comparaison finit on passe à l' ID N°2 ...et ainsi de suite (donc si il y a "n" ID dans la table , le nombre de comparaison minimum devrai être égale à " (n-1)! ")



  2. mais qu'est-ce que tu compare et que tu considère comme "compatible"
    :mad2:
    !!!
    (j'anticipe la question
    ;)
    ) : c'est une chaine de ce type : 0/1/0/2 et cette chaine est cyclique c'est à dire que 0/2/0/1 ou 1/0/2/0 ou 2/0/1/0 sont toutes le même chaines
    :wacko:
    et j'appelle 2 champs compatible si ces 2 chaines sont les mémes (ex: 0/3/1/4 = 3/1/4/0 = 1/4/0/3 = 4/0/3/1 par contre 0/3/1/4 != 3/4/1/0 )



  3. enfin la fonction classe toute les ID répondant à cette compatibilité par leur numéro d' ID et plusieurs paramètres secondaires ( qu'il est inutile de citer) et renvoie le tout sous forme de bilan. (là par exemple je sais pas si il faut trier le résultat selon le schéma de la chaine ayant le plus de numéro d' ID compatible ou bien alors grouper chaque ID avec tout les numéro D' ID étant compatible avec lui, mais dans ce cas cela va répéter plusieurs lien de compatibilité à chaque fois)... Oula je viens de me relire et me demande si je n'ai pas embrouillé plus qu'autre chose ...
    :wacko:

Le fait est que je vais évidemment programmer cette algorithme en PHP moi même, mais sans conseil de départ je peur d' utiliser énormément de ressource et d'espaces mémoires inutiles;

c'est pour cela que je demande, aux plus courageux qui ont lu et compris ma requête , de m'aiguiller par une technique de construction d'algorithme, sur la comparaison et sur le trie , avec des fonctions en php et/ou SQL qui pourrai m'être utile pour cette algo;

Toutes les idées et conseils qui pourraient me faciliter à démarrer cette horrible fonction sont évidemment les bienvenues :P

Modifié par crouttedepain
Posté

Salut,

Je ne sais pas si j'ai bien compris, mais si c'est le cas je renverserais le problème.

Par étapes, voici comment j'avancerais :

1/ je créerais un tableau comprenant toutes les chaînes uniques différentes (pour "1234" et "4123", je ne garde que "1234") avec une fonction d'anagramme. Il n'y en a pas une infinité.

2/ pour chaque valeur, j'en déduirais les 3 autres pour faire un select x from y where z="1234" || z="2341" etc...

S'il y a concaténation de champs pour déduire ta chaîne, j'utiliserais la fonction concat de mysql.

J'utiliserais un index sur le champ z ou sur les champs qui, concaténés, donnent ta chaîne.

3/ ca dépend de la structure et de la taille de ta table, ensuite j'ordonnerais les résultats à ma guise

Posté

Hello,

pour ma part j'aurais tendance à chercher à déléguer le plus possible à MySQL : est ce génant si tous les cas de type 0/3/1/4, 3/1/4/0, 1/4/0/3, 4/0/3/1 sont stockés en base sous forme de 0/3/1/4, ou bien tu as une perte d'info ?

Si ce n'est pas génant, un simple algo coté PHP d'uniformisation au moment du stockage te permettrait de directement utiliser les opérateurs de comparaison de MySQL.

Si ça l'est, prévoir éventuellement un double stockage : ajouter une colonne qui contiendrait la version "uniformisée" de ce champ.

Ensuite s'il y a d'autres opérations plus "complexes" de comparaison, je me baserais sur des procédures stockées, coté MySQL donc (si ton hébergement te le permet).

Posté

Martoclou :

oui j'avais pensé à recenser tout les schémas cycliques existant dans la BD et les insérer dans un tableau en y ajoutant toutes ID des chaines y appartenant;

mais je me demande si c'est pas un peu lourd;

pour l'instant, vu la taille de ma base de donnée c'est encore possible, mais cela risque d'être très lourd par la suite du fait que théoriquement il peut y avoir autant de schéma que de chaines existante et donc autant de requête SQL que de schéma.

En sachant également qu'il peut y avoir des schémas un peu plus complexe que l'exemple que j'ai donné, mais c'était pour simplifier le principe de l'algo
:sick:
.

Kioob :

c'est vrai qu'au moment de faire la saisie, je n'y pensai pas trop, mais malgré son apparence cyclique, cette chaine a un début et une fin;

je pourrai donc donner un autre champ dans la table pour y mettre la chaine originale mais je serai tout de même contraint a faire un test sur chaque chaine :

par exemple:

le doublon [ 0/3/1/4 et 0/3/1/4 ] a un coefficient de compatibilité supérieur à [ 0/3/1/4 et 3/1/4/0 ].

Je pourrai également insérer dans la chaine, au moment de la saisie, un caractère spéciale pour le début et la fin mais au moment de faire mes test je serai également obligé de les retirer et de retenir leurs positions.

pour résumer vos conseils, au moment de la saisie j' ajoute dans ma table un champs de schéma unique (par exemple : pour 1/4/0/3 le schéma unique commencerai par le plus petit chiffre c'est à dire 0 donc cela donnerai 0/3/1/4 ) et ensuite au moment de la comparaison, je fais une requête du genre "SELECT DISTINCT monChamp" puis je met le résultat dans un tableau qui contiendra tout les schémas uniques existant dans ma base de donnée ce qui me permettra de faire mon premier trie;

ensuite je retrie chaques ID entre eux par schéma cyclique.

heu c'est à peu près ça non?

En tout les cas merci infiniment de votre aide parce que j'y vois déjà plus clair :thumbup:

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...