免責事項:これは宿題の問題ではありません。私は学校に行くことさえしません。このO(n^4)アルゴリズムは回避できますか?
#include <stdio.h>
void printIntersect(float, float, float, float);
int main(){
int x, y, z, a;
float slopes[] = {5, 9, 4/3.0f, 2/3.0f, 3};
float inter[] = {3, 2, 1, 0, 5/3.0f};
for(x = 0; x < (sizeof(slopes)/sizeof(slopes[0])) - 1; x++)
for(y = 1; y < (sizeof(slopes)/sizeof(slopes[0])); y++)
for(z = 0; z < sizeof(inter)/sizeof(inter[0]); z++)
for(a = 0; a < sizeof(inter)/sizeof(inter[0]); a++)
if(slopes[x] != slopes[y])
printIntersect(slopes[x], slopes[y], inter[z], inter[a]);
return 0;
}
void printIntersect(float m_one, float m_two, float b_one, float b_two){
float m_final, b_final, x_intersect;
m_final = m_one - m_two;
b_final = b_two - b_one;
if(m_final < 0 && b_final < 0)
m_final *= -1.0f, b_final *= -1.0f;
if (b_final != 0)
x_intersect = b_final/m_final;
else
x_intersect = 0;
printf("The intersection of y = %.2fx %c %.2f and y = %.2fx %c %.2f is x = %.2f\n",
m_one, (b_one < 0) ? '-' : '+', b_one, m_two, (b_two < 0) ? '-' : '+', b_two, x_intersect);
return;
}
シナリオ:私のCの本の1つでは、私には分かりません。私が問題にしたのは、2つの配列を持つことでした:1つはラインの可能な傾きを表し、もう1つはすべての可能なyインターセプトを表します。目的は、交差点を見つけるために、2つの線でスロープと切片のすべての可能な組み合わせを使用することでした。私は平行線と重複する行を無視していました(たとえ平行でない場合は暗黙のうちに無視され、同じ行になることはありません)。
これが前提である(と私は実際には気にしませんが、これは単なる練習です)、私が書いたプログラムは4個のforループを使用しています。それがなぜ私に関係するのか分かりますが、もう一度、おそらく4つが必要かもしれません。
私は平行線を持つことができないので、最初の線で開始してスロープを反復し、2番目の線のスロープとして配列の他のすべてのスロープを反復処理します。それは私が斜面のすべての可能な組み合わせを得るこの方法です。
私は同じインターセプトのラインを持つことができ、それらはまだ異なっているので、インターセプトは異なります。だから、それらの間の反復は重複を説明する必要はありません。つまり、インターセプトの配列を反復する方法は、その2つの行の可能なすべてのペアを説明する必要があります。
行が平行でない場合は、x切片を出力する関数を呼び出します。
私の質問は、このO(n^4)解決策は回避できましたか、少なくとも簡略化できましたか?これらのような配列の処理に関するヒントはありますか?
+1:「学校に行かない」 –
これは本当にn^4の問題ではなく、n^2の問題です。あなたのnの定義がオフであることだけです。これは、比較している行の数であり、勾配と切片の数ではありません。明らかに、ラインの数はスロープ*インターセプトです。 –
私はnをアルゴリズム効率と見ました。この場合、ネストされたforループはO(n^2)ではなくO(n^4)のアルゴリズムを提供します。 –