- •Глава 5
- •1. Понятие множества. Представление множества для вычислений
- •2. Набор операций для множеств
- •3. Алгоритмы выполнения основных операций над множествами и их эффективность
- •4. Получение полных наборов комбинаторных объектов. Перестановки
- •Void main()
- •Int next_permut(int* p, int n)
- •Void main()
- •5. Подмножества
- •Void main()
- •Int next_subset(int n, int r, int*& b)
- •Void main()
- •6. Разбиения
- •7. Поиск наибольшей монотонно возрастающей подпоследовательности
- •Int subsetnext(int n, int r, int* q)
- •Int subs2(int n, int* X)
- •Int subs3(int n, int* b)
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) = cnln(n) .
Результаты испытания алгоритма.
Тестирование быстрого алгоритма выполнялось при таких же условиях, как и для метода рейтингов. Время выполнения алгоритма равно 0.05 с. Асимптотический класс функции сложности:
Ft(n) = O(nln(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