提供された数値がパンデジタルかどうかを確認するための非常に高速なアルゴリズムが必要なプロジェクトに取り組んでいます。ロジックは正しいように見えますが、以下で説明するメソッドのパフォーマンスには特に満足していません。
それぞれ約 520ms、600ms、1600ms で最大 100 万個の 9 桁の数字をチェックできます。私は低遅延アプリケーションに取り組んでおり、本番環境では、確認する必要がある 7 ~ 9 桁の数字のデータセットが約 90 億または 95 億あります。
現在、次のロジックを使用する候補者が 3 人 (実際には 2 人) います。
方法 1:入力を取得し、N
その構成数字のバイト配列に分割し、関数を使用して並べ替え、要素とカウンターの一貫性をチェックArray.Sort
するループを使用して配列を反復処理します。for
byte[] Digits = SplitDigits(N);
int len = NumberLength(N);
Array.Sort(Digits);
for (int i = 0; i <= len - 1; i++)
{
if (i + 1 != Digits[i])
return false;
}
方法 2:この方法は少し疑わしいロジックに基づいていますが、入力N
を構成数字のバイト配列に分割し、次のテストを行います。
if (N * (N + 1) * 0.5 == DigitSum(N) && Factorial(len) == DigitProduct(N))
return true;
方法 3:私はこの方法が嫌いなので、本当の候補ではありませんが、int を文字列にキャストしてからString.Contains
、必要な文字列が pandigital かどうかを判断するために使用します。
2 番目と 3 番目の方法の実行時間はかなり安定していますが、最初の方法は頻繁に跳ね返ります。
したがって、理想的には、100 万 9 桁のマークの実行時間を 10 ミリ秒未満に短縮したいと考えています。何かご意見は?
これを Pentium 6100 ラップトップで 2GHz で実行しています。
PS - 2 番目の方法の数学的論理は適切ですか?