-
2つの数値の乗算のためのSchonhage-Strassenアルゴリズムを実装するC++プログラム
Schonhage-Strassenアルゴリズムは、2つの数値を乗算するために使用されます。 SchonhageStrassenアルゴリズムは、大きな整数に対して漸近的に高速な乗算アルゴリズムです。実際には、Schonhage-Strassenアルゴリズムは、2 2 を超える数で、カラツバやToom-CooKなどの古い方法よりも優れたパフォーマンスを発揮し始めます。 15 〜2 217 (10進数で10,000〜40,000)桁。 アルゴリズム Begin function noOfDigit( x) Declare a varia
-
ロシアの農民の乗算を実装するためのC++プログラム
2つの数値を乗算するロシアの農民アルゴリズム。これは、2つの長い数値の乗算を計算するための迅速なアルゴリズムです。 アルゴリズム Begin Russianpeasant(num1, num2) Int result=0 while (num2 > 0) if (num2 and 1) result = result + n; num1
-
オイラーの定理を実装するC++プログラム
これは、オイラーの定理の実装を示すC++プログラムです。モジュラ逆数が存在するためには、数とモジュラが互いに素でなければなりません。 アルゴリズム Begin Take input to find modular multiplicative inverse Take input as modular value Perform inverse array function: modInverse(x + 1, 0); modInverse[1] = 1; for i = 2 to x modInverse[i] = (-(y / i) * mo
-
拡張ユークリッドアルゴリズムを実装するためのC++プログラム
拡張ユークリッドアルゴリズムは、2つの数値のGCDを計算するもう1つの方法です。 ax + by =gcd(a、b)を計算するための追加の変数があります。コンピュータプログラムで使用する方が効率的です アルゴリズム Begin Declare variable a, b, x and y gcdExtended(int a, int b, int *x, int *y) if (a == 0) *x = 0; *y = 1; return b; Take two variables to store the result Update
-
フェルマーの小定理を実装するためのC++プログラム
フェルマーの小定理は、初等数論の基本的な結果の1つであり、フェルマーの素数判定の基礎となります。この定理は、1640年にそれを述べたピエールドフェルマーにちなんで名付けられました。この定理は、pが素数の場合、任意の整数aに対して、数値a p–aはpの整数倍であると述べています。 アルゴリズム Begin Function power() is used to compute a raised to power b under modulo M function modInverse() to find modular inverse of a
-
0-1ナップサック問題を解決するためのC++プログラム
0-1ナップサック問題では、それぞれに重みと値を持つアイテムのセットが与えられます。合計重量が指定された制限以下になり、合計値が可能な限り大きくなるように、コレクションに含める各アイテムの数を決定する必要があります。 入力 Value = [10, 20, 30, 40, 60, 70] Weight=[1, 2, 3, 6, 7, 4] int w=7 出力 knapsack value is: 100 アルゴリズム Begin Input: set of items each with a weight and a value Set knapsack capacity
-
フラクショナルナップサック問題を解くためのC++プログラム
分数ナップサック問題では、それぞれに重みと値を持つアイテムのセットが与えられます。ナップザックの合計値を最大化するためにアイテムを壊す必要があり、これは貪欲なアプローチで行うことができます。 アルゴリズム Begin Take an array of structure Item Declare value, weight, knapsack weight and density Calculate density=value/weight for each item Sorting the items array on the order of decreasing density We a
-
可能なすべての方法で整数の分割を実行するC++プログラム
これは、パーティションを追加すると整数になるように、特定の整数のすべての一意のパーティションを取得するC++プログラムです。このプログラムでは、正の整数nが与えられ、nを正の整数の合計として表すためのすべての可能な一意の方法を生成します。 アルゴリズム Begin function displayAllUniqueParts(int m): Declare an array to store a partition p[m]. Set Index of last element k in a partition to
-
ビンパッキングアルゴリズムを実装するためのC++プログラム
ビンパッキング問題は、特殊なタイプのカッティングストック問題です。ビンパッキング問題では、使用されるビンの数を最小限に抑える方法で、異なるボリュームのオブジェクトを有限数のコンテナーまたは各ボリュームVのビンにパックする必要があります。計算の複雑さの理論では、これはNP困難な組み合わせの問題です。 ビンの数が1に制限され、各アイテムがボリュームと値の両方で特徴付けられる場合、ビンに収まるアイテムの値を最大化する問題はナップサック問題と呼ばれます。 アルゴリズム Begin Binpacking(pointer, size, no of sets) &n
-
DFT係数を直接計算するC++プログラム
離散フーリエ変換(DFT)では、関数の等間隔のサンプルの有限リストが、複素正弦波の有限の組み合わせの係数のリストに変換されます。サンプリングされた関数を元のドメイン(多くの場合、時間または線に沿った位置)から周波数ドメインに変換するために、同じサンプル値を持つ周波数順に並べられました。 アルゴリズム Begin Declare three variables which are the coefficient of linear equation and max value Read the variables Define a class with two variable
-
素朴なアプローチを使用して離散フーリエ変換を計算するC++プログラム
離散フーリエ変換(DFT)では、関数の等間隔のサンプルの有限リストが、複素正弦波の有限の組み合わせの係数のリストに変換されます。サンプリングされた関数を元のドメイン(多くの場合、時間または線に沿った位置)から周波数ドメインに変換するために、同じサンプル値を持つ周波数順に並べられました。 アルゴリズム Begin Take a variable M and initialize it to some integer Declare an array function[M] For i = 0 to M-1 do &nb
-
複雑な2Dアレイが与えられた場合、C++は2DFFTインプレースで実行します
高速フーリエ変換(FFT)は、離散フーリエ変換(DFT)とその逆関数を計算するアルゴリズムです。基本的に、フーリエ解析は時間(または空間)を周波数に、またはその逆に変換します。 FFTは、DFT行列をスパース(ほとんどゼロ)因子の積に因数分解することにより、変換を迅速に計算します。 アルゴリズム Begin Declare the size of the array Take the elements of the array Declare three arrays Initialize
-
行列指数を使用してフィボナッチ数を見つけるC++プログラム
一般にFnで表されるフィボナッチ数は、フィボナッチ数列と呼ばれる数列を形成します。各数値は、0と1から始まる、先行する2つの数値の合計です。つまり- F0 = 0 and F1 = 1 And Fn = Fn-1 + Fn-2 for n > 1. アルゴリズム Begin Take two 2 dimensional array Create a function and Perform matrix multiplication Create another function to find out power of matrix Create a funct
-
ランダム化を使用してクイックソートを実装するC++プログラム
クイックソート手法は、リストを2つの部分に分割することによって行われます。最初に、ピボット要素は分割アルゴリズムによって選択されます。ピボットの左側の部分はピボットよりも小さい値を保持し、右側の部分は大きい値を保持します。分割後、それぞれの個別のリストは同じ手順を使用して分割されます。 この場合、ピボット要素をランダムに選択しています。ピボットを選択した後、パーティショニングを実行し、配列を再帰的に並べ替えます。 クイックソート手法の複雑さ 時間計算量 − O(n log n)は、最良の場合と平均的な場合、O(n 2 )最悪の場合。 スペースの複雑さ − o(log n)
-
O(n)の複雑さで100未満の数値のソートを実装するC++プログラム
線形時間でいくつかの小さな数値を並べ替えるには、カウント並べ替え手法を使用できます。 カウントソートは安定したソート手法であり、少数のキーに従ってオブジェクトをソートするために使用されます。キー値が同じキーの数をカウントします。この並べ替え手法は、異なるキー間の差がそれほど大きくない場合に効率的です。そうでない場合は、スペースが複雑になる可能性があります。 ソート手法のカウントの複雑さ 時間計算量 :O(n + r) スペースの複雑さ :O(n + r) Input − A list of unsorted data: 2 5 6 2 3 10 3 6 7 8 O
-
多数の要素でクイックソートを実行するC++プログラム
クイックソート手法は、リストを2つの部分に分割することによって行われます。最初に、ピボット要素は分割アルゴリズムによって選択されます。ピボットの左側の部分はピボットよりも小さい値を保持し、右側の部分は大きい値を保持します。分割後、それぞれの個別のリストは同じ手順を使用して分割されます。 ここでは、ソートする大きな配列(ほぼ100個の要素)を検討しています。いくつかの番号を取得し、ランダム化された順序でシャッフルして、並べ替えられないようにします。次に、クイックソート手法を使用して並べ替えます。 クイックソート手法の複雑さ 時間計算量 − O(n log n)は、最良の場合と平均的な場合
-
リンクリストにマージソートアルゴリズムを実装するC++プログラム
マージソート手法は、分割統治手法に基づいています。 whileデータセットを小さな部分に分割し、並べ替えられた順序で大きな部分にマージします。このアルゴリズムは最悪の場合にも時間計算量が少ないため、最悪の場合にも非常に効果的です。 リンクリストは、merge-sortを使用して非常に効率的に並べ替えることができます。リンクリストの場合、マージタスクは非常に簡単です。リンクを更新してマージするだけです。このセクションでは、このアプローチを使用してリンクリストを並べ替える方法を説明します。 マージソート手法の複雑さ 時間計算量 −すべての場合のo(n log n) スペースの複雑さ
-
隣接行列を使用してグラフを表現するC++プログラム
グラフの隣接行列は、サイズV x Vの正方行列です。Vは、グラフGの頂点の数です。この行列では、各辺にV個の頂点がマークされています。グラフにiからjの頂点までのエッジがある場合、i thの隣接行列に 行とjth 列は1(または加重グラフの場合はゼロ以外の値)になります。それ以外の場合、その場所は0を保持します。 隣接行列表現の複雑さ 隣接行列表現はO(V 2 )計算中のスペースの量。グラフに最大数のエッジと最小数のエッジがある場合、どちらの場合も必要なスペースは同じになります。 入力 出力 0 1 2 3 4 5
-
接続行列を使用してグラフを表現するC++プログラム
グラフの接続行列は、メモリに保存するグラフの別の表現です。この行列は正方行列ではありません。接続行列の次数はVxEです。ここで、Vは頂点の数、Eはグラフのエッジの数です。 この行列の各行に頂点を配置し、各列にエッジを配置します。エッジe{u、v}のこの表現では、列eの場所uとvに対して1でマークされます。 隣接行列表現の複雑さ 接続行列表現は、計算中にO(Vx E)のスペースを取ります。完全グラフの場合、エッジの数はV(V-1)/2になります。したがって、接続行列はメモリ内でより大きなスペースを取ります。 入力 出力 E0 E1 E2
-
隣接リストを使用してグラフを表現するC++プログラム
グラフの隣接リスト表現は、リンクリスト表現です。この表現では、リストの配列があります。配列のサイズはVです。ここで、Vは頂点の数です。つまり、V個の異なるリストを格納する配列があると言えます。リストヘッダーが頂点uの場合、uの隣接するすべての頂点を保持することを意味します。 隣接リスト表現の複雑さ この表現は、無向グラフの場合はO(V + 2E)を取り、有向グラフの場合はO(V + E)を取ります。エッジの数を増やすと、必要なスペースも増えます。 入力: 出力: アルゴリズム add_edge(adj_list、u、v) 入力 −エッジ{u、v}のuとv、およ