2016-07-10 1 views
0

NSMutableDictionary를 정렬 된 순서대로 키 : 낮은 값의 키가 먼저 인쇄되는 키와 같은 값으로 인쇄하고 싶습니다.NSMutableDictionary에서 keysSortedByValueUsingComparator 메서드를 사용하는 속도는 무엇입니까

이렇게하려면 아래의 NSDictionary의 keysSortedByValueUsingComparator : 메서드를 사용하고 있습니다.

기본 구현에서 빠른 정렬과 같은 접근 방식을 사용하고 O (N * logN)을 달성하는지 또는 모든 객체를 O (N^2) 복잡도로 이끄는 다른 모든 객체와 비교하는지 아는 사람이 있습니까?

예 : - 물론 O는 (N 로그 N)

NSMutableDictionary *hashTable = [[NSMutableDictionary alloc] init]; 
.... 
code that adds a bunch of Objects to the hashtable dictionary with key = NSString and value = NSNumber object 
.... 
NSArray * sortedKeys = [hashTable keysSortedByValueUsingComparator:^(id _Nonnull obj1, id _Nonnull obj2) { 
      if ([obj1 integerValue] > [obj2 integerValue]) 
      { 
       return (NSComparisonResult)NSOrderedDescending; 
      } 

      if ([obj1 integerValue] < [obj2 integerValue]) 
      { 
       return (NSComparisonResult)NSOrderedAscending; 
      } 

      return (NSComparisonResult)NSOrderedSame; 
     }]; 

for (NSString *nextKey in sortedKeys) 
{ 
    NSLog(@"%@: %@",nextKey,hashTable[nextKey]); 
} 
+2

유일한 관련 질문은 다음과 같습니다. 애플 프로그래머는 바보가 아니며, 버블 정렬을 사용하지 않는 것이 안전하다고 생각한다. – Avi

+0

@Avi '는 내 앱에 충분히 빠릅니다.'어쨌든 사이트에 너무 애매합니다. 우리가 어떻게 알았을까요? –

+0

@Yvette, 내가 왜 투표를 끝내겠다고했는지. – Avi

답변

1

이 병합 정렬을 사용하여 나타납니다. 다른 정렬 방법은 quicksort를 사용하는 것으로 알려져 있습니다.

추측 방법 : 비교기 블록 안에 중단 점을 배치하고 적중 될 때 스택 추적을 읽습니다. 코드에서 비교기가 CFSimpleMergeSort에 의해 호출되는 것을 볼 수 있습니다. Apple 프로그래머가 흥미로운 이름 지정 체계를 가지고 있지 않으면 병합 정렬이라고 생각하는 것이 좋습니다!

아마도 NS 메인 콜렉션은 CF 대응 브릿지로 수신자 부담이며, CF 소스는 애플의 오픈 소스 사이트에서 구할 수 있습니다. CFArray.c, CFDictionary.c 등을 검색하면 소스를 찾을 수 있습니다. 여기에는 모든 NS 메서드가 포함되지 않으므로 "찾을 수 있습니다."하지만 이러한 형식의 작동 방식을 보여줍니다.

HTH

+0

이전 WWDC에서 Apple은 배열을 정렬하는 데 다양한 전략을 사용하고 있다고 설명했습니다. _one_ 예에서 결론을 내리지 않겠습니다. – gnasher729

+0

@ gnasher729 - 그건 사실입니다. 몇 가지 다른 데이터 세트 크기 (10, 1000, 1000000)는 알고리즘이 변경되었는지 여부를 확인하는 데 사용되었습니다. 물론 그 알고리즘은 결정적이지는 않지만 * 당연히 결정적이지는 않지만 합리적인 추측입니다 여기서 병합하십시오. 애플의 오픈 소스를 보면, 사용할 수있는 유형에 대해서는 결정될 것이다. – CRD

관련 문제