インスピレーションプログラミング: 最大公約数アルゴリズムの分析

インスピレーションプログラミング: 最大公約数アルゴリズムの分析

2 つの正の整数が与えられたら、その最大公約数を求めます。これは、コードを書く学生なら誰でも遭遇したことがある問題だと思います。もちろん、解決法はいくつもあります。以下は、アルゴリズム処理をまったく行わないプログラムです。

  1. 公共 静的  int getResult( int a, int b){
  2. int最大値 = (a>b)?a:b;
  3.      int結果 = 0 ;
  4.      ( int i = 1 ;i < max;i++) {
  5.          (a%i == 0 && b%i == 0 )の場合{
  6. 結果=i;
  7. }
  8. }
  9.     結果を返します
  10. }

これは確かに解決可能ですが、より大きな正の整数をループする必要があり、両方の数値が非常に大きい場合は、効率が非常に低くなります。非効率的なプログラムに遭遇すると、必然的に最適化について考えることになりますが、アルゴリズムの最適化は常に非常に信頼できる方法です。最大公約数問題を解決するためのアルゴリズムを追加する方法はいくつかあります。

解決策1:

ユークリッドのアルゴリズムでは、正の整数 num1 と num2 の最大公約数を求めたいとします。f(x,y) は 2 つの最大公約数です。k = x / y (切り捨て)、b = x % y (余り) とすると、x = ky + b となり、x と y の両方で割り切れる数は b と y でも割り切れる必要があり、b と y で割り切れる数は x と y の両方で割り切れる必要があります。つまり、x と y の最大公約数は b と y の最大公約数であるため、f (x, y) = f(y, x%y) (x>=y>0) となり、これを再帰的に行うことができます。たとえば、

f(42,30) = f(30,12) = f(12 , 6) = f(6,0) = 6; これにより、計算回数が大幅に削減されます。コードは以下に添付されています:

  1. int結果 = ((y == 0 ) ? x : gcd(y, x % y));
  2.     結果を返します
  3. }

解決策2:

解決策 1 は、公約数を見つける問題を非常にうまく解決しますが、アルゴリズムには除算が含まれており、コンピューターでの除算のオーバーヘッドが非常に高くなります。除算を回避することは可能ですか?これを次のように考えることができます。ある数が x と y に分割できる場合、その数は xy と y にも分割できる必要があります。言い換えると、x と y に分割できる数は、その数が xy と y に分割されるための必要かつ十分な条件です。すると、f(x, y) = f(xy , y) となり、このように計算することで、大きな整数間の剰余演算を大きな整数間の減算演算に変換することができます。 f(x, y) = f(y, x) なので、正の数と負の数の最大公約数を見つけないようにするには、柔軟に f(x, y) = f(y, x) を使用して、片側が 0 になるまで反復する必要があります。たとえば、次のようになります。

f(42,30) = f(30,12) = f(18 , 12) = f(12 , 6) = f(6,6) = f(6 , 0) = 6; 上記の方法と比較すると、この操作は大きなデータ係数の問題を最適化しますが、操作の数が増えます。コードは次のとおりです。

プライベート静的int gcd(int x, int y) {

  1. y == 0場合
  2.          xを返します
  3. }
  4.     もし(x < y){
  5.          gcd(y, x)を返します
  6. }それ以外{
  7.          gcd(x - y, y)を返します
  8. }
  9. }

解決策3:

ソリューション 1 の欠点は、ビッグ データの分割操作が複雑であることです。ソリューション 2 ではビッグ データの分割操作は不要になりますが、操作数が増えます。どちらの方法も完璧ではないので、3 番目の方法で解決します。3 番目の方法ではバイナリ スキームを使用します。01100100 を見ると、多くの生徒が諦めてしまうと予想されます。そうしないでください。実際には難しくありません。

x と y について、x=k * x1、y = k * y1 の場合、f(x, y) = f(k * x1、k * y1) = k * f(x1、y1) となり、これが 1 です。

さらに、x = p * x1 で、p が素数、y%p != 0 の場合、f(x, y) = f(p * x1, y) = f(x1, y) となり、これは 2 です。

式 1 と 2 から、公約数を計算できます。

p=2と仮定します。

x と y が両方とも偶数であると仮定します: f(x, y) = 2f(x»1, y»1);

x が偶数で y が奇数であると仮定します: f(x,y) = f(x»1,y);

x が奇数で y が偶数であると仮定します: f(x,y) = f(x,y»1);

x と y が両方とも奇数であると仮定します: f(x,y) = f(y,xy); - これはソリューション 2 から導出されます。

42 と 30 を例に挙げてみましょう。

f(42,30) = f(101010,11110) = 2f(10101,1111) = 2f(1111,110)=2 * f(1111,11) = 2 f (1100,11) = 2f(110,11)=2 f(11,11) = 2 f(0,11) = 2 3=6

括弧内のすべてはバイナリで表現されるため、最悪の場合、複雑さは log 2(max(x,y)); になります。 - 2 が底です。 くそ、この形式を正しく理解できない。

コードは以下に添付されています:

  1. もし(x < y){
  2.          gcd(y, x)を返します
  3. }
  4.      y == 0場合
  5.          xを返します
  6. }
  7.      if (isEven(x)) {
  8.          if (isEven(y)) {
  9.              // x、y は両方とも偶数なので、f(x,y)=2*f(x/2,y/2)  
  10.              gcd(x >> 1 , y >> 1 ) << 1返します
  11. }それ以外{
  12.              // x は偶数、y は奇数、f(x,y)=f(x/2,y)  
  13.              gcd(x >> 1 , y)を返します
  14. }
  15. }それ以外{
  16.          if (isEven(y)) {
  17.              // x は奇数、y は偶数、f(x,y)=2*f(x,y/2)  
  18.              gcd(x, y >> 1 )を返します
  19. }それ以外{
  20.              // x、y は両方とも奇数なので、f(x,y)=f(xy,y)  
  21.              gcd(x - y, y)を返します
  22. }
  23. }
  24. }
  25.  
  26. 公共 静的 ブール型isEven( int x) {
  27.     戻り値(x % 2 == 0 ) ? true : false ;
  28. }

これまでこのようなことを考えたことはありませんでした。初めてアルゴリズムを見たとき、とても高度なものだと思いました。しかし、以前解いていた公約数の問題をこのように解くのを見ると、本当に目を見張るものがあります。皆さんがもっと提案してくれると嬉しいです〜

オリジナルリンク: http://my.oschina.net/u/858241/blog/209774

<<:  トイレに座ってアルゴリズムを読む: わずか5行のフロイドの最短経路アルゴリズム

>>:  コンピューティング技術を変えた偉大なアルゴリズムを数えてみましょう

ブログ    
ブログ    
ブログ    
ブログ    

推薦する

...

Gen-2 は AI 生成ビデオに革命をもたらします。一言で4K高画質映画が作れる。ネットユーザー「ゲームのルールを完全に変えた」

これは間違いなく、生成 AI の進歩における画期的な出来事です。深夜、Runway の象徴的な AI...

AIネットワークはこれまで考えられていたよりも攻撃に対して脆弱である

人工知能 (AI) ツールは、自動運転車から医療画像解釈まで、さまざまなアプリケーションで使用される...

PyTorchの基本操作の詳細な説明

[[406246]] PyTorch とは何ですか? PyTorch は、最大限の柔軟性と速度を備え...

構築は簡単だが、維持は難しい! Googleの機械学習システムの苦い教訓

[[279958]] 2014年、機械学習の背後に隠れた高い技術的負債を調査したGoogleの論文が...

教師あり学習か教師なし学習か?この問題は明確にされなければならない

この記事は公開アカウント「Reading Core Technique」(ID: AI_Discov...

私の国における AI チップ開発の現状と見通しはどうですか?

近年、人工知能(AI)技術の発展に伴い、多数のAIメーカーが登場しています。 AIにとって、データ、...

機械学習の4つの異なるカテゴリの概要

[[420892]]学習の実行方法に基づいて、アルゴリズムをさまざまなカテゴリに分類できます。教師あ...

Zoomに狂った外国人がビデオ会議ロボットを開発、同僚たちはすでに大笑い

[[321983]]この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI...

Hongmengユニバーサルカードメモリフリップゲームの開発の詳細な説明

1. はじめにワイルド カード フリップ ゲームでは、合計 8 つのまったく異なる画像を持つ 16 ...

さあ、アルゴリズムの複雑さをもう一度理解しましょう!

[[346356]] 0. はじめにみなさんこんにちは。私は、複数選択パラメータのプログラマーポッ...

データが増えるほど、AIの意思決定モデルは脆弱になる

データは人工知能システムを構築するために必要な重要なインフラストラクチャです。データは、AI システ...

柯潔対中国「星陣囲碁」人機対決が今月福州で開催

今月27日、柯潔は福州で再び人工知能と対戦する。対戦相手は中国出身の「Golaxy」。 StarAr...

...