2016-02-03 35 views
0

代碼正確運行,它執行它應該做的事情,但我被告知我可以通過使用布爾表達式來使其更快,但不知道在哪裏插入它們。問題是:有人能告訴我任何不同的方法來使此代碼更快?

給定一系列n個點與它們的座標,編寫一個遠程程序,它計算一個點在矩形之外的最小遠程值。如果一個點不在廣場內部,也不屬於方形輪廓。如果在方格外沒有點,則程序必須輸出0.

限制條件:
1≤n≤10000且1≤a≤1000;
實施例:

輸入: -3 2
-2 2
4 -1
輸出:5

可能有人建議我有什麼技術可以使代碼更有效率?

int remote(int x, int y) { 
    int z = abs(x) + abs(y); 
    return z; 
} 

int main() { 

    int n, a; 
    int x; 
    int y; 

    cin >> n >> a; 

    int z=20001; 
    for (int i = 1; i <= n; i++) { 
     cin >> x >> y; 
     if (x > a/2 || y > a/2) { 
      if (z > remote(x, y)) { 
       z = remote(x, y); 
      }    
     } 
    }  
    cout << z <<endl; 

    return 0; 

} 
+0

附加信息:在平面中,給出了一個邊長爲a,座標系原點處爲中心的正方形。邊與座標軸平行。我們稱給定點的「偏遠」,即點座標絕對值之和。例如,座標爲(2,-3)的點的遙遠距離爲5. – 23ElCaliente

+0

您的代碼看起來像是試圖找到您的要求所說的最大距離,以找到最小的距離。 – NathanOliver

+0

爲了改進**工作代碼**請在[SE代碼審查](http://codereview.stackexchange.com/)詢問。 –

回答

1

其中之一,你打電話remote兩次(在某些情況下)不必要的。 考慮使用此:

#include <algorithm> 

z = std::max(z, remote(x, y)); 

這也將縮短和澄清代碼。


此外,它可能分裂緩慢。嘗試(剖析了!),因爲編譯器會做後期優化的意見代替

x > a/2 || y > a/2 

通過

(x << 1) > a || (y << 1) > a 

注意 @Donnie &他人權利,他們可能是正確的。

+3

位移而不是/ 2(或2的其他冪)是大多數編譯器將會執行的優化。 – Donnie

+0

@Donnie這聽起來很合邏輯。我真的不熟悉那麼多編譯器。我想你是對的。我試圖謹慎( 「可能」, 「輪廓」 等) –

+0

您的意思是像:如果((X << 1) >一個||(Y << 1) >一個){ \t \t \t Z =分鐘(Z,遠程(X, y)); \t \t \t} – 23ElCaliente

1

我想給你看我的機器上的時序:

版本1:

for (int i = 1; i <= n; i++) { 
    cin >> x >> y; 
    if (x > a/2 || y > a/2) { 
     if (z > remote(x, y)) { 
      z = remote(x, y); 
     }    
    } 
} 

版本2:

for (int i = 1; i <= n; i++) { 
    cin >> x >> y; 
/* if (x > a/2 || y > a/2) { 
     if (z > remote(x, y)) { 
      z = remote(x, y); 
     }    
    } 
*/ 
} 

對於n = 10^5,編譯 - O3均產生60ms。編譯沒有優化:兩個60毫秒。

優化的第一步是知道您的程序花費時間。讀取/解析數據是瓶頸。

您可以通過添加作爲一線到主加快一點點:

ios_base::sync_with_stdio(false); 

在我的機器我下來爲20ms。

0

1)分配一個臨時值到remote功能:

if (x > a/2 || y > a/2) 
{ 
    const int r = remote(x,y); 
    if (z > r) 
    { 
     z = r; 
    } 
} 

2)更換調用remoteremote的內容,除去一個函數調用的開銷:

if (x > a/2 || y > a/2) 
{ 
    const int r = abs(x) + abs(y); 
    if (z > r) 
    { 
     z = r; 
    } 
} 

3)用一個常量臨時變量代替a/2

const int midpoint = a >> 1; 
if (x > midpoint || y > midpoint) 

4)將編譯器優化級別更改爲高 - 以獲得速度。

5)瓶頸現在在輸入語句中。通過優化循環的其餘部分獲得的任何增益都會被輸入時間浪費掉。進一步的變化沒有更多的投資回報。

+0

謝謝你的想法:) – 23ElCaliente

相關問題