2016-01-25 9 views
11

javaに​​を使用するための代替手段はありますか?Java BigInteger代替

は、あなたはそれが常に作成された新しいBigIntegerのとなるのBigIntegerで操作を実行するとき。 2つの大きな整数間の演算の結果がその中の1つに格納される代替実装がありますか?

例えば、Javaで2つの大きな整数の乗算を実行する場合:a * b新しいBigIntegerが結果をホストするために作成されます。結果をaに保存します。

私はこれをしたい私のアルゴリズム

+8

あなたは間違っています。パフォーマンスを上げたい場合は、最初に 'BigInteger'を使わないでください。修正したいパフォーマンスのボトルネックは何ですか? – Tunaki

+0

技術的な答えはあなた自身の実装を書くことでしょうが、@ Tunakiが言ったことは多分良いでしょう。 'BigInteger'を実際にパフォーマンスに影響を与えるような集中的な方法で使用しているのであれば、おそらく別のものを使うべきでしょう。 'BigInteger'を使う必要があるならば、あなたはそれに付随するパフォーマンスヒットを受け入れます。 – Gorbles

+0

つまり、あなたはある種の 'ModifyableBigInteger'を探していますか? –

答えて

7

はそこBigIntegerの「バージョン」可変があります(例えば:https://github.com/bwakell/Huldra)またはあなた自身をロールバックすることができます。変更可能なオブジェクトを使用すると、GCの負担を軽減できます。これが本当に価値があるかどうかを判断するためには、アプリケーションのベンチマークを行うべきです。

+1

実際、JavaにはMutableBigIntegerクラスもありますが、内部的にのみ使用されます。 –

+0

興味深い - BigIntegerでも使用 –

13

の例一部でパフォーマンスを向上させるために、私はあなたが何らかの形でこの操作を行うことができれば、あなたのアルゴリズムの性能が改善されることを疑うが、主な原則はBigIntegerがあるということです不変。新しいインスタンスを生成せずに操作を実行することはできません。この場合、複数のスレッドが1つのBigIntegerで動作している場合、これらのスレッドが直接BigIntegerを上書きしないようにすることができます*。

この動作を望まない場合は、あなたの唯一のオプションは、新しいクラスを作成することですが、心に留めて、あなたはまだ一部層でBigInteger秒の不変性に対処することになるという。

*:削ら、限り、あなたが変数を再割り当てじゃないと...

+0

"あなたはまだいくつかの層でBigIntegersの不変性を扱います。 - または、ゼロから大きな整数を再実装することができます(yuck)。 –

+0

@JanDvorak:なぜホイールを再発明するのですか? :P – Makoto

+0

@Makoto:車輪はいつも再発明されています。この場合、変更可能なBigIntクラスを取得する可能性が非常に高いでしょう。 ;-)事実は、BigIntegerの不変の性質を扱わずに行うことができるということです。 –

4

何を求めていることはすべてしたい場合を除いて、よりパフォーマンスどのような方法であることはほとんどありません追加することです。その理由は、ほとんどすべての数学演算の結果(前述のadd以外)のビット数は元の数とは異なるサイズであるためです。 ほとんど常には結果の新しい番号を割り当てる必要があり、元のものに戻してコピーするので、実際に行っていることはすべて遅くなります。

しかし、あなたがする必要があるのはadd/subです。これは実行可能であり、追加のために新しい配列の割り当てがないので、実際は少し速くなります。

他のほとんどすべての関数は、BigIntegerクラスに委譲されています。

class MutableBigInteger { 
    BigInteger n; 

    public MutableBigInteger add (MutableBigInteger n) { 
     this.n = this.n.add(n.n); 
     return this; 
    } 
} 
+0

これは、1回の操作だけを実行している場合にのみ当てはまりますが、次の例を考えてみましょう:a * b/c * dそしてより複雑になります。また、これにより私のBigIntegerを将来の操作のために再利用することができます。 –

+1

最も高いlinbを加えた場合、配列は元の1辺の長さより大きくなければなりません。また、2つの異なる値は同じサイズではないことが多いため、加算または減算しても再割り当てが行われることがよくあります。 –

+0

[Huldra](https://github.com/bwakell/Huldra)のベンチマークは、あなたに同意しないようです。私はこれらのベンチマークがJava 8に対してどう対処するのだろうかBigInteger –