|
����� � �������, ��������, �������������������:
����� ���������������������, ���������.
���������� ���������� ����� ���������������������.
����� - Eppstein. ������� � ����������� ������ �.
��� ������ ���������, � ��� ����������� ������:
����� � ��� ���� ��������� ������� - �������� ������ � ����� - �������.
��, � ������� �� ������� ������ ��������� � ������, �� ����� �����, ���������� �� ����� ������� � ��� �� ������� ( ��, ��������, �� ������ ���������� ) � ������.
���� ��, �� ������� - ��������������������� ������.
��������:
�������� �� 'nano' ���������������������� 'nematode knowledge' ?
��, ������ ������������ �������.
��� ������ � ���������� ����������������������: 'NemAtode kNOwledge'.
��������� ���� ������ ����� �������� ���:
subseq(char * P, char * T)
{
while (*T != '\0')
if (*P == *T++ && *++P == '\0')
return TRUE;
return FALSE;
}
� ������ ���������� ���� ������.
���, ���� ������� �� ���������� � ������ ? ����� ����� ������ ����� ����� ����� ������� ���������������������, ������� ���������� � ��� � ���.
����� � ������� ������ �����������, ������� ��������� �� ������ �������� A � �. ����� A - m, B - n ��������.
���������� ����������� �������.
��������� ������ ���� ������, ��������� ��������, � ����� �������� ��� ����� ������������ ����������������.
��� ������ - ��������� ������� ����������.
����� � ��� ���� ��� ������, �������� 'nematode knowledge' � 'empty bottle'. ����� �� ����� ����������� ��������������������� ��� ������ ������ ���� ����� ���, ��� ������������ ����� ����� ���� ��� ������:
n e m a t o d e [������] k n o w l e d g e
| | | | | | |
e m p t y [������] b o t t l e
���� �� ��������� ����� ���������� �������, �� ������� ��� �� ��� �� �����������. ������, ����� ���������������� ����� ����� ����� ������ ���������������������.
�� ����� �� ����� ������� ��������� ������� ����: ���� ��� ������ ���������� � ����� �����, �� �� ������ ����� ������� �� ������ �������� ���������������������.
� ������ �������, ����, ��� � ������� ����,
��� ������ ������� ��������, �� ��� �� ����� ���� ������ ����� ���������������������.
����, �� ������, ��� ������ � ������� ���������, � ������ � ��� �������� ������ '���������' - ����� ���������� ����� ��������������������� ��� ���� ������� �����. ����� ������� ����� ��������.
������ ���������� ����� ���������� ���������������������, ����� ������ �� �����. �����, ���� ������ ��� ������� ������, �� ���������, ����� ��������� ���� ������ �������, ����� �� ��� � ���� ������������ �� ������������ ����������������������.
�, ���������������� ������������ �����������������, �� ������, ��� ����� ���� ���������������������.
����, ��� ���������� ���� ��� ���������, ���� �������������, ����������� ��������:
����������� �������:
int lcs_length(char * A, char * B)
{
if (*A == '\0' || *B == '\0') return 0;
else if (*A == *B) return 1 + lcs_length(A+1, B+1);
else return max(lcs_length(A+1,B), lcs_length(A,B+1));
}
���� �������� ����� ��������, ������ �� ������� ������� ����� �������. ���� � ���� ������� ��� ����������� ��������, �� ����� ����������� ������������� ��������������, ������� ( ��� m=n ) ������ � 2n.
�����������.
���������� ������������ ������� � ���, ��� ���������� ��������� ���������� ����� ��� � ������ �����.
��������� ������� � ������ lcs_length � ���������� A � B � �������� ����������, ��� ��� ���� ����� (m+1)(n+1) ��������� ��������. ��� - ������ ��������� �����. ��� ~2n ����������� ������� ��������� �� ��� ����� �������� ����� ��� ������.
�������, ������������ ������������ ����������������, ������� � ��������, � ����� ������ ��� ����� ������ ���������, � � ����� - ��� ��� ������. ����� �� ������ ��������� �����, �� ���������� �������, �� �������� ��� ��� ���.
����� ��� '� ���', �� ������ ������� � ��� ����������� �������� ���, ������� ����� �������� �����. ����� ����������� ������ ������������� ���������������� - '������ ����' ���������� ������������.
��������� ������� �� ���� ��������� ����� �����. ����� ������� � ����������� � ������� �������� ���� �����, ����� ������������ �� ���������� ��������� � �������, � �� ����������� �� ������� (��� ���� ������).
char * A;
char * B;
int lcs_length(char * AA, char * BB)
{
A = AA; B = BB;
return subproblem(0, 0);
}
int subproblem(int i, int j)
{
if (A[i] == '\0' || B[j] == '\0') return 0;
else if (A[i+1] == B[j+1]) return 1 + lcs_length(i+1, j+1);
else return max(lcs_length(i+1, j), lcs_length(i, j+1));
}
������, ��� ����������� ����� � �������� ������������� ����������������, ��� ����� ����� ���� ������������ ������ ��� �������� ������� ��������.
����� ��� ����������� ������� ���������, �� ������ ����� ����������� � ������ � ���������, ���� �� ��� ���. ���� �� - ���������� ���. ��� - ��������� � ��������� ���������.
� �������� �� ����� ���� ������������� �����������, ������� -1 ����� ������, ���������, ��� ��� ������ �� ���������.
char * A;
char * B;
array L;
int lcs_length(char * AA, char * BB)
{
A = AA; B = BB;
allocate storage for L;
for (i = 0; i <= m; i++)
for (j = 0; j <= m; j++)
L[i,j] = -1;
return subproblem(0, 0);
}
int subproblem(int i, int j)
{
if (L[i,j] < 0) {
if (A[i] == '\0' || B[j] == '\0') L[i,j] = 0;
else if (A[i+1] == B[j+1]) L[i,j] = 1 + lcs_length(i+1, j+1);
else L[i,j] = max(lcs_length(i+1, j), lcs_length(i, j+1));
}
return L[i,j];
}
������ ����� ��������� ������� ������������ �������. �� ������ ��� ���� ��� �� ������� ��������� �, ����� �������, ��� ���� ������ ��� �������� ������� � ������� L.
��� ���� ����� (m+1)(n+1) ������ ����, ������� ���������� ������� - �� ����� 2(m+1)(n+1)+1, �, ������, ����� � ������ ������ - O(mn).
������������ ���������������� ����� �����.
��, ��� ���� ������� ���� - ����� ���� ����� ����� ���� �������� ������������ ���������. �� ����� ������� ��� ��������� �������� ���������� ������� L. ������������������ ���������� ������������ ��������, ������ �� �� ���������� ����� �������� � ��� ������ �������.
�� ����� ��������� ���-������ �������, ��� ����� ���� ����������. ������������ �������� - ��� ���������� L[i,j] ��� ����� ����� ��, �� ���� ������� ��� ��������: � ������ ������, ��� L[i+1,j], L[i,j+1] � L[i+1,j+1].
� ������ - ����� ���� �� ������� �����, �� ���������� ���� � �������, � �� ��������� ������� - ����� � ������. ��� �������� ������ ������������, ��������� ����� ������ ��������. ��� ���������� �����-�����, ��� ��� �� ����� ��������� ������ �� ������� �������� � ����� �������.
������������ LCS ( Longest Common Subsequence ):
int lcs_length(char * A, char * B)
{
allocate storage for array L;
for (i = m; i >= 0; i--)
for (j = n; j >= 0; j--)
{
if (A[i] == '\0' || B[j] == '\0') L[i,j] = 0;
else if (A[i+1] == B[j+1]) L[i,j] = 1 + L[i+1, j+1];
else L[i,j] = max(L[i+1, j], L[i, j+1]);
}
return L[0,0];
}
������������� ����� ������ �������� ��, ��� �������� ������ ������� ��������, ��� �� ���� �������������� ������� -1'��, � �� ����������� �� ���� ���������� if: ��� �� ����� ���������, ���� �� ��������� L[i,j], L[i+1,j] � L[i,j+1] ( ��������, ��, ��� � ��� ).
���������� - ����������� ���� ������, ���� ��� ����� ���� ���������� ������ ��� �����.
���� ���������������������.
���, ���� ��� ����� ���� ���������������������, � �� �� �����, ��� ������ ?
�������� ������ L, ��� �������� ����, �� ����� �� �����, ������ ����������� ���.
sequence S = empty
i = 0
j = 0
while min(i,j) > 0
{
if (A[i]==B[j])
{
add A[i] to end of S;
i--; j--;
}
else if (L[i+1,j] >= L[i,j+1]) i++;
else j++;
}
���������� � �������� ������� ��� ���������� �������:
n e m a t o d e _ k n o w l e d g e
e 7 7 6 5 5 5 5 5 4 3 3 3 2 2 2 1 1 1 0
m 6 6 6 5 5 4 4 4 4 3 3 3 2 2 1 1 1 1 0
p 5 5 5 5 5 4 4 4 4 3 3 3 2 2 1 1 1 1 0
t 5 5 5 5 5 4 4 4 4 3 3 3 2 2 1 1 1 1 0
y 4 4 4 4 4 4 4 4 4 3 3 3 2 2 1 1 1 1 0
_ 4 4 4 4 4 4 4 4 4 3 3 3 2 2 1 1 1 1 0
b 3 3 3 3 3 3 3 3 3 3 3 3 2 2 1 1 1 1 0
o 3 3 3 3 3 3 3 3 3 3 3 3 2 2 1 1 1 1 0
t 3 3 3 3 3 2 2 2 2 2 2 2 2 2 1 1 1 1 0
t 3 3 3 3 3 2 2 2 2 2 2 2 2 2 1 1 1 1 0
l 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 0
e 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
( �� ������ ���������: ��� ��������� ���������, ������� �� ����, � ������� )
����� ����� ���������� ����� ���������������������, ��������� �� ������ ������ L[0,0]. ��� 7, ������ � ������������������ 7 ��������. L[0,0] ���� ��������� ��� max( L[0,1] , L[1,0] ),
������� �������� ���������� ��� �������� 'n' �� ������ ������ ��� 'e' �� ������.
�������� 'n' ���� ��� ��������������������� ����� L[0,1]=7, � �� ����� ��� �������� 'e' - ������ L[1,0]=6, ��� ��� �� ����� ������� ���� 'n'. ��������� �� ������ L[0,1], �c�������� ����� ����� ��������. A[0]=B[1]='e', ��� ��� �� ����� ��� ������� �������� ��� 'e' � ��������������������� � ������� � L[1,2]=6. ����������, ��� ���� 'm'... ��������� � ��� �� ���� ( � ����� �������, ��� � ��������� ����, �������� ����, � �� ��������� ) �� �������� ����� ���������������������: 'emt ole'.
����, �� ����� LCS �� ����� O(mn). ������, �������� �� �������, ����� ��������, ��� ��� ����� ������ �������� ���������: ������� ����� � ����������� ���������� - � ��������� ��������� '�����', ��� �������� ��������. ���� ��� ������������, �� ����� �������� ����������� O(n log s + c log log min(c,mn/c)), ��� � - ����� ����� �����, � s - ����� ��������, ������������ � ���� �������.
��������� ���������� � ������.
���� �� ����������� ���������� ������ ������������� ����������������, �� ��������� � �������� ��������� - � ���, ��� �� ������� O(mn) ������ �� ������ L ( �������� - O(n+m) ).
�� ������������ ������ ������ ����� ���� ����������������, ����� ������������ ������ ������������:
����� ���������� i-�� ���� ��� ��� �� ����� �������� � ���� i+1.
�� �������������� � ������ LCS:
int lcs_length(char * A, char * B)
{
allocate storage for one-dimensional arrays X and Y
for (i = m; i >= 0; i--)
{
for (j = n; j >= 0; j--)
{
if (A[i] == '\0' || B[j] == '\0') X[j] = 0;
else if (A[i+1] == B[j+1]) X[j] = 1 + Y[j+1];
else X[j] = max(Y[j], X[j+1]);
}
Y = X;
}
return X[0];
}
��������� ������� �������� ����� �� ( + ��������� ��������� ), ������ ������ ����� ���� O(m) ��� O(n) - ��� ������ ( ������ �� �������, ���� ����, ����� ����� ���� ������, ��� ��������).
�� ����� ������� ���� ��� ���� ����� ���������������������, ������ ��������� ����������.
| |