| 发表于:2007-06-18 22:31:307楼 得分:20 |
这东西不应该用 vb 搞的吧, 用 c 很快的, 即使最简单的写法, 一次也不应该超过 100 毫秒的吧, 简单的试了试, 在pm1.4g 上大概10毫秒 ..... #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> typedef unsigned long pixclr; #define width (1024) #define height (1280) #define scanline_dlen (1024) #define subwidth (16) #define subheight (16) #define xalgo_prekmp( __patt__ , __p_len__ , __i__ , __j__ , __kmp_next__ , __compare_eq_xi_xj__ , __n_type__ ) \ do { \ (__i__) = 0; (__j__) = (__kmp_next__)[0] = (__n_type__)(-1); \ while( (__i__) < (__p_len__) ) { \ while( (__j__) > -1 && ! (__compare_eq_xi_xj__) ) \ (__j__) = (__kmp_next__)[ (__j__) ]; \ ++ (__i__); ++ (__j__); \ if( (__compare_eq_xi_xj__) ) \ (__kmp_next__)[(__i__)] = (__kmp_next__)[(__j__)]; \ else \ (__kmp_next__)[(__i__)] = (__n_type__) (__j__); \ } } while(0) #define xalgo_kmp( __patt__ , __p_len__ , __src__ , __s_len__ , __i__ , __j__ , __kmp_next__ , __compare_eq_xi_yj__ , __pattern_find_do__ ) \ do { \ while( (__j__) <= (__s_len__) - (__p_len__) ) { \ while( __i__ > -1 && !(__compare_eq_xi_yj__) ) \ (__i__) = (__kmp_next__) [ __i__ ]; \ ++ (__i__) ; ++ (__j__); \ if( (__i__) > = (__p_len__) ) { \ __pattern_find_do__ ; \ (__i__) = (__kmp_next__) [ __i__ ]; } \ } } while(0) pixclr picture[ height ][ scanline_dlen ]; pixclr subpic [ subheight ][ subwidth ]; void check1( int i , int j ) { int x ; for( x = 1; x < subheight; ++x ) { if( 0 != memcmp( picture[ i + x ] + j , subpic[ x ] , subwidth * sizeof( pixclr ) ) ) return ; } printf( "match @ %d %d\n " , i , j ); } #define use_kmp void slove() { int i ; #ifdef use_kmp int kmpnext[ subwidth + 1 ] , j; #endif pixclr *begin = picture[0] , *ptr = begin , *end = picture[ height - subheight ]; #ifdef use_kmp xalgo_prekmp( subpic[0] , subwidth , i , j , kmpnext , subpic[0][i] == subpic[0][j] , int ); for( ; ptr != end; ptr += scanline_dlen ) { i = j = 0; xalgo_kmp( subpic[0] , subwidth , ptr , width , i , j , kmpnext , subpic[0][i] == ptr[j] , check1( (ptr-begin)/scanline_dlen , j - i ) ); } #else for( ; ptr != end; ptr += scanline_dlen ) { for( i = 0; i < width - subwidth; ++i ) { if( 0 == memcmp( ptr + i , subpic[0] , subwidth * sizeof( pixclr ) ) ) check1( (ptr-begin)/scanline_dlen , i ); } } #endif } int main() { int xx; srand( time(0) ); for( xx = 0; xx < 100; ++xx ) { int i , j , i0 , j0; clock_t clk ; printf( "------round %d -------\n " , xx ); for( i = 0; i < width ; ++i ) for( j = 0; j < height; ++j ) picture[j][i] = rand(); i0 = rand() % (width - subwidth); j0 = rand() % (height - subheight - 500) + 500; for( i = 0; i < subwidth; ++i ) for( j = 0; j < subheight; ++j ) subpic[j][i] = picture[j+j0][i+i0]; clk = clock(); slove(); printf( "%d %d : time used %lg(sec)\n " , j0 , i0 , 1. * ( clock() - clk ) / clocks_per_sec ); } return 0; } | | |
|