2010-07-30 3 views
2

필터링 할 문자열 모음이 있습니다. 이 패턴은 다음과 같습니다.큰 문자열 모음 내에서 많은 수의 문자열 찾기

xxx_xxx_xxx_xxx 

항상 문자 또는 숫자의 시퀀스는 3 개의 밑줄로 구분됩니다. 각 문자열의 최대 길이는 60 자입니다. 내 컬렉션에는이 중 몇백 만 개가있을 수 있습니다. 내가 효율적으로 이런 일을 수행하는 데 사용할 수있는 어떤 데이터 구조

"def_999_888"

등 :로 시작하는 모든 문자열을 가져 오기 "abc_123_456"

:

모든 문자열을 가져 오기로 시작 ..

예를 들어, 나는이 작업을 수행 할 수 있습니다 :

List<String> matched = new ArrayList<String>(); 
for (String it : strings) { 
    if (it.startsWith(match)) { 
     matched.add(it); 
    } 
} 

하지만 내 컬렉션이 수백만 자릿수 인 경우 오랜 시간이 걸릴 수 있으며 일치하는 문자열 수가 많으면 더 오래 걸릴 수 있습니다.

높은 수준의 문제는 내가 쓰고있는 앱에 대해 다음 중 어느 질문에 답하고 싶습니다. "어느 친구가 제품 B에 대해 제품 A를 추천 했습니까?" ++ 자바/C/C에서 뭔가 사용자가 빠르게 실행할 수 있다면 위의이 같은 인코딩 된 평면 문자열을 사용,

select recommender from recs where username='me' and prodIdA='a' and prodIdB='b'; 

궁금 해요 :

를 나는 다음 문을 SQL 테이블에이 정보를 저장하고 실행할 수 있습니다

myusername_prodIdA_prodIdB_recommenderusername

당신이 답을 얻기 위해 인코딩 된 문자열의 전체 컬렉션 작동을 시작-A를 할 수있는 아이디어.

이 프로덕션 환경에서 사용할 수없는 가능성이 높습니다처럼 사용자 정의 솔루션을 구현하려고 알고, 그래서 일부의 SQL DB는

감사

+0

id : s는 실제로 기본 숫자입니까? 나는 당신이 더 빨리 그들을 파싱하고 필터링하는 것을 도울 수있는 최적화의 일종을 생각하고있다 ... – Esko

+0

나는 그것을 얻지 못했다 - 왜 당신은 당신의 특정한 높은 수준을 구현하기 위해 주어진 것보다 적은 문자열을 찾을 필요가 있는가? 목표? 연결이 뭐야? 네가 정교 할 필요가 있다고 생각해. –

+0

ID는 모두 영문자이며 ascii입니다. 개념은 특정 형식으로 메모리 키에 쓸 수 있다는 것이 었습니다. 그런 다음 사용자 이름과 두 개의 제품 ID가 주어지면 전체 데이터 세트의 [작게] 연산을 사용하여 내 친구의 모든 추천을 찾을 수 있습니다. 그것은 조금 괴상하다! – user246114

답변

2

는 자바이를 위해, 더 나은하지만 그냥 궁금 것 Trie 구조를 사용할 수 있습니다.

나는 그것이 좋은 생각이라고 생각하지 않는다. 메모리에 "수 백만"레코드를 버리는 것이 항상 효과가있는 것은 아닙니다.

그게 바로 데이터베이스입니다. 올바른 디자인과 적절한 인덱싱을 사용하면 DB만으로도 매우 우수한 성능을 얻을 수 있습니다.

+0

특정 사용자 정의 구현이 mysql을 사용하는 것보다 더 좋을지 궁금해하기 때문에 그냥 생각하고 있었다. – user246114

0

나는 당신이 SortedMap을 찾고 있다고 생각한다.

"headMap (K toKey) 키의 키가 toKey보다 작은이 맵 부분의 뷰를 리턴합니다."

0

나는이 가능성이 가장 높은 프로덕션 환경에서 사용할 수 없습니다와 같은 사용자 정의 솔루션을 구현하려고 알고, 그래서 일부의 SQL DB를

경우에만 호기심을 위해서하지만 그냥 궁금해서, 더 나은 것, 당신은 해시 테이블에있는 기존의 모든 다른 "myusername_prodIdA_prodIdB"조합을 넣어. 그리고 관련 결과의 각 조합에 저장소에 대한 목록이 있습니다.

그래서, 구조 Map<String, List<String>> 모습과 hash.get("def_999_888")처럼 사용할 것이다. 일정 시간 (O (1))

내부 목록을 없애고 여러 가지 방법으로 최적화 할 수 있지만 이는 좋은 아이디어입니다.

+0

나는이/그녀가 기록. – NullUserException

+0

@ NullUserException 그 이유는 map이 String이 아닌 List 값을 가지기 때문입니다. –

0

나에게 가장 먼저 떠오르는 점은 문자열을 효율적으로 검색 할 수 있도록 일종의 데이터 구조로 전처리하는 것입니다. 검색 기능을 여러 번 호출하게된다면 모든 문자열을 해시 테이블에 넣어서 일정 시간 동안 검색해 보는 것이 좋습니다. 문자열 배열을 구성하는 데 더 많은 처리 능력이 필요하지만이를 검색하는 작업은 간단합니다.