어쩌면 나 의사 C++ 내 상황을 진술 할 동적 크기 벡터 채우기 - 첫 번째 코드를 :재귀
CONCAT 그냥, 음, 반환 된 벡터를 concatsstd: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);
}
. 기본적으로 두 가지 저장된 함수 값 사이에 작은 차이 만있는 방식으로 함수를 샘플링합니다.
모든 반복적 인 단계에서 꽤 많은 메모리 할당 (두 개의 서브 벡터를 할당 한 다음 이들과 다른 요소를 할당)이있는 것처럼 보이기 때문에 위의 방식에 만족하지 않습니다. 이 코드 조각은 성능 측면에서 중요한 알고리즘의 일부에서 실행해야합니다. 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)
을 내가 (가장 성능이 좋은대로) 접근 방식이를 구축하기 위해 최선을 찾고 있어요 벡터 재귀 적으로.
희망 사항.
나는 귀하의 문제를 정말로 이해하지 못합니다. 입력 및 예상 출력을 예로들 수 있습니까? –
여기 "성능에 중요한"은 실제로 시간이 중요하거나 공간이 중요한 것을 의미합니까? 대부분의 경우 그들은 모순입니다. –
@ Space_C0wb0y : 질문에 대한 또 다른 접근법을 추가했습니다. 잘하면이 도움이됩니다. – Thilo