-1

最近、VBA マクロの一部として配列を使用することを学びました。それらが VBA を効果的に使用する上で不可欠な部分であることは理解しています。そのため、配列を効率的に処理する方法についてもっと学びたいと思います。少し調べてみたところ、いくつかの記事が見つかりましたが、何か重要な情報が不足している場合はお知らせください。

N 番目の素数を見つけるサブルーチンのコード例を次に示します。これは、素数の配列に対して試行除算を使用し、新しい素数を配列に動的に追加することによって行われます。

Sub FindNthPrime()
    StartTime = Timer
    Dim Counter, n, i As Single
    Dim Primes() As Double  'An array of primes so far
    Dim TestVal As Double
    Dim PrimeTest As Boolean
    
    n = 100000  'Find the n'th prime number
    
    ReDim Primes(0)
    Primes(0) = 2  'Start the array at 2
    Counter = 1    'Start the Counter at 1
    TestVal = 3    'Start testing with 3
    
    Do Until Counter = n
        PrimeTest = True
        For i = 0 To UBound(Primes)
            If Primes(i) > (TestVal ^ 0.5) Then Exit For
            If TestVal Mod Primes(i) = 0 Then
                PrimeTest = False
                Exit For
            End If
        Next i
        
        If PrimeTest = True Then
            ReDim Preserve Primes(UBound(Primes) + 1)
            Primes(UBound(Primes)) = TestVal
            Counter = UBound(Primes) + 1
        End If
        
        TestVal = TestVal + 2
    Loop
    
    Debug.Print Primes(UBound(Primes))
    Debug.Print Timer - StartTime
End Sub

基本的なベンチマーク テストでは、このコードは、配列を使用せずにブルート フォース トライアル除算アルゴリズム (テスト数の平方根までのすべての奇数をテスト) よりも優れていますが、それほどではありません。素数が大きくなるにつれて (この場合は 100,000 の素数)、私のマシンでは計算時間が 5 秒を超えています。

TL;DR: 上記のコードをより効率的にするためのヒントはありますか?

4

1 に答える 1

1

Dim Counter, n, i As Single
デフォルトの型はvariant非常にカウンターでnありvariants
Redim Preserve、高価なオプションであるため、大きな配列サイズから始めてRedim Preserve、大きな数でインクリメントします。orではなく、可能な限り
使用し ます。Longsingledouble
Mod^

于 2013-10-08T11:25:23.013 に答える