Pracuję nad algorytmem dziel i rządź (w rzeczywistości taki, który dopasowuje krzywą do wielu punktów wejściowych). W przypadku części "dziel", muszę obliczyć termin błędu dla każdego punktu, a jeśli błąd przekracza dany próg, chcę podzielić krzywą w tym punkcie i oddzielnie przetwarzać lewą i prawą sekcję wejścia. Prosta pętla wykonuje lewę; ale byłoby dla mnie korzystne zacząć od środka obecnej sekcji i pracować na zewnątrz. (Aby wyjaśnić: jeśli znajdę punkt, którego błąd jest zbyt duży, rekurencyjnie wywołuję i generuję oddzielne krzywe dla lewej i prawej sekcji - jeśli wszystkie punkty znajdują się w obrębie progu, to moja krzywa pasuje i wracam).Algorytm pętli nad tablicą od środka na zewnątrz?
Po nieco głowy drapania, wymyśliłem ten (punkty są w tablicy, a obecna sekcja jest od startIndex
do endIndex
włącznie):
int steps = (endIndex+1-startIndex);
int i = (startIndex+endIndex)>>1;
int stepdir = 1;
for(int q=0; q<steps; q++, i+=stepdir*q, stepdir=-stepdir)
{
// test point i here and return early if error exceeds threshold
}
Innymi słowy, zaczynając w pobliżu w środku, idź jeden indeks do przodu, dwa do tyłu, trzy do przodu, cztery do tyłu ... Działa, i jestem pewien, że jest skuteczny, ale wydaje mi się, że powinien istnieć lepszy sposób na zrobienie tego, w szczególności zakończyłem do sprawdzenia specyfikacji języka Java, aby upewnić się, że instrukcje w wyrażeniu dla aktualizacji dokonały oceny w sekwencji (mimo, że nie jest operatorem sekwencji, jak to jest w C/C++).
Wszelkie pomysły wdzięcznie doceniane. Czy istnieje czystszy sposób?
Używasz tej pętli w ramach funkcji rekurencyjnej? tj. rozdzielać i wywoływać rekursywnie w każdym podziale. –
Tak ... Zmieniono pytanie, aby wyjaśnić. Końcowym rezultatem jest seria "prostych" krzywych połączonych w niektórych punktach źródłowych i "wystarczająco blisko" do tych pomiędzy nimi. –