这是我的五分钱。:)
#include <stdio.h>
int main(void)
{
int a[] = { 1, 3, 5, 3, 7, 9, 10, 5, 6, 7, 1 };
const size_t N = sizeof( a ) / sizeof( *a );
size_t first = 0, last = 0;
for ( size_t i = 0; i < N - ( last - first ); i++ )
{
size_t j = N;
while ( --j != i && a[j] != a[i] );
if ( j != i )
{
if ( last - first < j - i )
{
first = i;
last = j;
}
}
}
if ( first != last )
{
printf( "%d: ( %zu, %zu )\n", a[first], first, last );
}
return 0;
}
程序输出是
1: ( 0, 10 )
如果包含以下条件,循环可以更加优化
if ( i == 0 || a[i] != a[last] )
跳过已经考虑过的值。
这是带有这个 if 语句的程序。
#include <stdio.h>
int main(void)
{
int a[] = { 1, 3, 5, 3, 7, 9, 10, 5, 6, 7, 1 };
const size_t N = sizeof( a ) / sizeof( *a );
size_t first = 0, last = 0;
for ( size_t i = 0; i < N - ( last - first ); i++ )
{
if ( i == 0 || a[i] != a[last] )
{
size_t j = N;
while ( --j != i && a[j] != a[i] );
if ( j != i )
{
if ( last - first < j - i )
{
first = i;
last = j;
}
}
}
}
if ( first != last )
{
printf( "%d: ( %zu, %zu )\n", a[first], first, last );
}
return 0;
}
这是插入测试输出以显示内部循环执行频率的同一程序。
#include <stdio.h>
int main(void)
{
int a[] = { 1, 1, 1, 1, 2, 2, 2, 2, 2, 3 };
const size_t N = sizeof( a ) / sizeof( *a );
size_t first = 0, last = 0;
for ( size_t i = 0; i < N - ( last - first ); i++ )
{
if ( i == 0 || a[i] != a[last] )
{
printf( "Inner loop for %d\n", a[i] );
size_t j = N;
while ( --j != i && a[j] != a[i] );
if ( j != i )
{
if ( last - first < j - i )
{
first = i;
last = j;
}
}
}
}
if ( first != last )
{
printf( "%d: ( %zu, %zu )\n", a[first], first, last );
}
return 0;
}
程序输出是
Inner loop for 1
Inner loop for 2
2: ( 4, 8 )
所以内部循环只执行了两次。