2010-10-22 37 views
5

我有以下任務線:算法找到包圍一個點

在我們應該得出一個位圖顯示上線的計劃。一組n對定義nyi = ai*x + bi。該線是在x -interval [0, 1]在這個意義上下令yi < yi+10n-2之間併爲x所有值的i所有值[0, 1]

不太正式的,該線不垂直觸摸板。給定一個點(x,y),其中0 < x < 1,我們要確定兩條支線的點。

我們該如何快速解決這個問題?

回答

1
Function bracket(Real x, Real y, Array a[1..n],b[1..n] of Reals): Returns void 
{ 
    Integer i = 1; 

    While (i<=n && (a[i] * x + b[i]) <= y, i++) 

    If (i==1 || i == n+1) 
         { Print("Not bracket exists"); 
         Exit() 
         } 
    If (a[i] * x + b[i]) == y) 
         { Print("Point lies on line",i); 
         Exit() 
         } 
    Print("Point between lines ", i-1, " and ", i); 
} 

然而,有一點點的捕捉。見下圖:

alt text

你會說,F點在[0,1]×[0,1]「括號」,由兩條線?這種情況下的正確答案是什麼?

+0

也許二進制搜索會更快? – Dialecticus 2010-10-26 12:57:59

+1

@Dialecticus也許我錯誤地理解了OP(「我們如何快速解決這個問題?」)。如果「快速」意味着O(logn)你是對的,如果「快速」意味着只用一個指令,那麼上面的「while」循環就可以做到。在此環境中使用之前從未看到「快速」:) – 2010-10-26 18:07:02