タグ付けされた質問 「math」

数学には、プログラム内の数値の操作が含まれます。一般的な数学の質問については、[math.stackexchange.com](https://math.stackexchange.com/)で質問してください。注:浮動小数点計算の予期しない結果に関する質問の場合は、最初に[浮動小数点演算は壊れていますか?](https://stackoverflow.com/q/588004/1679849)をお読みください。


30
整数の平方根が整数かどうかを判断する最も速い方法
long値が完全な二乗かどうか(つまり、その平方根が別の整数かどうか)を判断する最も速い方法を探しています。 私は組み込みMath.sqrt() 関数を使用して簡単な方法で実行しましたが、整数のみのドメインに制限することでより速く実行する方法があるかどうか疑問に思っています。 ルックアップテーブルを維持することは非現実的です(二乗が2 63未満の整数が約2 31.5 個あるため)。 ここに私が今やっている非常にシンプルで簡単な方法があります: public final static boolean isPerfectSquare(long n) { if (n < 0) return false; long tst = (long)(Math.sqrt(n) + 0.5); return tst*tst == n; } 注:この関数は、多くのプロジェクトオイラー問題で使用しています。したがって、他の誰もこのコードを保守する必要はありません。そして、この種のマイクロ最適化は実際に違いをもたらす可能性があります。課題の一部はすべてのアルゴリズムを1分未満で実行することであり、この関数はいくつかの問題では何百万回も呼び出される必要があるためです。 私は問題のさまざまな解決策を試しました: 徹底的なテスト0.5の結果、少なくとも私のマシンでは、Math.sqrt()の結果に追加する必要がないことがわかりました。 平方根逆高速は速かったが、それは、n> = 410881.に対して誤った結果を与えたが、によって提案されたようBobbyShaftoe、我々はN <410881のためFISRハックを使用することができます。 ニュートンの方法は、に比べてかなり遅いですMath.sqrt()。これはおそらく、Math.sqrt()ニュートンの方法に似たものを使用しているためですが、ハードウェアに実装されているため、Javaよりもはるかに高速です。また、ニュートンの方法では、依然としてdoubleの使用が必要でした。 整数演算のみが関与するようにいくつかのトリックを使用した修正ニュートン法は、オーバーフローを回避するためにいくつかのハックを必要とし(この関数をすべての正の64ビット符号付き整数で機能させたい)、それでもは遅くなりましたMath.sqrt()。 バイナリチョップはさらに遅くなりました。バイナリチョップは、64ビット数の平方根を見つけるために平均で16パスを必要とするため、これは理にかなっています。 ジョンのテストによると、使用してorステートメントは、より高速なC ++で使用するよりもあるswitchが、JavaやC#での間に違いはないようであるorとswitch。 (64のブール値のプライベート静的配列として)ルックアップテーブルを作成してみました。次に、switchやorstatementの代わりに、とだけ言いif(lookup[(int)(n&0x3F)]) { test } else return …


30
簡単なインタビューの質問が難しくなりました:1..100の数値を指定した場合、正確にkが指定されている場合、不足している数値を見つけます
久しぶりに面接の面白い体験をしました。質問は本当に簡単に始まりました: Q1:私たちは、数字の入った袋を持って1、2、3、...、 100。各数値は1回だけ表示されるため、100個の数値があります。これで、バッグからランダムに1つの番号が選択されます。不足している番号を見つけます。 もちろん、このインタビューの質問は以前聞いたことがあるので、次のように非常にすばやく答えました。 A1:さて、数値の合計1 + 2 + 3 + … + Nは(N+1)(N/2)(ウィキペディア:算術級数の合計を参照)です。の場合N = 100、合計は5050です。 したがって、バッグにすべての数値が存在する場合、合計は正確にになります5050。1つの数値が欠落しているため、合計はこれより少なくなり、違いはその数値です。したがって、O(N)時間とO(1)空間でその欠けている数を見つけることができます。 この時点で、私はうまくやったと思いましたが、突然、質問は予想外に変わりました。 Q2:それは正しいですが、2つの番号が欠落している場合、これをどのように実行しますか? これまでにこの変化を見たり聞いたり考慮したことがなかったので、慌てて質問に答えることができませんでした。インタビュアーは私の思考プロセスを知ることを強く求めたので、予想される製品と比較することで、またはおそらく1回目のパスからいくつかの情報を収集した後に2回目のパスを実行するなどして、より多くの情報を得ることができると述べましたが、私は本当に撮影していました解決策への明確な道を実際に持っているのではなく、暗闇の中で。 インタビュアーは、2番目の方程式を持つことが実際に問題を解決する1つの方法であると言って、私を励まそうとしました。この時点で私はちょっと気が動転し(答えを事前に知らなかったため)、これが一般的な(「役に立つ」)プログラミング手法であるのか、それとも単なる裏技なのかを尋ねました。 インタビュアーの答えには驚かされました。3つの欠けている数字を見つける手法を一般化できます。実際、それを一般化してk個の欠損数を見つけることができます。 Qk:バッグから正確にk個の数値が欠落している場合、どのように効率的に見つけますか? これは数か月前のことでしたが、このテクニックが何であるかはまだわかりませんでした。Ω(N)すべての数値を少なくとも1回スキャンする必要があるため、明らかに時間の下限がありますが、インタビュアーは、解法の時間とスペースの複雑さ(O(N)時間入力スキャンを除く)はNではなくkで定義されると主張しました。 したがって、ここでの質問は簡単です。 Q2をどのように解決しますか? Q3をどのように解決しますか? Qkをどのように解決しますか? 明確化 通常、1..100だけでなく、1 .. NからN個の数値があります。 私は明らかなセットベースのソリューションを探していません。たとえば、ビットセットを使用して、指定されたビットの値で各数値の存在/不在をエンコードし、O(N)追加のスペースでビットを使用します。Nに比例する追加のスペースはありません。 また、明確なソートファーストのアプローチも探していません。これとセットベースのアプローチはインタビューで言及する価値があります(実装は簡単で、Nによっては非常に実用的です)。私はHoly Grailソリューションを探しています(実装するのが実際的であるかどうかはわかりませんが、それでも望ましい漸近的な特性があります)。 繰り返しますが、もちろん、で入力をスキャンする必要O(N)がありますが、キャプチャできるのは少量の情報(Nではなくkで定義)であり、kの欠損数を何らかの方法で見つける必要があります。
1146 algorithm  math 





30
設計関数f(f(n))== -n
私が最後のインタビューで得た質問: 次のfような関数を設計します。 f(f(n)) == -n n32ビットの符号付き整数はどこにありますか。複素数演算は使用できません。 数値の全範囲に対してこのような関数を設計できない場合は、可能な限り最大の範囲に対して設計してください。 何か案は?
841 math  integer 

28
「ランダムさ」を理解する
私はこれの周りに頭を得ることができません、よりランダムですか? rand() または: rand() * rand() 私はそれが本当の頭の体操を見つけています、あなたは私を手伝っていただけませんか? 編集: 直感的には、数学的な答えはランダムであることがわかりますが、「乱数アルゴリズムを2回実行」すると、2つを掛け合わせると、単に行うよりもランダムなものが作成されると思います。一度。

5
円周率の計算が正確であるかどうかをどのように判断しますか?
私はさまざまな方法で、piの桁を順番に与えるプログラムを実装しようとしました。テイラー級数法を試しましたが、収束が非常に遅いことがわかりました(しばらくしてから結果をオンラインの値と比較すると)。とにかく、私はより良いアルゴリズムを試みています。 したがって、プログラムを作成しているときに、すべてのアルゴリズムと同様に、問題が発生しnました。計算した桁が正確であることをどのようにして知ることができますか?


24
数値が2の累乗であるかどうかを確認する方法
今日、数値が2のべき乗であるかどうかをチェックするための単純なアルゴリズムが必要でした。 アルゴリズムは: シンプルな ulong値を修正します。 私はこの簡単なアルゴリズムを思いつきました: private bool IsPowerOfTwo(ulong number) { if (number == 0) return false; for (ulong power = 1; power > 0; power = power << 1) { // This for loop used shifting for powers of 2, meaning // that the value will become 0 after the …
585 c#  algorithm  math 



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.