2012-12-11 6 views
0

해시 또는 PHP와 같은 배열을 구현하고 싶습니다. 열쇠로 요소를 찾으려면 무엇이 더 좋고, 옵션 a) 또는 옵션 b)입니까? 어레이를 통해 루핑하는 것이 무엇이 더 빠르며 더 빠릅니까?

(모든 변수가 등등 설정 초기화된다!)

A)

for(i = 0; i < ary->element_cnt && found == NULL; i++) { 
    current_element = &(ary->elements[i]); 
    if(0 == memcmp(current_element->key, search_key, keysize)) { 
     found = current_element; 
    } 
} 

b)는 훨씬 더 읽을 수 있기 때문에

for(i = 0, current_element = &(ary->elements[i]) ; 
     i < ary->element_cnt && 
     0 != memcmp(current_element->key, searchkey, keysize); 
     i++, current_element = &(ary->elements[i])); 
/*found = current_element;*/ 

은 첫 번째보다가/maintainable? 두 번째 것이 더 빠를 것입니까?

하나의 큰 루프에서 모든 것을 수행하는 것은 "나쁜 스타일"입니까?

알다시피, 거기에 훨씬 더 나은 검색 알 고가 있지만, 여기 내 문제가 아니에요!

+3

두 번째 것이 더 빠릅니까? 생성 된 코드를 확인하고 일부 인식 최적화에 대한 가독성을 희생하기 전에 먼저 프로파일 링을 수행하십시오. –

+0

수정 된 질문입니다. 나는 모른다! 내 말씨는 그랬어야했듯이 좋지 않았다. – musicmatze

+1

그것은 주로 맛의 문제입니다. 성능 측면에서,'memcmp '에 들어가거나 나가기 위해 대부분의 시간이 소비 될 것이므로, 전체 시간의 상당 부분을 차지하는 경우, 나는 그것을 다르게하려고 노력할 것입니다. if (test (i))가 깨지면'for (i = n; -i> = 0;)을 자주 수행하고,'i'는 발견 된 요소입니다. –

답변

3

스타일의 모든 문제는 물론 매우 주관적입니다. 이것은 때때로 지역 코드 스타일 가이드에 의해 "규제"되는 유형입니다. 그 효과적으로 동일하게 확인되기 때문에, 이것은 루프 헤더에 found 체크 아웃 인하

for(i = 0; i < ary->element_cnt; ++i) { 
    current_element = &ary->elements[i]; 
    if(memcmp(current_element->key, search_key, keysize) == 0) 
     break; 
} 

: 개인적으로

나는 나는 그것을 쓰는 것, memcmp()에 대한 호출이 조금 너무 "무거운"생각 내가 싫어하는 것을 두 번이나.

정말이 found을 사용하고 싶었 경우, 나는 그것을 작성합니다

for(i = 0; i < ary->element_cnt && !found; ++i) { 
    current_element = &ary->elements[i]; 
    found = memcmp(current_element->key, search_key, keysize) == 0; 
} 

이것은 무의미 if를 제거하고 그냥 좋은 생각하는 직접 부울을 지정합니다.

5

두 가지 모두 O (N) 알고리즘입니다. 둘 다 단순히 배열을 반복하고 각 요소에 memcmp을 호출하므로 유사하게 수행해야합니다. 주관적으로, 나는 읽기가 더 쉽기 때문에 첫 번째 것이 더 좋다고 생각합니다.

그러나 키를 사용하여 조회를 구현하는 가장 좋은 방법은 이와 같은 선형 검색이 아니라 해시 테이블 또는 균형 이진 트리와 같은 특수 데이터 구조를 사용하는 것입니다. PHP와 같은 스크립팅 언어는 일반적으로 해시 테이블을 사용하여 이와 같은 조회를 구현합니다.

+0

"두 개의 O (N) 알고리즘이 거의 동일하게 수행됩니다"라는 논리는 마음에 들지 않습니다. "유사"또는 "점근 적으로 유사한"을 사용하면 더 좋을 것입니다. IMHO – amit

+0

그것은 논증의 수준에 달려 있습니다. 알고리즘과 기술적 인 관점에서, Charles는 절대적으로 옳습니다.그들은 asymptotically 유사한 수행하지 않습니다. – alzaimar

관련 문제