2017-05-11 3 views
0

대용량 텍스트 입력에 표현식 (단어 문자열, 길이 및 임의의 단어 수)을 표시해야하는 횟수를 계산해야합니다. 수십만 가지의 표현식 (그리고 그 이상)이있을 수 있습니다.이 표현식은 모두 사전에 db에 저장됩니다.큰 입력 텍스트에서 수십만 개의 표현식 검색하기

이것을 달성하기위한 효율적인 방법은 무엇입니까? 가능한 한 "비동기 적"으로 구현하는 것을 선호합니다.

현재 나의 생각은 가능한 한 많은 표현식을 패턴 (연산자로 구분됨)으로 생성하여 간단히 실행하고 일치를 계산하는 것입니다. 다른 옵션이 있습니까? 그렇다면 이점은 무엇입니까? SQL 수준에서 실행 가능한 누락 된 쿼리가있을 수 있습니까?

+1

확실하지. 힌트를 얻으려면 [이 답변] (http://stackoverflow.com/a/42789508/3832970)을 참조하십시오. –

답변

0

이 경우 해시 테이블을 사용해야한다고 생각합니다. 이 상황에 대한 정규 표현식은 간단한 해시 테이블과 비교할 때 번거롭고 계산 상 비쌉니다. 해시 테이블은 키 - 값 쌍을 보유하는 연관 배열입니다. 키 (예 : 문자열)를 숫자 (입력에 다음에 나타나는 횟수)와 일치시킬 수 있습니다. 데이터베이스의 모든 문자열을 값이 0 인 키로 해시 테이블에 배치하기 만하면됩니다. 입력 텍스트의 모든 문자열을 검사하여 해시 테이블에 있는지 확인하십시오. 맞으면 값을 증가시키고, 그렇지 않으면 아무것도하지 않습니다. C++, Java, C#, Python 및 기타 대부분의 범용 언어는 해시 테이블을 구현합니다.

#include<iostream> 
#include<unordered_map> 
#include<string> 
#include<fstream> 
int main() 
{ 
     std::unordered_map<std::string, int> map; 
     std::ifstream matches("matches.txt"); 
     std::ifstream input("input.txt"); 
     std::string in; 
     while(matches>>in){ 
       map[in] = 0; 
     } 
     while(input>>in){ 
       if(map.find(in) != map.end()) 
         ++map[in]; 
     } 
     for(auto i : map) 
       std::cout<<i.first<<" "<<i.second<<std::endl; 
     return 0; 
} 

이 C++ 코드 (AN unordered_map도 불리는) 해시 테이블을 생성합니다 :이 기능을 보여줍니다 C에서 간단한 프로그램을 ++ 썼다. 그런 다음 DB의 패턴을 나타내는 "matches"를 읽고 초기 키가 0 인 테이블에 추가합니다. "입력"스트림에서 입력을 읽고 해시 테이블에 있는지 확인합니다. 일치하는 경우 키 값을 증가시킵니다. 그런 다음 프로그램은 각 요소가 키 - 값 순서로 나타나는 표의 요소를 인쇄합니다. 언어이지만, 대답은 아마도 정규식 트라이가 무엇인지