의 수 ... 감안할 때
수 :단어 목록에 대한 문구의 목록을 검색하고 문제는 간단 차례 나오는
- 파울 - 단어> 목록을 List1입니다 말한다. 파울 - 단어 중 적어도 하나를 일치하는 문구의 개수 : -
이 파울 단어를 검색 할 문자열 (또는 구)의> 목록, 목록 2
원하는 출력을 말한다.
샘플 :
목록 1 : "고양이", "개", "마우스", "멋진 동물"
목록 2 : "고양이가 좋다". "개가 좋지 않다", "고양이와 개는 좋다", "좋은 동물", "안녕하세요", "안녕하세요 마우스", "이것은 나쁘다"
출력 : 5 개의 문장에 적어도 1 개의 파울이 들어 있습니다.
내가 무슨 짓을 :.
는
int sum = list1.Sum(s => list2.Count(t => t.Contains(s)));
이에서 검색하는 5600 개 문구의 반칙으로 단어 목록에 대한 약 38 초 약 4000 문자열을한다 (쿼드 코어, 4기가바이트 RAM) .. WAYYYYYY 천천히!
나는 이것을 위해 존재할 수있는 해결책이나 알고리즘을 둘러 보았습니다 ... 찾을 수 없습니다.
누가 올바른 방향으로 나를 가리킬 수 있더라도, 알 고어 이름 지정, 코드 스 니펫 표시 또는 손가락 (!!)을 가리켜 냄으로써 멋질 것입니다. 시작 지점은 List1
(foulWords
)이기 때문에
int contains = phrases.Count(p => foulWords.Any(fw => p.Contains(fw)));
당신의 접근 방식도 최적이 아닌 그래서 당신은 비효율적 각 계수의 합이 필요합니다
이 실제로 도움이 될 것입니다 만약 내가 아무 생각이 없다,하지만 당신은 (모든 파울 단어에서 정규식을 컴파일 하나를 시도해 볼 수도 있습니다 정규 표현식을 모두 포함하고 컴파일하면 구문과 비교하여 실행합니다. 난 그냥 컴파일 된 정규식이 귀하의 linq 쿼리보다 빠르다고 생각합니다. – Alxandr
[역 색인] (http://en.wikipedia.org/wiki/Inverted_index) 또는 [검색 엔진 색인 생성] (http://en.wikipedia.org/wiki/Search_engine_indexing) – I4V
정규 표현식을 사용하면 더 효율적입니다. . – filipko