Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
АиПА / Лекции / 6_Комбинаторные задачи и вычисл на множествах.doc
Скачиваний:
16
Добавлен:
07.02.2016
Размер:
150.53 Кб
Скачать

Int subs2(int n, int* X)

{ int i,k,L=1;

int* p= new int[N];

for (i=0;i<N;i++) p[i]=1;

for (i=0;i<N;i++)

for (k=i+1;k<N;k++)

{ if (x[k]>x[i] && p[i]+1>p[k]) p[k]=p[i]+1;

if (p[k]>L) L=p[k];

}

delete[] p;

return L;

}

Результаты испытания алгоритма.

Исходная последовательность  случайные числа из интервала [0, 999]. Длина исходной последовательности: 150 000. Найденная длина наибольшей монотонно возрастающей подпоследовательности: 624. Время выполнения: 73.3 c.

Асимптотический класс функции сложности для метода рейтингов:

Ft(n) = O(n2) .

Алгоритм 3: быстрый (Робинсона-Шенстеда (Robinson-Schensted algorithm))

В этом алгоритме последовательно формируется вспомогательная последовательность m, длина которой равна длине обнаруженной подпоследовательности, а элемент последовательности mi говорит о том, что существует монотонная подпоследовательность, в которой элемент исходной последовательности, равный mi занимает позицию номер i.

Int subs3(int n, int* b)

{ int i, j, L = 0;

int* m = new int[N];

for (i = 0; i < N; i++) m[i] = 0;

m[0] = b[0];

for (i = 1; i < N; i++)

{ if (b[i] > m[L]) m[++L] = b[i];

else for(j = 0; j <= L; j++) if (b[i] < m[j]) { m[j] = b[i]; break; }

}

delete[] m;

return L + 1;

}

Отметим следующее. Вспомогательная последовательность m является монотонно возрастающей по построению. Для выполнения поиска элемента mi для его замены при невыполнении условия b[i]>m[L] можно использовать метод бинарного поиска. Именно в этом случае и получаем F(n) = cnln(n) .

Результаты испытания алгоритма.

Тестирование быстрого алгоритма выполнялось при таких же условиях, как и для метода рейтингов. Время выполнения алгоритма равно 0.05 с. Асимптотический класс функции сложности:

Ft(n) = O(nln(n)) .

Результаты испытания алгоритма.

Тестирование быстрого алгоритма выполнялось при таких же условиях, как и для метода рейтингов. Время выполнения алгоритма равно 0.05 с.

Ниже в таблице показано преобразование рабочего массива m по шагам для исходной последовательности A = < 7, 3, 5, 4, 8, 0, 5, 6, 2, 9 >.

7

3

5

4

8

0

5

6

2

9

7

7

3

3

5

3

5

4

3

4

8

3

4

8

0

0

4

8

5

0

4

5

6

0

4

5

6

2

0

2

5

6

9

0

2

5

6

9