2013-05-14 58 views
0

我嘗試從數組中選擇最接近的浮點值時出現問題。以下是一些示例數據;在數組中搜索最接近的浮點值

我將要處理的數字總是共享這種鏡像特性。

{-9,-3,-1,0,1,3,9} 

如果我搜索-8.8,我希望返回-9。

如果我搜索了8.8我希望尋找陣列的最接近的值,我會去通過陣列跟蹤絕對值對於每個數組元素減去值時,我要返回9.

在過去通緝。最小的值會贏。

這種方法在這裏提出了一個問題對我來說壽,因爲在陣列中至少2個數字是「最接近」(在我上面的例子9 & -9)

+0

這確實是一個錯字。我編輯了我的問題 – dubbeat 2013-05-15 08:53:56

回答

0

因爲,正如你提到的,您的號碼是總是鏡像在零附近,然後只檢查負數(假設數組已排序)。你會避免提到的問題。那麼0.5呢?它也有兩個距離相等的數字。你將如何打破領帶?

+0

該數組將始終被排序。所以我猜如果我的搜索值小於0,搜索數組的前半部分,如果大於0搜索數組的後半部分?這是我現在要嘗試的。在0.5的情況下......我不確定 – dubbeat 2013-05-14 13:24:31

2

您的數組將始終被排序,因此二分搜索應該可以將候選集合減少到最大2個數組值。我只能想象一個挑戰,如果原始數組包含浮點數,其中一些差異小於機器精度,那麼就會出現這種挑戰。

如何處理這種情況最好取決於你的應用程序(如果它不是首先深奧的);但是請注意,所有與您的測試值無法區分的值將在您的數組中形成一個連續的子序列,因此作爲啓發式,您可以選擇此子序列的中間元素。

1

事實上,你的數組是鏡像使得這很容易。您最初可以忽略搜索值的符號,如您所述,只需找到最接近的絕對值即可。然後修復標誌。

這是Python,但它應該足夠接近僞代碼,您可以將其轉換爲任何您需要的。

def find_closest(search_val): 
    smallest_diff = float(inf) 
    closest_val = 0 
    # Search only positive half of array 
    for val in [0, 1, 3, 9]: 
     # Treat search_val as positive for now 
     diff = abs(val - abs(search_val)) 
     if diff < smallest_diff: 
      smallest_diff = diff 
      closest_val = val 
    # Correct sign of result 
    if search_val < 0: 
     closest_val = -closest_val 
    return closest_val