문제

해시 가능 또는 정렬 된 목록에서 항목을 찾는 것이 더 빠릅니까?

도움이 되었습니까?

해결책

알고리즘 복잡성은 알아야 할 좋은 일이며 해시블은 o (1) 정렬 된 벡터 (귀하의 경우 목록보다 정렬 된 배열을 사용하는 것이 낫다고 생각합니다)는 제공합니다. O (로그 N) 액세스 시간.

그러나 복잡성 표기법은 N이 무한대로가는 액세스 시간을 제공한다는 것을 알아야합니다. 그것은 당신이 당신의 데이터를 알고 있다면 그것을 의미합니다 계속 성장할 것입니다, 복잡성 표기법은 선택할 알고리즘에 대한 힌트를 제공합니다.

데이터가 길이가 다소 낮은 길이를 유지한다는 것을 알고 있으면 배열/해시 테이블에 몇 개의 항목 만있는 것과 같은 시계를 사용하고 측정해야합니다. 테스트가 있습니다.

예를 들어, 다른 문제에서 : 배열을 정렬합니다. 을 위한 몇 가지 항목 거품 정렬 중 o (n^2) 빠른 정렬보다 빠를 수 있습니다. o (n log n).

또한 다른 답변에 따라 항목에 따라 해시 가능한 인스턴스에 가장 적합한 해시 기능을 찾아야합니다. 그렇지 않으면 Hank Gay의 답변에서 지적한대로 해시 가능에서 조회하기위한 극적인 나쁜 성능으로 이어질 수 있습니다.

편집 : 이해하기 위해이 기사를 살펴보십시오. 큰 o 표기법의 의미 .

다른 팁

'정렬 된 목록'에 의해 가정하면 '무작위 접근성, 정렬 된 컬렉션'을 의미합니다. 목록에는 요소 만 IT 요소 만 통과 할 수있는 속성이있어 O (n) 복잡성이 발생합니다.

정렬 된 인덱스 가능한 컬렉션에서 요소를 찾는 가장 빠른 방법은 N-Ary Search, O (LOGN)의 반면, 협업이없는 해시 가능은 O (1)의 복잡성을 갖습니다.

해싱 알고리즘이없는 한 극도로 느리게 (및/또는 나쁜), 해시 가능이 더 빠릅니다.

업데이트 : 댓글 작성자가 지적했듯이 해시 알고리즘이 나쁘기 때문에 너무 많은 충돌로 인해 성능이 저하 될 수 있습니다. 대부분의 라이브러리 구현 (적어도 고급 언어로)은 무대 뒤에서 해시 테이블을 자동으로 성장시켜 성장을 유발하는 인서트에서 예상보다 느리게 성능을 유발할 것입니다. 고려하다.

그만큼 get a SortedList ~이다 O(log n) 동일한 작업이지만 EA HASHTable입니다 O(1). 그래서, 보통,, HashTable 훨씬 더 빠릅니다. 그러나 이것은 여러 가지 요인에 달려 있습니다.

  • 목록의 크기
  • 해싱 알고리즘의 성능
  • 충돌 수 / 품질 해싱 알고리즘의

전적으로 저장된 데이터의 양에 따라 다릅니다.

해시 테이블이 고정 된 시간 내에 대상 데이터를 찾을 수있는 메모리가 충분하다고 가정하면 해시를 계산해야 할 필요성은 일부 (고정 된) 오버 헤드를 추가합니다.

정렬 된 목록을 검색하는 데는 해시 오버 헤드가 없지만 실제로 대상 데이터를 찾는 작업을 수행하는 데 필요한 시간은 목록이 증가함에 따라 증가합니다.

따라서 일반적으로 정렬 된 목록은 일반적으로 작은 데이터 세트의 경우 더 빠릅니다. (자주 변경 및/또는 드물게 검색되는 매우 작은 데이터 세트의 경우 un정렬 목록은 정렬의 오버 헤드를 피하기 때문에 더 빠를 수 있습니다.) 데이터 세트가 커지면 목록의 검색 시간의 성장은 해싱의 고정 된 오버 헤드를 어둡게하고 해시 테이블이 더 빨라집니다.

해당 중단 점은 특정 해시 테이블 및 정렬 목록 검색 구현에 따라 다릅니다. 일반적인 크기의 데이터 세트에서 테스트 및 벤치 마크 성능을 실행하여 특정 사례에서 실제로 더 나은 성능을 확인하십시오. (또는 코드가 이미 "충분히 빠르게"실행되는 경우, 그렇지 않은 경우에는 더 편한 것을 사용하고 최적화 할 필요가없는 것을 최적화하는 것에 대해 걱정하지 마십시오.)

경우에 따라 컬렉션의 크기에 따라 다릅니다. 목록이 매우 작다면 5-10 개의 항목이 아마도 목록이 더 빠를 것 같아요. 그렇지 않으면 xtofl이 맞습니다.

Hashtable은 10 개 이상의 항목을 포함하는 목록에 더 효율적입니다. 목록에 10 개 미만의 항목이 있으면 해싱 알고로 인한 오버 헤드가 더 많아집니다.

빠른 사전이 필요하지만 주문 된 방식으로 품목을 정서대로 유지 해야하는 경우 OrderedDictionary를 사용해야합니다. (.NET 2.0 이후)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top