Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2013 les machistes (utilisateurs de Mac OS peuvent ils tester ceci

patricktoulon

XLDnaute Barbatruc
Bonjour à tous
@RyuAutodidacte m' a rappelé un lien vers un amis de l'autre monde concernant une classe pseudo dictionnaire pour MAC
malgré que j'apprécie beaucoup l'auteur (avec qui j'ai même collaboré sur l’accélérateur de requête entre autres ) ,je trouve que c'est un peu usine à gaz

j'ai donc fait les choses à ma façon
mais avant d'aller plus loin car des idées j'en ai plein ,si vous êtes un utilisateur sur MAC pouvez vous tester ce pseudo dictionnaire
sur Windows ça match il me faut confirmation sur MAC

Merci pour vos retours
 

Pièces jointes

  • classe dictionary pour Mac.xlsm
    18.3 KB · Affichages: 10
Dernière édition:

RyuAutodidacte

XLDnaute Impliqué
Re,
en associant ma méthode + celle la tienne ci-dessus on est à 0,40 secondes pour 10 000
je l'ai fait plusieurs fois je tombe tjs sur 0,40 et 1 à 0,39
je peux dire sur la fouchette de 0,39 à 0,43
 

patricktoulon

XLDnaute Barbatruc
re
ben je kiffe celui d'hier les 3 qui ont suivi mettent 0.20 de plus en moyenne et je l'ai accéléré de 0.15 en moyenne avec ma inserbubbleGD
conclusion je plafonne à 0.47/0.48 >> 0.40 0.42 quand le pc n'est pas occupé par autre chose
mais les 3 dernières non je kiffe pas du tout
tu a remplacé un insertbubble par une boucle avec application.min et c'est plus lourd visiblement
ben chez toi ca met 0.40 c'est bien non ?
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
pour info
la insertionbubble fait 49997500 tours sur 10 000
la insertionbubbleGD en fait 25000000
soit la moitié

bon 0.40 on est quand même loin des 0.02/0.03 pour les plus rapides(quicksort Laurent et patrick)
ca fait du 2000% quand même
mais c'est une belle performence et c'est tout nouveau tout beau
 

RyuAutodidacte

XLDnaute Impliqué
Re tous,

@patricktoulon
Avec notre combo Accélérateur Tris Ryu + sortInsertBubble3 de Patrick on a (sur MacBook Pro M1) :



VB:
Option Base 1

Dim Q
Dim ch

Sub testQSort()
Dim TB, TA(), SortColl As New Collection, GetTA, tim!, Mn
   Cells(1, 3).Resize(10000).ClearContents
    Q = 0: ch = 0: tim = Timer
 
    n = 1: ReDim temp(1 To 1)
    TB = Cells(1).CurrentRegion.Value
    For Each T In TB
        ReDim NewTB(1 To 1)
        L = Mid(T, 1, Len(T) - 1): S = Len(T): cle = L & S
        On Error Resume Next
        SortColl.Add IIf(SortColl.Count = 0, 1, SortColl.Count + 1), cle
        If Err Then
            GetTA = TA(SortColl(cle)):  ReDim Preserve GetTA(1 To UBound(GetTA) + 1): GetTA(UBound(GetTA)) = T: TA(SortColl(cle)) = GetTA
        Else
            ReDim Preserve TA(1 To SortColl.Count): TA(SortColl(cle)) = Array(T): ReDim Preserve temp(1 To n): temp(n) = CLng(cle)
            n = UBound(temp) + 1
        End If
    Next

    temp = sortInsertBubble3(temp)
    
    ReDim TB(1 To UBound(temp))
    For i = 1 To UBound(temp)
        TB(i) = TA(SortColl(CStr(temp(i))))
    Next
    
    For i = 1 To UBound(TB): TB(i) = sortInsertBubble3(TB(i)): Q = Q + 1:: Next
 
    ReDim TA(1 To 1)
    n = 0
    For Each arr In TB
        Q = Q + 1
        ReDim Preserve TA(1 To n + UBound(arr))
        For i = 1 To UBound(arr)
            Q = Q + 1
            TA(i + n) = arr(i)
        Next
        n = UBound(TA)
    Next

    MsgBox Format(Timer - tim, "#0.00") & " sec" & vbCrLf & Q & " TOURS DE BOUCLE" & vbCrLf & ch & " INTERVERTIONS"
    Cells(1, 3).Resize(UBound(TA)) = Application.Transpose(TA)
End Sub
Function sortInsertBubble3(T)
    Dim A&, B&, C&, x&, ref

    For A = LBound(T) To UBound(T)
        ref = T(A)
        x = A
        C = UBound(T)
        W = (UBound(T) - A) / 2
        'Dans une seule boucle B avance de A+1 vers le ubound et C recule du ubound vers B
        ' quand les deux se rencontrent on arrete de boucler
        ' on fait donc la moitié du nombre de tours de la hybride 1

        For B = A + 1 To UBound(T) - W
            Q = Q + 1
            If ref > T(B) Then ref = T(B): x = B:
            If ref > T(C) Then ref = T(C): x = C:
            C = C - 1
        Next
        If T(x) < T(A) Then TP = T(A): T(A) = T(x): T(x) = TP: ch = ch + 1
    Next A
    sortInsertBubble3 = T
End Function
 

patricktoulon

XLDnaute Barbatruc
oui les tris lents sont moins à la traine comme ça
qd on passe de 7 - 8 secondes à 0,40 c'est vraiment énorme !!!
re
non les hybride insertbubble 2 et 3 n'on jamais fait 7/8 secondes mais 2.6 / 2.8 sec
c'est la insertion et bubble simple qui font 6/8 secondes
tu pense bien sinon ça vaudrait pas le coup de s'atarder sur cette méthode
donc arrête de confondre insertion et mon hybride insertbubble(1,2,3)

je répète
la bubble
boucle 1 de 1 a ubound-1 et boucle 2 de index boucle1 à ubound
et comparaison des deux index(inversion selon le sens de tri
total 6/8 secondes 49997500 tours et 9990 echanges

l'insertion
boucle1 de 1 abound et boucle 2 de 1 a index boucle1
et comparaison index boucle1 avec tout les index boucle2
à l'image d'un chenillard à led repétitif
a peu près pareil pour les decomptes
total 6/7 sec

l'hybride inserbubble1
boucel 1 de 1 à ubound et boucle 2 de index boucle1+1 à ubound
comparaison index boucle1 et boucle1et memo de l'index plus petit


echange uniquement en sortie de boucle 2
total2.70/2.90 sec


l'hybride insertbbuble2 et 3 la DG
boucel 1 de 1 à ubound et boucle 2 de index boucle1+1 à ubound
comparaison index boucle1 et boucle1et memo de l'index plus petit
incrementaion a reculons de ubound vers index boucle2 et memo si plus petit que index boucle2
echange uniquement en sortie de boucle 2
total 2 fois moins de tours 2.50/2.60 sec( je sais on gagne pas beaucoup) et en plus ca peut augmenter en fonction si le pc est charger de travail

la 3 c'est la même que l'hybride2 sauf que j'utilise des boucles do/loop
car en effet après investigations bien poussées
une boucle for i= 1 to 1000000000
ira plus vite que
do while i<1000000000:i=i+1:loop
pour la simple et bonne raison est qu'a chaque tour la variable i est itéré alors que l'itération dans une boucle for est en interne testé des dizaine de fois




j'ai testé ce matin un hybride de la fusion et hybride
pour tester si vraiment c'etait le nombre de tour en sectionant la recheche par part de l'array
sur 10000 items que j'ai scruté par 5 boucles de 20000 je met plus de temps
conclusion la rapidité comme mes hybride le confirment aussi ne reside pas dans le nombre de tours
mais bel et bien les operations qui sont faites dans ces boucles aussi benines ou simples soient elles
 

RyuAutodidacte

XLDnaute Impliqué
je parlais de ces là non hybride :


je ne sais pas si tu a fais la modif avec la partie temp :
VB:
 n = 1: ReDim temp(1 To 1)
    TB = Cells(1).CurrentRegion.Value
    For Each T In TB
        ReDim NewTB(1 To 1)
        L = Mid(T, 1, Len(T) - 1): S = Len(T): cle = L & S
        On Error Resume Next
        SortColl.Add IIf(SortColl.Count = 0, 1, SortColl.Count + 1), cle
        If Err Then
            GetTA = TA(SortColl(cle)):  ReDim Preserve GetTA(1 To UBound(GetTA) + 1): GetTA(UBound(GetTA)) = T: TA(SortColl(cle)) = GetTA
        Else
            ReDim Preserve TA(1 To SortColl.Count): TA(SortColl(cle)) = Array(T): ReDim Preserve temp(1 To n): temp(n) = CLng(cle)
            n = UBound(temp) + 1
        End If
    Next

    temp = sortInsertBubble3(temp)
    
    ReDim TB(1 To UBound(temp))
    For i = 1 To UBound(temp)
        TB(i) = TA(SortColl(CStr(temp(i))))
    Next
    
    For i = 1 To UBound(TB): TB(i) = sortInsertBubble3(TB(i)): Q = Q + 1:: Next
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Il y a quand même aussi l'insertion avec recherche dichotomique de la position d'insertion, qui reste la plus performante entre 5 et 40 éléments environ, et même extensible jusqu'au alentours de 1000 éléments si ce qui est à décaler pour insertion sont des Integer ou des Long, à condition que le décalage puisse se faire avec un MoveMemory (Alias RtlMoveMemory de la kernel32.dll). Ne voudriez vous faire des recherches dans ce sens avec des Variant (dont je ne connais pour le moment la longueur fixe) ? Parce que c'est la voie royale pour optimiser toutes les autres méthodes de tri lorsqu'elles reçoivent la charge de petits ensembles (au début pour la fusion, vers la fin pour pratiquement tous les autres algorithmes).
 
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…