ここでの最善の解決策は、理解するのが難しい概念ですが、正しく行えば非常に効率的な動的プログラミングを使用することだと思います。アイデアは、特定の計算を実行する必要がある回数を最小限に抑えることです。これは、既に実行した計算の結果を記憶し、この知識を使用して問題をより単純な問題のサブセットに分割することによって行われます。
たとえば、2^(2^2) = (2^2)^2 の例では、これを 16 の値に相当する 2 つのものとして覚えることができます。 (2^(2^2)) = 2^((2^2)^2) これらのそれぞれを 2 ^ 16 として非常に迅速に識別することができ、計算を 1 回行うと、二度と計算する必要のない値のリスト。
これはあまり役に立たないように見えるかもしれませんが、非常に長い一連の括弧で囲まれた質問、さらに長い同値セットを使用することになった場合、コンピューターが実行する非常に長い計算で、時間と複雑さを節約できます。非常に大きな数で。以下の疑似コード、お詫び申し上げます。これは非常に広範な疑似コードであり、この問題は非常に大雑把であるため、アルゴリズム全体を書きたくありませんでした。コンセプトをより詳細に概説しただけです
sortedEquivalencyVector; //Sorted greatest first, so we are more likely to se longest matches
function(expression)
if(portion of expression exists) //Remember, you can only do this from the end of the expression in toward the middle!
replace value at end of expression that matches with its already computed value
if(simplified version exists in vector) add original expression to vector
else compute value and add it to the vector
end