|
����� � �������, ��������, �������������������: ������ ����� ��������� � ������.
�������� �������-������
������� � ����������� - ������ �.
���� �������� �������� � ���������� ����������� ������� ��������� ������ ����. ������������� ������ ����� ������� ����� ����� ������������ ����������, ���������� �� ����� ������������ ( �������� ������ ���� �� ������ ����������� ;-( ).
����, ������� � �� �������� �� ���� �������. �����������, ������ ������ ������� ����� ���������, �������������� �������� ����� ������, ����������� � ��������. ��� �������� ��� �������� �������� ��������� �, ��� �����, ����� ��������� �������� ������.
���������� ��������� �� ������� i, ��� ������� x[ 0, m - 1 ] �������������� � ������ ������ y[ i, i + m - 1 ]. �����������, ��� ������ ������������ ��������� ����� y[ i + j ] � x[ j ] , ��� 1 < j < m. ����� y[ i, i + j - 1 ] = x[ 0, j - 1 ] = u � a = y[ i + j ] =/= x[ j ] = b.
��� ������ ������ ����� �������, ��� ������� ������� u �������� � �����-������ ��������� �������� ������ u. �������� ������� ����� ������� - ������� u ( �� ����������� �� ����� ������ u ). ��� �������� ��� � ���������� ���������: ����� mp_next[ j ] - ����� ������� x[ 0, j - 1 ]. ����� ����� ������ �� ����� ����������� ��������� � ����� y[ i + j ] � x[ j - mp_next[ j ] ] ��� ������ ���������� ��������������� �������. ������� mp_next ����� ���� ��������� �� O( m ) ����� ����� �������.
������������ ����� ��������� �� 1 ������ - m
���������� �� ��
/* Preprocessing */
void PRE_MP( char *x, int m, int mp_next[] ) {
int i, j;
i=0;
j=mp_next[0]=-1;
while ( i < m ) {
while ( j > - 1 && x[i] != x[j] ) j=mp_next[j];
mp_next[++i]=++j;
}
}
void MP( char *x, char *y, int n, int m ) {
int i, j, mp_next[XSIZE];
/* Preprocessing */
PRE_MP(x, m, mp_next );
/* Searching */
i=j=0;
while ( i < n ) {
while ( j > -1 && x[j] != y[i] ) j=mp_next[j];
i++;
j++;
if ( j >= m ) {
OUTPUT( i - j );
j = mp_next[ j ];
}
}
}
| |