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
Traitement de données dans un tableau
Règles du forum
- Merci de consulter la section "Règles du forum" et plus particulièrement "Règles et Mentions Légales du site autoitscript.fr" avant d'écrire un message.
- Tlem
- 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
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,
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. 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é".
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é".
- walkson
- 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
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)
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 !
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
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 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)
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
-
- 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
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 ^^
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 ^^
- Tlem
- 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
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).
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).
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é".
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é".
-
- 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
Merci beaucoup pour votre script Thierry, ça m'aide beaucoup !
Je vous dirai si j'ai un souci pour l'appliquer sur mon logiciel
Je vous dirai si j'ai un souci pour l'appliquer sur mon logiciel