2012-04-18 75 views
4

我想知道哪個是最好的方法來創建兩個查找表的平方根和立方根的浮點值範圍[0.0, 1.0)正方形/立方根查找表

我已經對代碼進行了剖析,發現這是一個相當強大的性能瓶頸(因爲我需要計算它們的數十個數千個值)。然後我想起了查找表,並認爲他們會幫助我提高性能。

由於我的數值在一個小範圍內,我在考慮用步驟來分割範圍,比方說,0.0025(希望已經足夠了),但我不確定哪個應該是檢索它們的最有效方法。

我可以很容易地填充查找表,但我需要一種方法來有效地獲得給定的浮動(這是沒有任何步驟離散化)的正確值。對此問題有何建議或衆所周知的方法?

我正在使用移動平臺,只是爲了說明。

在此先感謝

+0

你想要某種O(1)查找?然後重新解釋爲int或做一個簡單的數學運算,可以給你一個表中的索引。 – 2012-04-18 18:27:28

+0

你需要什麼精度以及準備用於查找表的內存有多少? – 2012-04-18 18:29:12

+0

這個值然後用來計算高度圖,它被分成10個不同高度的條紋,所以我猜不需要太高的精度。在實施解決方案後,我應該調查我確實需要多少。關於內存,由於這只是暫時的一步,我沒有真正嚴格的要求,但它是一個移動平臺,所以我應該是合理的(<1MB?) – Jack 2012-04-18 18:31:34

回答

3

你有(1.0-0.0)/0.0025 = 400步

只需創建一個400x1矩陣,並通過400

由你想要的平方/立方浮動相乘來訪問它例如,如果你想查找0.0075的平方。乘以0.0075乘以400得到3,它是矩陣中的索引

+0

400x2矩陣,不是嗎? – 2012-04-18 18:29:12

+0

我的不好; 400x1實際上就夠了! – jelgh 2012-04-18 18:30:41

0

你可以通過任何你想要的精確度乘以值,然後使用哈希表因爲其結果將是整數值。

例如,而不是使用像0.002浮點鍵值,給自己的三個或四個精確到小數點,使你的鍵值爲0.002等於2002000。然後,您可以快速查找存儲在2000插槽的散列表項中的正方形和立方根的結果浮點值。

如果您希望從非離散範圍插槽之間獲取值,則可以使用數組或樹而不是散列表,以便可以通過以下方式生成「中間」值:在存儲在兩個相鄰鍵值槽中的根之間進行插值。

+0

如果這些密鑰是連續的,則陣列會大幅度地哈希表查找性能。 – 2012-04-18 18:54:48

1
double table_sqrt(double v) 
{ 
    return table[(unsigned int)(v/0.0025)]; 
} 
+0

乘法會影響部門性能,並且根據編譯選項,優化程序可能無法爲您進行更改。 – 2012-04-18 18:55:58

0

如果您只需要分成10個不同的條紋,找到對應於條紋間閾值的輸入,並使用展開的二進制搜索來測試這些條紋9個值。或者在完成閾值測試之前是否需要額外的計算,以便查找的值不是最終結果。