längste nondecreasing Teilfolge in O(nlgn)

Habe ich den folgenden Algorithmus, die gut funktioniert

Habe ich versucht zu erklären, es hier für mich http://nemo.la/?p=943 und es ist hier erklärt http://www.geeksforgeeks.org/longest-monotonically-increasing-subsequence-size-n-log-n/ als auch auf stackoverflow sowie

Ich möchte es ändern zu produzieren, die längste non-monoton steigende Teilfolge

für die Folge 30 20 20 10 10 10 10

die Antwort sollte 4 sein: "10 10 10 10"

Aber das mit nlgn version des Algorithmus, es funktioniert nicht. Initialisieren s enthalten das erste element "30" und ab an das zweite element = 20. Dies ist, was passiert:

  1. Den ersten Schritt: 30 nicht größer als oder gleich 20. Wir suchen das kleinste element größer als 20 sein. Der neue s wird "20"

  2. Der zweite Schritt: 20 ist größer als oder gleich 20. Wir verlängern die Sequenz und s enthält jetzt "20 20"

  3. Der Dritte Schritt: 10 ist nicht größer als oder gleich 20. Wir suchen das kleinste element größer als 10 "20". Der neue s wird "10 20"

und s wird nie wachsen nach, und der Algorithmus zurück 2 statt 4

int height[100];
int s[100];

int binary_search(int first, int last, int x) {

    int mid;

    while (first < last) {

        mid = (first + last) /2;

        if (height[s[mid]] == x)
            return mid;

        else if (height[s[mid]] >= x)
            last =  mid;

        else
            first = mid + 1;
    }
    return first; /* or last */
}

int longest_increasing_subsequence_nlgn(int n) {

    int i, k, index;

    memset(s, 0, sizeof(s));

    index = 1;
    s[1] = 0; /* s[i] = 0 is the index of the element that ends an increasing sequence of length  i = 1 */

    for (i = 1; i < n; i++) {

        if (height[i] >= height[s[index]]) { /* larger element, extend the sequence */

            index++; /* increase the length of my subsequence */
            s[index] = i; /* the current doll ends my subsequence */

        }
        /* else find the smallest element in s >= a[i], basically insert a[i] in s such that s stays sorted */
        else {
            k = binary_search(1, index, height[i]);

            if (height[s[k]] >= height[i]) { /* if truly >= greater */
                s[k] = i;
            }
        }
    }
    return index;
}
  • Durch nicht-monoton ansteigende Sequenz, meinst du nicht monoton Steigend? Das ist for every i>j: x[i]>=x[j]?
  • ja sorry, ich war verwirrend: es sollte "nondecreasing"
InformationsquelleAutor | 2014-02-12
Schreibe einen Kommentar