免責聲明:這不是一個家庭作業問題。我甚至不去上學。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書中有一個練習,我不確定。我得出的問題是,我有兩個數組:一個代表一條線的可能的斜率,另一個代表所有可能的y個攔截。目標是使用所有可能的斜坡和兩條線的截距組合來找到它們的交點。我忽略了平行線和重複線(無論如何,考慮到它們不可能平行,隱含地忽略它們,那麼它們不可能是同一條線)。
假設這是前提(我真的不在乎這一點,這只是一個練習),我寫的程序使用4個嵌套for循環。你可以看到爲什麼這會引起我的關注,但是再次,也許他們中的4個是必要的。
由於我不能有平行線,因此我從第一條線開始迭代斜率,然後遍歷數組中所有其他斜率作爲第二條線的斜率。這樣我就可以獲得所有可能的斜坡組合。
攔截是不同的,因爲我可以有一系列相同的攔截,並仍然有不同。所以這些迭代不需要考慮重複。話雖如此,我通過攔截數組迭代的方式應該考慮到這兩行中的每一對可能的對。
如果行不平行,我調用一個函數打印x截距。
我的問題是,這個O(n^4)解決方案可以避免或至少簡化嗎?你有任何處理這些數組的技巧嗎?
+1:「我甚至不去上學」 –
這不是一個真正的n^4問題,它是一個n^2問題。這只是你的n的定義是關閉的 - 這是你比較的行數,而不是斜率和截距的數量。顯然線數是斜率*截距。 –
我認爲n表示算法效率,在這種情況下,4個嵌套for循環將提供O(n^4)的算法,而不是O(n^2)。 –