IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

GTK+ avec C & C++ Discussion :

GList vs g_array


Sujet :

GTK+ avec C & C++

  1. #1
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut GList vs g_array
    Petit problème.

    Je dois charger une image I de taille (x,y). I est composéede trois composantes R,V,B. Je dois trier ces composantes par ordre croissant pour en extraire la médiane de chacune d'elle.

    Ma première idée a été d'utiliser une GList (ou GSList, ca ne change rien au principe) puis je me suis dit que finalement les g_array feraient tout aussi bien l'affaire.

    La question est donc : les g_array sont-ils plus appropriés pour ce genre de travail? A moins qu'une autre méthode mieux adaptée existe?

    (Oui je sais là ca fait 2 questions, mais bon...)

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Par défaut
    Un GArray, ou même un tout bête unsigned char * (enfin 3, 1 pour chaque composante) me paraissent plus appropriés qu'une GList

  3. #3
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Disons pour approfondir que je me pose la question entre ces deux moyens parce qu'ils disposent tous les deux d'une fonction de tri toute faite. La roue étant déjà inventée...

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Par défaut
    Une GList, c'est un peu du gâchis, tu vas allouer un élément de liste pour chaque pixel, ça va faire un beau paquet d'allocations au final, et les données vont être éparpillées un peu partout en mémoire (ce que le cache du processeur n'aime pas trop). Avec un tableau, tu feras une seule allocation, et tout sera au même endroit.

  5. #5
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Par défaut
    Liste chaînée
    Avantages
    ajout/suppressions rapide d'éléments (temps constant)

    Inconvénients
    parcours des éléments lent
    accès au n-ième élément lent (il faut parcourir la liste à partir du premier élément)

    Tableau dynamique :
    Avantages :
    parcours des éléments rapide
    accès au n-ième élément rapide

    Inconvénients
    insertion/suppression d'éléments lent

    Là dans ton cas, tu connais déjà le nombre d'éléments que tu as à stocker, et tu peux les stocker tous à la suite. Une liste n'est pas adaptée.

    Tu peux bien sûr utiliser un tableau dynamique comme GArray, et utiliser ses fonctions de tri, ou bien un tableau de taille fixe alloué par un simple g_new ou g_malloc, suivi d'un appel à la fonction qsort de la libc qui fait un tri de type quicksort.

    http://fr.wikipedia.org/wiki/Liste_c...3%A9e#Principe
    http://fr.wikipedia.org/wiki/Tableau...ces_et_limites

  6. #6
    Membre Expert
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Par défaut
    Citation Envoyé par liberforce Voir le message
    Liste chaînée
    Avantages
    ajout/suppressions rapide d'éléments (temps constant)
    Ajout/suppression rapide d'éléments : uniquement si c'est au début de la liste dans le cas des GList/GSList ou si on a déjà un pointeur sur l'élément après lequel on va ajouter/supprimer un élt (en gros). Sinon c'est linéaire avec la taille de la liste.

  7. #7
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Par défaut
    Oui, c'est l'insertion avant/après un élément connu (pour lequel tu as déjà un pointeur) qui est rapide. Mais en général pour l'insertion, tu sais déjà après ou avant qui tu veux mettre le nouvel élément... On est d'accord que si tu veux faire un append (rajouter un élément à la fin de la liste) et que tu n'as un pointeur que sur le début de la liste tu as une complexité O (n).

    C'est pour ça qu'en général quand tu dois ajouter plein d'éléments à la suite dans une liste dans un ordre précis, tu fais un g_list_prepend (pour les ajouter en début de liste, opération en temps constant), puis un g_list_reverse qui retourne la liste (le premier élément devient le dernier et inversement).

    Le tableau a en revanche toujours une pénalité si tu n'ajoutes pas ton nouvel élément à la suite des autres...

  8. #8
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Finalement je peux utiliser le framework g_qsort_with_data(); de la glib je pense.
    J'initialise 3 tableaux triés avec cette fonction. Qu'en pensez-vous?

  9. #9
    Membre Expert
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Par défaut
    Citation Envoyé par liberforce Voir le message
    C'est pour ça qu'en général quand tu dois ajouter plein d'éléments à la suite dans une liste dans un ordre précis, tu fais un g_list_prepend (pour les ajouter en début de liste, opération en temps constant), puis un g_list_reverse qui retourne la liste (le premier élément devient le dernier et inversement).
    Si ta liste est initialement vide...

  10. #10
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Par défaut
    Citation Envoyé par gerald3d Voir le message
    Finalement je peux utiliser le framework g_qsort_with_data(); de la glib je pense.
    J'initialise 3 tableaux triés avec cette fonction. Qu'en pensez-vous?
    Ce serait un bon choix si tu avais besoin d'une information particulière et relative pour faire ton tri (d'où le g_qsort_with_data). Or d'après ce que j'ai compris, ce n'est pas le cas, puisque tu veux juste la valeur médiane de chaque canal RGB. Tu as donc juste à créer le tableau, le trier, puis trouver la médiane au milieu du tableau (dont tu connais la taille). qsort sera plus efficace.

    Au passage, ce n'est pas ce qu'on appelle un framework.

  11. #11
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Par défaut
    Citation Envoyé par teuf13 Voir le message
    Si ta liste est initialement vide...
    Certes, ce qui est le cas ici, c'est pour ça que je ne l'ai pas précisé. Mais si le nombre d'éléments est très grand, il peut même être intéressant de retourner la liste une première fois, faire des prepend, puis la retourner une seconde fois.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Supprimer le contenu d'une GList
    Par bigben89 dans le forum GTK+ avec C & C++
    Réponses: 4
    Dernier message: 23/08/2006, 16h20
  2. Widget et GList *
    Par corwin dans le forum GTK+ avec C & C++
    Réponses: 6
    Dernier message: 11/08/2006, 17h28
  3. GList et libération de mémoire
    Par corwin dans le forum GTK+ avec C & C++
    Réponses: 3
    Dernier message: 09/08/2006, 12h14
  4. GList et passage de paramètre
    Par corwin dans le forum GTK+ avec C & C++
    Réponses: 2
    Dernier message: 03/08/2006, 09h22
  5. GList ayant toujours la même valeur
    Par GLDavid dans le forum GTK+ avec C & C++
    Réponses: 4
    Dernier message: 18/03/2005, 11h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo