プログラミングで知っておくべき優れた数式は何ですか?[閉まっている]


19

より良いアルゴリズムを作成し、より良いプログラマーになるのに役立った、学んだ一般的な数学の式は何ですか?

例:エクリュディアン距離の公式について学びました。sqrt((x1-x2)^2+(y1-y2)^2)これは、2つの要因を比較することにより、類似オブジェクトを見つける方法を理解するのに役立ちました。


2
これはユークリッド距離の式ではないと思います。
グレッグヒューギル

@Larry @Gregが編集されました。
GSto

笑fiboシーケンスについてはどうですか...ベンチマークに適しています
-aggietech

1
完了日=(推定日+残り日数/ 2)^(勤務時間/自宅での時間)*無料ピザの数
-Skizz

7
距離を比較するだけの場合は、このsqrtステップをスキップできることを知っておくと面白いかもしれません。タイトな内部ループの場合、それは重要かもしれません。

回答:


16

2のべき乗を知ることは、特に低レベルのビット演算を扱う場合に便利です。


+1-基数2、16、10、および8に変換できることは必須です。
mouviciel

2
8進数についてはわかりませんが、2、16、および10の変換に同意します。合理的な時間枠でそれができる必要がありますが、必ずしも即時ではありません。
シークレット

私の1人の先生は16進数の動物です 彼の頭のとんでもない数字で変換し、私は年のために彼のためにTAをしたかI.たように、クラスは常に感銘を受けました
クリス・

私はベース8が嫌い:)

1
例は、人々は基本的に魔法の数字です2のべき乗を、知っておく必要が何をすべきかのマクロ、現代の言語で列挙型、ビットフィールド..とsetsockopt(...SO_KEEPALIVE..)比べてかなり読みやすいか書き込みであるsetsockopt(...16...)
JBRWilkinson

15

ブール代数についてはすでに言及しましたが、実用的な例をいくつか提供したいと思いました。

ブール代数は、複雑なブール式(ifたとえば、ステートメント)で作業するときに非常に便利です。

有用な表現と法律を組み合わせてください:

分配性

A&(B | C)=(A&B)| (交流)

A | (B&C)=(A | B)&(A | C)

そのため、次回はそのような表現に出くわします。

if((A || B) && (A || C) && (A || D) && (A || E)) { ... }

次のように簡単に縮小できます。

if(A || (B && C && D && E)) { ... }

否定とド・モーガンの法則

!(!A)= A

!(A&B)=!A | !B

!(A | B)=!A&!B

そのような声明があるとしましょう:

if(!A && !B && !C) {..}

そして、あなたはその反対を構築する必要があります。書き込み:

if(!(!A && !B && !C)) {...}

動作しますが、この同等のものほどクールに見えません:

if(A | B | C) {...}

2
これを行う際の問題は、これが実際のビジネスルールであるかどうかです。それらは変化する傾向があるためです。その場合、元の式を再構成して変更し、再度最適化する必要があります。その間、メンテナーは不平を言う傾向があります。

そして、それがカルノーの地図が役立つ場所です。一度に最大4つのブールフラグでのみ機能しますが、さらに必要な場合は幸運です!
ジョブ

3
デモーガンの法則に+1。私はそれを教えられた人が少なく、それをどのように応用するかを知っていることに驚く。
Fortyrunner

これを忘れました:(P -> Q) <=> (!P | Q)。論理含意演算子を提供する環境はごくわずかであるため、これを常に使用します。これは、SQL CHECK制約の非常に便利な同等物です。
muが短すぎる

Karnaugh and De Morganの法則は、通常、電気工学の授業で使用することを教えられていますが、コンピューター工学の授業では使用していません。上記のDe Morganの法則の実際の使用のように、後者でアプリケーションを見つけることができるため、これは奇妙です。
スポイケ

9

私の経験では、数式は非常に特殊な計算に使用されますが、これはプロジェクトに適用される場合と適用されない場合があります。

何かを計算する必要がある場合は、通常、ライブラリまたはサンプルソースコードに関数があり、それを計算できます。たとえば、ExcelのPMT()関数は、Y期間にわたって債務をX%で返済するために必要な支払いを計算します。あなたは本当にそれがどのようにそれを計算するかを知りたいですか、それとも組み込みのものを呼び出すだけで十分ですか?

過去10年間、Ceil()、Min()、およびMax()以外のMathライブラリの何かを使用する必要はないと考えています。 、今日の一般的な用途は、データの流れに関する意思決定です。

たとえば、大量のコードを持っているFacebookを考えてみましょう。おそらくどこかにMathがありますが、主にCrypto APIが疑われます。これはおそらくシステムライブラリです。ただし、データベースへのアクセス、承認の決定、ページの構築、および情報のルーティングでは、おそらく大量のMathを使用しません。

はい、金融、物理学、工学など、多くの数学を必要とする市場がありますが、これらの業界では、主な分野は数学/経済学、物理学、工学などである可能性が高いため、質問は言語Yの式f(x)

あなたの時間、IMOのより良い使い方は、アルゴリズム(ビッグO表記を含む)とデザインパターンを調査することです。


1
+1は合理的な陳述のように見えるためです-知っておくべき特定の公式はありませんが、アルゴリズムの複雑さ(Big O表記)の概念は非常に重要です。
マイケルH.

たくさんの数学...どの広告であなたを悩ますか決定します。

私の経験はあなたの経験ほど低くはありませんが、必要な数学の量は一般的に非常に少ないことに同意します-私は定期的にグラフィックでトリガーを使用することになります。
ローレンペクテル

7

あなたをより良いプログラマにするための公式はありません。

数学関連のスキルは、あなたをより良いプログラマにすることができます:

  • 科学的方法 -数学/科学の考え方と問題解決
  • 抽象化 -抽象化とパターンを認識する機能
  • 継承 -新しい問題の解決における既存の作業/方法の再利用
  • 経験 -一連の問題と解決策を理解する

-1、男性は有用な数式について尋ねた。この答えがまったく支持されたとは信じられません。
ジャス


6

「より重い」関数の迅速な近似を得るのに非常に役立つテイラー級数に言及したいと思います。たとえば、sin(x)約0はで近似できますx-(x*x*x/6)

一般に、物事を迅速に近似する賢い方法があるという考えは、最後の有効桁まで計算するのではなく(基本関数の場合、ほとんどの最新のプロセッサには高速のハードワイヤード実装が含まれているため、Taylorを使用してsinを近似することはそれほど重要ではないかもしれません)速度ゲイン)。


3

De Morganの法則、否定に関連したブール「and」および「or」の変換、およびブール論理(二重否定など)に関するいくつかの関連するより基本的な情報。


2

3つのルール(クロス乗算のタイプ)

基本統計式の場合は+1。

この簡単なルールを基本コードに適用するのが難しい人をたくさん見ました。


クロス乗算の場合は+1。整数オーバーフローの問題が発生しやすい一部のソフトウェアでは、クロス乗算を使用して、結果がオーバーフローしないことを確認します。
rwong

2
大したことではありません。これは、CSを勉強したい高校卒業生の頭に染み込んでいるはずです。
ジョブ

@ジョブ:理論的な世界では、これは本当です!
パゴッティ


2

余弦の法則は、多くの幾何学的問題にとって非常に重要です。

代替テキスト

特に角度決定。


その方程式のガンマとは何ですか?
マットエレン

1
@マットエレン:サイドCを横切る側面の角度(IOW、AとBの間の角度)
リーライアン

2
そして、もちろん、直角三角形の特別な場合:a^2 + b^2 = c^2
自己への注意-

2

プログラミングは非常に広い分野です。数学の公式は、プログラミングのどの領域に依存します。グラフィックス、ゲームプログラミングに興味がある場合は、より多くの三角法、ジオメトリを知る必要があります。ゲームプログラミングは、物理学、レンダリング、シェーダーなどの分野にさらに分類できます。リストは続きます。したがって、物理シミュレーションの専門家であれば、物理学に関連することを知っておく必要があります。
セキュリティに興味があるなら、あなたは数論の専門家でなければなりません。
一般的には、これらの組み合わせを使用できますが、興味のあるものはどれでもかまいません。学習は痛くない。


2

証明の方法

最も注目すべきは、相対頻度で使用したものです。

他にもあります。私はそれらの多くをある時点で使用しましたが、これらは一目で使用したことを思い出すことができる3つです。また、単体テストまたは統合テストを作成するときに意図を念頭に置いておくことができれば、非常に役立ちます。


2

T(n)= aT(n / b)+ f(n)、a> = 1、b> 1

マスター定理は、プログラミングに役立つものです。再帰関係を解くことができ、再帰アルゴリズムの複雑さを見つけるのに役立ちます。これは、「分割統治」スタイルのアルゴリズムを記述するときに特に重要です。大まかに言うと、各「ステップ」の複雑さと分岐要因を知っていれば、マスター定理を使用して複雑さを得ることができます。


1
プログラミングで知っておくと良いのはなぜですか?
マットエレン

@MattEllen:再帰的アルゴリズムの複雑さを見つけるのに役立つ再帰関係を解決できます。これは、「分割統治」スタイルのアルゴリズムを記述するときに特に重要です。大まかに言うと、各「ステップ」の複雑さと分岐要因を知っていれば、マスター定理を使用して複雑さを得ることができます。
ティコンジャービス

1
  • 代数
  • 三角法
  • ベクトル(行列演算)
  • 微積分
  • [さまざまな補間とその微分]
  • [表面、NURBS]

(ブラッカーの中のものは、より「応用された」種類のものです)

あなたがいる分野に強く依存しているため、一般的な指示を与えることは困難です。しかし、上記は非常に多くの工学の学位の基本をカバーしています。念頭に置いて、これらのカテゴリはしばしば重複しています(三角法+行列演算、微積分+行列演算など)。

私はいつも数学ハンドブックを近くに持っています。多くの場合、何かについて確信が持てず、組織的に提示することが役立ちます。


1

ブール代数を知ることは大いに役立ちます。次のようなコードを書くことを防ぎます

if (x < 10)
    return true;
else
    return false;

ブール代数がユーザーがそれを書くのを防ぐのにどのように役立つのか理解していないのですか?ユーザーがそこに書くべきものを提案できますか?(私はx <10を返すと仮定しますが、間違っている可能性があります。)
クリス

1
正解です。x<10を返す必要があります。このように考えてください。評価(x <10)はブール値の結果を返します。ifステートメントは[if xが実際に10未満の場合] if(true)return true;に分解されます。または[xが10以上の場合] if(false)... elseはfalseを返します。
エリックオルソン

2
(x <10)は2つのビジネスケースを分離している可能性があります。冗長なフォームを使用すると、より多くのちょうどあなたが最小限の変更を保つことができるよう、メンテナンスモードでは、非常にいいです値、返すより行うことができます

1

最適化の問題については、対数尤度を理解することをお勧めします。たとえば、平方和を最小化しようとする場合、尤度のログを最大化することと同じです。

log( Product( exp( -(x[i]-mean)^2 )) )
  =
  - Sum( (x[i]-mean)^2 )

パフォーマンスチューニングの領域でのその他のお気に入りは、二項分布とベータ分布です。計算は非常に簡単です。

プログラムの状態のランダムサンプルを10回取得し、F = 40%の時間で特定の条件にある場合、それは不公平なコインでのコイントス実験のようです。その条件で表示される回数は、平均が10 * 0.4 = 4の二項分布であり、sqrt(10 * 0.4 * 0.6)の標準偏差= sqrt(2.4)= 1.55です。

一方、10個のサンプルを取り、4個のサンプルでその状態を見ると、Fの大きさについて何がわかりますか?可能な結果は0、1、2、3、4、...、9、10です。これは11の可能性であり、あなたが見た可能性(4)は5番目の可能性です。したがって、11個の均一な(0,1)乱数を取得し、並べ替えます。5番目の分布は、ベータ分布であるFの分布です。モードは4/10です。平均は5/11です。その分散は5 * 6 /(11 ^ 2 * 12)= 0.021、標準偏差= 0.144です。

多くの人は、ソフトウェアのパフォーマンスの問題を特定し、誤った問題を発見しないようにするには、多数のサンプルが必要だと考えています。これらの分布は、少数のサンプルがコストについて多くを明らかにできることを示しています。


0

これは少し簡単かもしれませんが、G=(V,E)心に留めておくべき良い方法です。言い換えると、グラフは頂点とエッジのセットです。グラフは、多くのものを表すのに非常に便利です。

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