2014-07-19 2 views
10

안드로이드 애플 리케이션 (아마도 수천 가지)에 키/값을 저장하기 위해 해시 맵을 사용해야하지만, 메모리를 절약하기 위해 SparseArray를 사용해야한다는 것을 알고 있습니다. 그러나, 내 열쇠는 문자열이어야합니다. SparseArray 또는 다른 대안의 사용자 지정 구현을 만드는 방법이 있습니까?String 키가있는 Android SparseArray?

답변

13

SparseArray는 정수가 키 일 때만 문제가됩니다. 키를 바이너리 검색해야하기 때문에 정수 값에서만 가능한 메모리 최적화입니다. 문자열에 대한 이진 검색은 비싸고 잘 정의되어 있지 않으므로 ('1'이 'a'또는 '미친 일본어 문자'보다 작거나 같아야합니까?) 그렇게하지 않습니다.

중간에, SparseArray는 메모리를 저장하지만 시간이 더 걸릴 수 있습니다. HashMap에 대한 get은 O (n/size) 여야합니다. 여기서 size는 hashmap의 버킷 수입니다. SparseArray는 O (log (n))가 될 것입니다. 사용할 메모리 및 속도에 따라 다릅니다. 당신이 정말로 큰 (100K의 항목들)을 가지고 있다면, 캐시 미스의 물리적 인 현실이 메모리 캐시 페이징 문제를 겪을 수도 있습니다. 기술적으로 더 나쁜 경우에도 HashMap은 더 많은 성능을 발휘할 수 있습니다. miss 당 get, binary 검색은 multiple을 가질 수 있습니다. ArrayMap Doc

+0

Hmmm.ok 의미가 있습니다. String을 키 입력해야 할 때 가장 좋은 방법은 무엇입니까? 해시 맵은 속도와 메모리가 가능한 가장 효율적인 방법입니까? – Mike6679

+1

하나의 메모리 또는 속도를 선택하십시오. 당신은 둘 다 최적화하지 않을 것입니다. 속도가 필요하면 해시 맵을 사용하십시오. 메모리가 필요한 경우 배열 기반의 정렬 목록이나 정렬 된 목록 또는 BST (많은 데이터베이스가 사용하는 것으로 log (n) 검색 및 O (n) 메모리와의 나쁜 절충이 아닙니다)가 필요합니다. 하지만 둘 다 최적화 할 수는 없습니다. 그것이 어려움이 될 것이라고 생각되면, 나중에 자체 구현을 변경할 수 있도록 자체 클래스에서 분리하십시오. –

+0

바이너리 검색 트리에 익숙하지만 정수형 키를 사용합니다. String 값을 입력해야하는 경우 어떻게 BST를 사용합니까? – Mike6679

1

SparseArray정수 키 유형으로이지도에 대한 전문 클래스입니다. 그들은 기본적으로 그 사실을 사용하여 Integer 객체에 대한 참조 대신 int 값을 저장합니다 (따라서 메모리 절약).

키가 다른 유형일 때 HashMap 표준을 사용하는 것이 본질적으로 잘못되었습니다.

+0

문자열을 키잉 할 때 다음과 같은 경우 HashMap 표준 연습을 사용합니다. 1. 수천 또는 수백만 개의 항목을 저장해야하며 2. 값을 검색하기 위해 String을 입력해야합니까? 메모리와 속도의 균형을 유지하는 더 좋은 방법은 없습니다. – Mike6679

+0

@Mike 문자열에 공통 접두어가있는 경우 기수 트리를 사용할 수 있습니다. – matiash

4

당신은 ArrayMap을 사용할 수 있습니다 문자열 -> mystring.hashCode()의 hashCode

1

당신은 사용할 수 있습니다 ArrayMap 자세한 내용은 기존의 HashMap

보다 효율적으로 더 많은 메모리로 설계되어 일반 키 -> 값의 매핑 데이터 구조입니다 :