2012-01-04 3 views
2

내 C 응용 프로그램에서 응용 프로그램의 문자열 목록과 비교할 문자열이 있습니다. 내 C 응용 프로그램에서 문자열 목록을 하드 코드 할 수 있습니다.문자열을 C의 문자열 목록과 비교합니다

  1. 내 응용 프로그램에서 문자열 목록을 정의하는 가장 좋은 방법은 무엇입니까?
  2. 내 응용 프로그램의 문자열을 문자열 목록과 비교하는 가장 좋은 방법은 무엇입니까?

답변

0

문자열을 문자열 목록과 비교한다는 것은 무엇을 의미합니까? 두 종류의 "대상"은 분명히 비교할 수 없습니다.

문자열 "372"은 문자열 목록과 어떻게 비교합니까? { "12, "42", "-11", "372" }?

"문자열 목록에서 문자열 찾기"를 의미하는 경우 가장 좋은 방법은 목록을 정렬 한 다음 이진 검색을 사용하여 후보가 있는지 빠르게 확인하는 것입니다.

문자열 목록은 C에서 문자 포인터 배열 char *strings[]으로 쉽게 나타낼 수 있습니다. qsort()을 사용하여 정렬하고 bsearch()을 검색하여 검색 할 수 있습니다.

+0

문자열이 "372"이면 내 strring에 대해 내 코드가 true를 반환해야합니다. – gln

+0

"문자열 목록은 C에서 문자 포인터의 배열로 쉽게 나타납니다."-이 경우 문자열을 먼저 길이별로 정렬 한 다음 사전 식으로 정렬 할 수 있습니다. 각 길이의 첫 번째 문자열 색인을 유지하십시오. 문자열이 알려지기 때문에이 모든 작업은 빌드 타임에 수행 할 수 있습니다. 그런 다음 각 문자열에 대한 포인터가 아닌 실제 문자열 데이터가 포함 된 배열로 이진 검색을 수행 할 수 있습니다. 따라서 약간의 오버 헤드가 있고 캐시 성능이 조금 향상되었습니다. –

6

나는 효율을 올린 후 trie을 사용해야 만 사용자의 입력 된 문자열과 주어진 문자열이 일치하는지 검색하고 O(|S|) 검색 할 수 있습니다. [여기서 | S | 입력 문자열]

당신이 빠른 코딩 후 경우, 단지 미리 정의 된 char*[]에 문자열을 저장하고, 과도한 속도를 원하는 경우 strcmp()

+0

기본 시도는 캐시 성능 (이 경우 문자 당 캐시 미스)이 매우 낮으므로 다른 답변에서 설명한 간단한 정렬 및 이진 검색 방법보다 열세 인 것으로 보입니다. 비교 대상 문자열 목록이 정말 거대한 경우 내 충고는 캐시 튜닝 된 데이터 구조를 JudySL (http://judy.sourceforge.net/doc/JudySL_3x.htm)으로 사용하거나 옵션이 아닌 경우 , 합리적으로 희박한 해시 테이블. –

0

과 반복의 길이는, 당신은에 기꺼이 여분 공구를 사용하여, 당신은 gperf를 고려할 수 있었다. 문자열 목록이 주어지면 해시 함수를 기반으로하는 매우 빠른 포함 테스트가 수행되고 C 코드가 나옵니다.

관련 문제