或許讓我說出我的僞C++的情況 - 先代碼:填寫動態大小的矢量遞歸
std:vector<double> sample(someFunctor f, double lower, double upper) {
double t = (lower + upper)/2;
double newval = f(t);
if (f(upper) - newval > epsilon)
subsample1 = sample(f, t, upper);
if (newval - f(lower) > epsilon)
subsample2 = sample(f, lower, t);
return concat(subsample2, newval, subsample1);
}
其中CONCAT公正,良好,concats返回的載體。基本上,我正在對一個函數進行採樣,使得兩個保存的函數值之間只有很小的差別。
我對上述方式不滿意,因爲在每個遞歸步驟中似乎都有相當多的內存分配(分配兩個子向量,然後將這些和另一個元素連接)。那段代碼必須運行在我的算法中,這對性能至關重要。一旦upper - lower
相當小,評估f
將不會花費大量的時間。
所以我的問題:
你看到使用相同的數據結構中的所有遞歸調用,只是填補向量的當前部分一個聰明的辦法? (請記住,需要的功能評估的數量不是預先知道的)。關於此的想法:
- 使用列表而不是矢量。但我覺得內存大修並不足以存儲雙打。
- 保留向量中的孔,並維護另一個向量來說明哪些條目被填充。遞歸調用的結束會使條目移動,以便在
subsample
和newval
之間沒有漏洞。但現在我通過轉移第二個向量的額外工作來切換複製 - 可能是個壞主意。
您是否看到一種完全擺脫遞歸的方法?然而,爲了正確性,我使用上述的分而治之模式很重要。功能
f
大量使用了上下界,並通過此功能獲得了相當大的性能。
感謝您的想法。
根據Space_C0wb0y的請求,讓我試着重新解釋我的問題。也許第一個解釋不是很清楚。
我有一些函數(在數學意義上),我想在給定的時間間隔內抽樣(例如在某些點評估)。
假設間隔爲[0,100]。我知道0和100的函數值。也許這就是f(0)=0
和f(100) = 40
。 現在我評估的功能在間隔中點,這是50.說,我的函數返回f(50)=10
。 由於f(0)-f(50) <= 10
,我不需要在區間[0,50]中進一步採樣。但是,我需要進一步計算區間[50,100]。因此,在下一個(遞歸)步驟中,我評估f(75)
。現在遞歸地重複上述邏輯。
最後我想(二)矢量給我,像這樣的相應參數的函數值:
parameter = vector(0, 50, 56.25, 62.5, 75, 100)
value = vector(0, 10, 17.21, 25 34, 40)
我正在尋找最好的(這是最高效的)的方式來構建這些遞歸的向量。
希望澄清一些事情。
我真的不明白你的問題。你可以舉一個例子輸入和預期輸出嗎? – 2011-06-15 08:25:53
這裏「性能至關重要」的確意味着時間關鍵或空間關鍵?大多數時候他們是矛盾的。 – 2011-06-15 08:54:51
@ Space_C0wb0y:增加了另一種解決問題的方法。希望這有助於。 – Thilo 2011-06-15 08:57:03