C/C++에서 검색 속 도 를 높이 는 팁

3625 단어 c + +찾다
머리말
제목 이 한 배열 에서 어떤 요 소 를 찾 거나 한 문자열 에서 어떤 문 자 를 찾 는 것 을 보면 우 리 는 보통 다음 과 같은 코드 를 쓴다.그러나 이런 코드 는 간단명료 하지만 배열 요소 가 많은 상황 에서 좋 은 해결 방안 이 아 닙 니 다.오늘 은 검색 속 도 를 높이 는 작은 기 교 를 공유 하 겠 습 니 다.

//   int         
int find(int A[],int n,int element)
{
 for( int i = 0; i < n; i++ )
 {
  if( A[i] == element )
   return i;
 }
 return -1;
}

//             
int find(string& str,char c)
{ 
 for( int i = 0; i < str.length(); i++ )
 {
  if( str[i] == c )
   return i;
 }
 return -1;
}
매번 이런 코드 를 쓰 지만 저 는 항상 for 순환 중의<판단 이 좀 불필요 하 다 고 생각 합 니 다.예 를 들 어 배열 에 100 개의 요소 가 있 습 니 다.우 리 는 앞의 99 개 는 배열 이 경 계 를 넘 지 않 는 다 는 것 을 알 고 있 습 니 다.i보초병 의 방식 을 통 해 이 불필요 한 판단 을 없 애고 위의 두 가지 방법 을 다음 과 같이 개조 한다.

//   int         
int find1(int A[],int n,int element)
{
 if( n <= 0 )
  return -1;
 if( A[--n] == element )
  return n;

 int hold = A[n];
 A[n] = element;
 int i = 0;
 for( ; ; i++ ) 
 {
  if( A[i] == element )
   break;
 }
 A[n] = hold;
 return i < n ? i : -1; 
}

//             
int find1(string& str,char c)
{ 
 int n = str.length();
 if( n <= 0 )
  return -1;
 if( str[--n] == c )
  return n;
 int hold = str[n];
 str[n] = c;
 int i = 0;
 for( ; ; i++ ) 
 {
  if( str[i] == c )
   break;
 }
 str[n] = hold;
 return i < n ? i : -1; 
}
제 가 졸 라 보 겠 습 니 다.왜 이렇게 길 어 졌 는 지 모 르 겠 지만 판단 횟수 를 줄 였 습 니 다.만약 에 배열 이 크 면 운행 속 도 를 높이 는 것 이 분명 합 니 다.만약 에 배열 이 작다 고 말 해 야 한다 면 속 도 를 낮 출 수 있 습 니 다.그러면 이렇게 쓰 지 않 으 면 되 잖 아 요.폐 기 는 적 게 하 세 요.코드 가 간단명료 하지만 저 는 생각 을 간단하게 말씀 드 리 겠 습 니 다.
배열 의 끝 에 보초병 을 추가 하 는 것 입 니 다.i마지막 요소 의 값 이 우리 가 찾 아야 할 숫자 인지 아 닌 지 를 먼저 판단 하고 다음 표 시 를 되 돌려 줍 니 다.그렇지 않 으 면 마지막 수의 값 을 저장 하고 찾 으 려 는 그 수 를 마지막 요소 에 부여 합 니 다.지정 한 요 소 를 순환 적 으로 찾 습 니 다.배열 의 경 계 를 판단 하지 않 아 도 됩 니 다.if 문 구 는 반드시 break 이 고 마지막 요소 의 값 을 복원 합 니 다.마지막 으로 i마지막 으로 검색 속 도 를 높 일 수 있 는 지 간단 한 성능 테스트 를 하고 있다.
테스트 코드 는 다음 과 같 습 니 다:

void testFind()
{
 int N = 200000;
 int* A = new int[N];
 A[N-2] = 1; 

 DWORD start = ::GetTickCount64();
 for( int i = 0; i < 10000; i++ ) 
  find(A,N,1);
 DWORD end = ::GetTickCount64();
 cout <<"   :" << end - start <<"   " << endl; 

 start = ::GetTickCount64(); 
 for( int i = 0; i < 10000; i++ ) 
  find1(A,N,1);
 end = ::GetTickCount64();
 cout <<"   :" << end - start <<"   " << endl; 
}
실행 결 과 는 다음 과 같 습 니 다.

그래도 속도 가 빨 라 요.
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 면 댓 글 을 남 겨 주 십시오.

좋은 웹페이지 즐겨찾기