Traitement de données dans un tableau

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Sephiron
Niveau 1
Niveau 1
Messages : 4
Enregistré le : mer. 27 sept. 2017 23:31
Localisation : 127.0.0.1
Status : Hors ligne

Traitement de données dans un tableau

#1

Message par Sephiron »

Bonjour,

Je suis entrain de développer un petit logiciel de calcul et il y a un endroit où je bloque. Vu que le code est assez long je vais plutôt vous expliquer ce que je n'arrive pas à faire malgré mes recherches ici et sur le web.

J'ai crée un $tableau[] avec beaucoup d'éléments dedans (genre un million). A l'intérieur de ce tableau, il y a des nombres allant de 0 à 100 tirés au hasard et de manière totalement aléatoire.
Le tableau pourrait donc se présenter de la façon suivante : [15, 40, 1, 40, 68, 44, 87, 33, 46, 21, 5, 74, 0, 53, ..., 21].
Comme vous pouvez le voir dans l'exemple, le même nombre peut être présent plusieurs fois dans le tableau.

Ce que je voudrais, c'est pouvoir mettre en évidence le nombre le + présent au sein du tableau et aussi le nombre le moins présent dans le tableau.

Ma question est donc de savoir s'il y a une fonction simple qui me permettrait de savoir quel nombre est le plus présent et combien de fois il apparait et inversement pour le moins présent.

Un grand merci à vous :)
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: Traitement de données dans un tableau

#2

Message par Tlem »

Bonsoir.
Puisque vous n'avez que des nombres de 1 à 100, créez un tableau de 100 éléments vides (101 pour aller de 0 à 100).
Ensuite faites une lecture de chaque valeur du tableau principal et incrémentez la valeur correspondante du nouveau tableau (pour la valeur 50, $Tableau2[50] += 1 . Une fois la totalité des opérations terminées, il suffit de consulter le nouveau tableau pour connaitre le nombre de fois que telle ou telle valeur a été trouvée. :mrgreen:
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 1020
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

Re: Traitement de données dans un tableau

#3

Message par walkson »

Bonjour,
Il y a un problème que vous ne soulevez pas, c'est le risque d'avoir des doublons tant dans les maxi que dans les mini !
Un exemple en reprenant l'idée de Tlem (j'utilise _ArrayUnique() pour avoir uniquement les valeurs présentes)
#include <Array.au3>

Local $hArray[] = [1,2,3,1,2,3,1,1,2,3,0,4,5,6,6]
_ArrayDisplay($hArray)
$hArrayU = _ArrayUnique($hArray,0,0,0,0)
_ArrayDisplay($hArrayU,"chaque valeur")
_ArrayColInsert($hArrayU, 1);array 2D
Local $cpt
For $i = 0 To UBound($hArrayU) - 1
   For $y = 0 To UBound($hArray) - 1
      If $hArrayU[$i][0] = $hArray[$y] Then $cpt += 1
      $hArrayU[$i][1] = $cpt
   Next
   $cpt = 0
Next
_ArrayDisplay($hArrayU,"resultat")
$maxi = _ArrayMaxIndex($hArrayU, 1, 0, 0, 1)
MsgBox(0, 'Max Index Numeric value in column 1', $maxi);row 0
MsgBox(0, 'Max valeur Numeric value in column 0', $hArrayU[$maxi][0])
$mini = _ArrayMin($hArrayU, 1, 0, 0, 1)
$indexMini = _ArrayFindAll($hArrayU,$mini,0,0,0,0,1)
_ArrayDisplay($indexMini,"mini en double"); rows 3,4,5
Pour la valeur maxi, je n'ai qu'un retour => 1
Pour la valeur mini, j'ai 3 retours => 0,4,5

Quand je lis un million de données, je pense tout de suite à Sqlite. Je n'ai pas d'idées en tête mais cela doit être possible et surtout plus rapide !
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
Sephiron
Niveau 1
Niveau 1
Messages : 4
Enregistré le : mer. 27 sept. 2017 23:31
Localisation : 127.0.0.1
Status : Hors ligne

Re: Traitement de données dans un tableau

#4

Message par Sephiron »

Merci pour vos retours.

Effectivement, il peut y avoir des doublons, il faudrait alors choisir au hasard un nombre parmi ceux qui seront sorti le plus. Enfin, c'est un autre problème.

Sinon je peux limiter le tableau à 1000 ou 10000, j'ai dis un million mais j'avoue que c'est un peu abusé et j'ai pas envie de m’embêter avec des requêtes SQL ^^
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: Traitement de données dans un tableau

#5

Message par Tlem »

Bonjour.
Perso je voyais les choses bien plus simples ...
Sur mon PC (vieux I5 8 Go) la création d'un tableau de 1 millions d'éléments prends 1 seconde (au max) et le traitement de comptage en prends encore moins. ^^
Donc je ne suis pas persuadé que le passage à SQLlite apporte grand chose de plus (dans ce cas précis). :mrgreen:

Code : Tout sélectionner

#include<array.au3>

Local $hTimer
Local $Tableau1[1000001], $Tableau2[101][2]
Local $iMin, $sMin, $iMas, $sMax

; ======================================== Création du tableau 1 000 000 ========================================
MsgBox(32, "Tableau 1 million", "Cliquez sur Ok pour lancer la création d'un tableau" & @CRLF & "de 1 million d'éléments.")
$hTimer = TimerInit()

For $i = 1 to 1000000
	$Tableau1[$i] = Random(1, 101)
Next

MsgBox(32, "Tableau 1 million", "Tableau créé en " & StringLeft(TimerDiff($hTimer)/1000, 4) & " secondes")
; ======================================== Création du tableau 1 000 000 ========================================


; ======================================== Traitement et comptage du tableau ========================================
MsgBox(32, "Tableau 1 million", "Cliquez sur Ok pour lancer le traitement du tableau" & @CRLF & "à 1 million d'éléments.")
$hTimer = TimerInit()

For $i = 1 to UBound($Tableau2) - 1
	$Tableau2[$i][0] = $i
Next

For $i = 1 to UBound($Tableau1) - 1
	$Tableau2[$Tableau1[$i]][1] += 1
Next

MsgBox(32, "Tableau 1 million", "Tableau traité en " & StringLeft(TimerDiff($hTimer)/1000, 4) & " secondes")
; ======================================== Traitement et comptage du tableau ========================================


; ======================================== Tri du tableau ========================================
; Colonne 1 = Nombre (0 à 100)
; Colonne 2 = Nombre d'itération

_ArraySort($Tableau2, 0, 1, 0, 1)
_ArrayDisplay($Tableau2)
; ======================================== Tri du tableau ========================================
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Sephiron
Niveau 1
Niveau 1
Messages : 4
Enregistré le : mer. 27 sept. 2017 23:31
Localisation : 127.0.0.1
Status : Hors ligne

Re: Traitement de données dans un tableau

#6

Message par Sephiron »

Merci beaucoup pour votre script Thierry, ça m'aide beaucoup !

Je vous dirai si j'ai un souci pour l'appliquer sur mon logiciel :D
Répondre