# Count the number of times the highest number is repeated.

Go to solution Solved by Nine,

## Recommended Posts

Hello everyone in this example I have an array of 10 elements I'm going through it and I'm finding the largest number I have put a counter to calculate the number of times it repeats.
Can you guide me to apply this correctly
Best regards

```#include <MsgBoxConstants.au3>

Local \$array

\$array=22
\$array=13
\$array=11
\$array=99
\$array=2
\$array=17
\$array=99
\$array=23
\$array=99
\$array=74

\$max=\$array
\$counter=0

For \$i = 0 To 9 Step 1

MsgBox(\$MB_SYSTEMMODAL, "", "The number is!" & @CRLF & \$array[\$i])
If \$array[\$i] > \$max Then
\$max=\$array[\$i]
\$counter+=1

EndIf

Next

MsgBox(\$MB_SYSTEMMODAL, "", "The max value is!" & @CRLF & \$max)
MsgBox(\$MB_SYSTEMMODAL, "", "And its repited:" & @CRLF & \$counter)```

##### Share on other sites

```#include <Array.au3>

Local \$array

\$array=22
\$array=13
\$array=11
\$array=99
\$array=2
\$array=17
\$array=99
\$array=23
\$array=99
\$array=74

\$maxValue=_ArrayMax(\$array)
\$list=_ArrayFindAll(\$array,\$maxValue)
ConsoleWrite("Max value " & \$maxValue & " occurs " & \$list & " time(s)." & @CRLF)```

My Contributions and Wrappers

Spoiler
##### Share on other sites

Thank you and following the example I propose, I would also like to know how to do it with a counter.

##### Share on other sites

• Solution
Posted (edited)
13 minutes ago, Dsmoeg999 said:

I would also like to know how to do it with a counter.

```Local \$array

\$array=22
\$array=13
\$array=11
\$array=99
\$array=2
\$array=17
\$array=99
\$array=23
\$array=99
\$array=74

Local \$max = \$array, \$counter = 1

For \$i = 1 To UBound(\$array) - 1
If \$array[\$i] > \$max Then
\$max=\$array[\$i]
\$counter = 1
ElseIf \$array[\$i] = \$max Then
\$counter += 1
EndIf
Next

MsgBox(\$MB_SYSTEMMODAL, "", "The max value is!" & @CRLF & \$max)
MsgBox(\$MB_SYSTEMMODAL, "", "And its repited:" & @CRLF & \$counter)```

Edited by Nine

“They did not know it was impossible, so they did it” ― Mark Twain

Spoiler

##### Share on other sites

One more example

```#include <Array.au3>
;
Local \$array, \$i, \$counter, \$maxvalue
;
\$array=22
\$array=13
\$array=11
\$array=99
\$array=2
\$array=17
\$array=99
\$array=23
\$array=99
\$array=74

_ArraySort(\$array, 1) ; sort in descending order
;
\$maxvalue = \$array ; max value
\$counter = 1  ; # of max value detections
;
For \$i = 1 To UBound(\$array)-1  ; after sort \$array is the <max> by definition
If \$array[\$i] = \$maxvalue Then \$counter +=1
Next
ConsoleWrite("Max value " & \$maxValue & " occurs " & \$counter & " time(s)." & @CRLF)
; --- end of job ---```

##### Share on other sites

@Nine's is the solution that I would do as well, as it's the simplest and I would assume fastest. I was curious though how the suggestions here stacked up, so I did some tests.

I did make a change to Alexsis1's solution to exit the for loop when \$array[\$i] <> \$maxvalue, since it's sorted, exits a bit sooner

When using a 10 row array:

```[====================== Run progress, 10,000 times * 3 functions ======================]
+———————————————————————+—————————————————+———————————————+——————————————+—————————————+
|     Function Name     | Time Taken (ms) | Avg Time (ms) | Std Dev (ms) | Faster By % |
+———————————————————————+—————————————————+———————————————+——————————————+—————————————+
| _Occurance_Max_Find   |         4074.57 |        0.4075 |       0.0849 |        0.00 |
+| _Occurance_Counter    |          185.19 |        0.0185 |       0.0086 |       95.46 |
| _Occurance_Sort_Count |          893.57 |        0.0894 |       0.0313 |       78.07 |
+———————————————————————+—————————————————+———————————————+——————————————+—————————————+```

When increasing the size to 100:

```[====================== Run progress, 10,000 times * 3 functions ======================]
+———————————————————————+—————————————————+———————————————+——————————————+—————————————+
|     Function Name     | Time Taken (ms) | Avg Time (ms) | Std Dev (ms) | Faster By % |
+———————————————————————+—————————————————+———————————————+——————————————+—————————————+
| _Occurance_Max_Find   |         8702.17 |        0.8702 |       0.1885 |       30.33 |
+| _Occurance_Counter    |         1213.34 |        0.1213 |       0.0436 |       90.29 |
| _Occurance_Sort_Count |        12490.12 |        1.2490 |       0.2485 |        0.00 |
+———————————————————————+—————————————————+———————————————+——————————————+—————————————+```

And then 10,000:

```[======================= Run progress, 100 times * 3 functions ========================]
+———————————————————————+—————————————————+———————————————+——————————————+—————————————+
|     Function Name     | Time Taken (ms) | Avg Time (ms) | Std Dev (ms) | Faster By % |
+———————————————————————+—————————————————+———————————————+——————————————+—————————————+
| _Occurance_Max_Find   |         5833.96 |       58.3396 |       4.6752 |       72.94 |
+| _Occurance_Counter    |         1181.70 |       11.8170 |       1.2320 |       94.52 |
| _Occurance_Sort_Count |        21559.50 |      215.5950 |       9.1349 |        0.00 |
+———————————————————————+—————————————————+———————————————+——————————————+—————————————+```

It's interesting that Sorting is a lot faster when the array size is smaller, but it quickly loses speed. It switches somewhere around ~50-60 indexes, though the data also likely affects it quite a bit.

We ought not to misbehave, but we should look as though we could.

##### Share on other sites

To avoid excessive useless comparisons replace

```For \$i = 1 To UBound(\$array)-1  ; after sort \$array is the <max> by definition
If \$array[\$i] = \$maxvalue Then \$counter +=1
Next```

with

```For \$i = 1 To UBound(\$array)-1  ; after sort \$array is the <max> by definition
If \$array[\$i] < \$maxvalue Then ExitLoop ; eliminate redundant compares
\$counter +=1
Next```

Test with array of 1 million numbers

```#include <Array.au3>
;
Local \$array, \$i, \$counter, \$maxvalue
;
\$array=22
\$array=13
\$array=11
\$array=99
\$array=2
\$array=17
\$array=99
\$array=23
\$array=99
\$array=74

Local \$hTimer, \$DeltaT

ConsoleWrite("Array size = " & UBound(\$array) & @CRLF)

\$hTimer = TimerInit()
For \$i = 10 To UBound(\$array)-1
\$array[\$i] = Random(0, 98, 1)
Next
\$DeltaT = TimerDiff(\$hTimer)
ConsoleWrite("Delta T (init) = " & \$DeltaT & @CRLF)

\$hTimer = TimerInit()
_ArraySort(\$array, 1) ; sort in descending order
\$DeltaT = TimerDiff(\$hTimer)
ConsoleWrite("Delta T (sort) = " & \$DeltaT & @CRLF)
;
\$maxvalue = \$array ; max value
\$counter = 1  ; # of max value detections
;
\$hTimer = TimerInit()
For \$i = 1 To UBound(\$array)-1  ; after sort \$array is the <max> by definition
If \$array[\$i] < \$maxvalue Then ExitLoop ; eliminate redundant compares
\$counter +=1
Next
\$DeltaT = TimerDiff(\$hTimer)
ConsoleWrite("Delta T (count) = " & \$DeltaT & @CRLF)
ConsoleWrite("Max value " & \$maxValue & " occurs " & \$counter & " time(s)." & @CRLF)
; --- end of job ---```
```>"C:\DevTools\AutoIt3\SciTE\..\AutoIt3.exe"       /ErrorStdOut "D:\Alecsis\Prog\AutoIt\_Debug\tt4.au3"
Array size = 1000000
Delta T (init) = 1436.309
Delta T (sort) = 52488.0108
Delta T (count) = 0.0094
Max value 99 occurs 3 time(s).
>Exit code: 0    Time: 54.13```

##### Share on other sites

Posted (edited)

Hello friends thanks for the examples I appreciate it.
I would like to clarify a doubt  at the moment the exchange occurs

```If \$array[\$i] > \$max Then
\$max=\$array[\$i]
;Why we cant increase here the counter
\$counter+=1

EndIf```
```;This also does not give us the correct result.
if \$array[\$i] = \$max Then
\$counter+=1
Endif

;This looks like the right way to check it
ElseIf \$array[\$i] = \$max Then
\$counter += 1
EndIf```

I understand that it is so because the exchange occurs more times but really what you have to compare is if the greater is equal to the greater then it is repeated.

Can you confirm if I understand correctly ?

Edited by Dsmoeg999
##### Share on other sites

I don't really understand your question, seems like a bit of a language barrier. Are you able to post the full code that you're having a problem with? Just what's posted above isn't really enough to go on, not sure how you're using these.

However, this is incorrect:

12 hours ago, Dsmoeg999 said:
```If \$array[\$i] > \$max Then
\$max=\$array[\$i]
;Why we cant increase here the counter
\$counter+=1
EndIf```

You can't increase the counter here because you've found a new max, the occurrence count needs to be reset to 1, so it should be just \$counter = 1, not +=.

You need to reset the count to 1 each time you find a new max, because you asked for how to find the occurrences of the max value.

We ought not to misbehave, but we should look as though we could.

## Create an account

Register a new account

• ### Similar Content

By Zedna,

• 91 views
• #### Help with delete row from array if value exist in cell

By kemo1987,

• 4 replies
• 374 views
• #### delete rows from array if just 1 empty cell exist

By kemo1987,

• 3 replies
• 309 views
• #### Using an array inside of an array to transfer lots of files.

By TheAlienDoctor,

• 582 views
• #### How to use vlookup on an array? - For daily routine

By arunkw,

• 0 replies
• 612 views
×

• Wiki

• Back

• #### Beta

• Git
• FAQ
×
• Create New...