2010-01-16 6 views
11

정렬되지 않은 문자열 목록이 있습니다. 배열, List, SortedList에 이러한 항목을 배치 할 수 있습니다.목록에서 항목을 찾는 가장 빠른 방법은 무엇입니까?

이 목록에서 문자열을 찾는 가장 빠른 방법을 찾아야합니다. 목록에 배열을 덤핑하고, 정렬하고, 이진 검색을 구현하는 것이 더 낫지 않습니까? 또는 프레임 워크가이를 수행하는 방법을 제공합니까?

감사

P.S. VS2008 for .NET 2.0 사용

답변

20

컬렉션의 문자열을 찾기 위해 매우 빠르게 만드는 것이 목표라면 HashSet에 넣으십시오.

HashSet.Contains은 O (1) 메서드이며 문자열은 기본적으로 좋은 해시 알고리즘을 가지고 있으므로 이보다 더 빠른 루틴을 만들기가 어렵습니다.


편집 :

당신이 .NET 2를 사용하고 있기 때문에, 난 그냥 Dictionary<string,string>을하고 키와 값에 대해 동일한 문자열을 사용합니다. Dictinoary<TKey,TValue>.Contains도 O (1)이며 목록 기반 검색보다 훨씬 빠릅니다.

+0

사과드립니다. 태그를 업데이트했습니다. .NET 2.0에서 VS2008을 사용 중입니다. HashSet을 사용할 수 없습니다. – AngryHacker

+0

그래서'Hashtable'을 사용하십시오 –

+0

.Net에는 실제로 HashSet과 동등한 것이 없습니까? –

2

한 번에 하나의 개체 만 찾을 수 있으면 처음부터 시작하여 찾을 때까지 각 개체를 살펴보십시오. 이 작업을 같은 목록에 대해 여러 번 반복해야하는 경우 다른 항목을 찾으려면 정렬 된 목록을 유지하고 이진 검색을 수행하십시오.

-1

당신에게 어떤 용도라도, 그러나 이것은 그것을하는 상당히 간단한 방법 일 것입니다, 그러나 그것의 정확한 "속도"에 확실하지 않습니다.

List<string> collection = new List<string>(); 

collection.Sort(); 

foreach(string value in collection) 
{ 
    if(value == "stringToLookFor") 
    { 
     return value; 
    } 
{ 
+2

어쨌든 루프를 반복한다면 왜 정렬할까요? – AngryHacker

+0

아마도 목록을 검색하는 가장 느린 방법 일 것입니다. 만약 당신이 그것을 분류했다면 BinarySearch를 할 수 있습니다. BinarySearch는 키/값 기반 컬렉션의 검색보다 훨씬 빠르지 만 느립니다. –

+2

필자는 방금 배열을 임의로 배치하는 것보다 빨리 검색하는 것이 좋다고 생각했습니다. 그것은 단지 제안이었고 결코 유일한 해결책이 아닙니다. –

관련 문제