2013-05-08 4 views
3

의 수 ... 감안할 때
수 :단어 목록에 대한 문구의 목록을 검색하고 문제는 간단 차례 나오는

- 파울 - 단어> 목록을 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))); 

당신의 접근 방식도 최적이 아닌 그래서 당신은 비효율적 각 계수의 합이 필요합니다

+0

이 실제로 도움이 될 것입니다 만약 내가 아무 생각이 없다,하지만 당신은 (모든 파울 단어에서 정규식을 컴파일 하나를 시도해 볼 수도 있습니다 정규 표현식을 모두 포함하고 컴파일하면 구문과 비교하여 실행합니다. 난 그냥 컴파일 된 정규식이 귀하의 linq 쿼리보다 빠르다고 생각합니다. – Alxandr

+0

[역 색인] (http://en.wikipedia.org/wiki/Inverted_index) 또는 [검색 엔진 색인 생성] (http://en.wikipedia.org/wiki/Search_engine_indexing) – I4V

+0

정규 표현식을 사용하면 더 효율적입니다. . – filipko

답변

3

이 가능한 한 빨리 Any 휴식 이후 더 효율적이어야한다 . 올바른 결과는 0 (일치하는 파울 워드 없음)과 phrases.Count (모든 문구에 파울 워드가 있음) 사이 여야합니다. 따라서 출발점은 phrases이어야합니다.

Demo

Q : 당신은 또한 나 또한 나에게 목록에있는 문구의 INDEX 를 제공하기 위해 위의 코드를 수정하는 데 도움 수 있을까요?

예 :

var wordIndexes = phrases.Select((phrase, index) => new { phrase, index }) 
    .Where(x => foulWords.Any(fw => x.phrase.Contains(fw))); 

foreach (var wordIndex in wordIndexes) 
    Console.WriteLine("Word: {0} Index: {1}", wordIndex.phrase, wordIndex.index); 

결과 :

Word: A cat is good  Index: 0 
Word: a dog is bad   Index: 1 
Word: cat and dog are good Index: 2 
Word: Nice animal   Index: 3 
Word: Hello mouse   Index: 5 
+0

+1 - 거의 비슷하게 게시되었습니다. var count = phrases.Count (p => foul.Any (tf => p.Contains (tf))); – Nathan

+0

이것은 저에게 큰 도움이됩니다 ... 감사합니다! :) –

+0

@Tim - 또한 위의 코드를 수정하여 목록의 문구를 INDEX라고 알려주시겠습니까? 출력은 다음과 같습니다. 5 (0,1,2,5, ....) 간단히 COUNT를 WHERE로 변경하고 선택했습니다.이 작업이 다시 느려집니다 ... 무엇이 잘못 되었나요?! ! –

관련 문제