2012-09-27 38 views
10

(Có một số câu hỏi về mảng thưa thớt tiết kiệm thời gian nhưng tôi đang tìm kiếm hiệu quả bộ nhớ.)Memory hiệu quả trong Java

Tôi cần tương đương với một List<T> hoặc Map<Integer,T>

  1. Có thể phát triển theo yêu cầu chỉ bằng cách đặt một khóa lớn hơn bất kỳ khóa nào trước đây. (Có thể giả sử các phím không âm).
  2. Hiệu quả bộ nhớ là ArrayList<T> trong trường hợp hầu hết các chỉ mục không phải là null, tức là khi dữ liệu thực tế không quá thưa thớt.
  3. Khi chỉ số thưa thớt, hãy sử dụng không gian tỷ lệ thuận với số không chỉ số null.
  4. Sử dụng ít bộ nhớ hơn HashMap<Integer,T> (vì điều này sẽ tự động khóa các phím và có thể không tận dụng loại khóa vô hướng).
  5. Có thể nhận hoặc đặt thành phần trong thời gian nhật ký được phân bổ (N) khi N là số mục nhập: không cần phải là thời gian tuyến tính, tìm kiếm nhị phân sẽ được chấp nhận.
  6. Được thực hiện trong thư viện Java thuần túy mã nguồn mở không phải là virus (tốt nhất là ở Trung tâm Maven).

Có ai biết lớp tiện ích như vậy không?

Tôi đã mong đợi Bộ sưu tập của Commons có một bộ sưu tập nhưng dường như không có.

Tôi đã xem qua số org.apache.commons.math.util.OpenIntToFieldHashMap trông gần như đúng, ngoại trừ loại giá trị là FieldElement có vẻ không phù hợp; Tôi chỉ muốn T extends Object. Dường như nó sẽ dễ dàng để chỉnh sửa mã nguồn của nó để được chung chung hơn, mặc dù tôi thà sử dụng một phụ thuộc nhị phân nếu có sẵn.

Trả lời

6

Tôi sẽ thử với trove bộ sưu tập, có TIntObjectMap có thể phù hợp với mục đích của bạn.

+0

Điều đó có vẻ tốt. Tôi đã thử điều chỉnh 'OpenIntToFieldHashMap' thành một kiểu giá trị chung, có vẻ như đã làm việc với ~ 10min, nhưng nó chỉ hoạt động tốt hơn so với' TIntObjectMap'. –

1

Tôi đã lưu trường hợp thử nghiệm của mình là jglick/inthashmap. Kết quả:

HashMap size: 1017504 
TIntObjectMap size: 853216 
IntHashMap size: 846984 
OpenIntObjectHashMap size: 760472 
+1

Tôi tìm thấy IntHashMap ở đâu? – oleh

+0

@oleh có lẽ là apache commons (?) – Karussell

+1

Xin lỗi, 'IntHashMap' là sự thích ứng của tôi về' OpenIntToFieldHashMap' từ Commons Math. Vì nó hầu như không tốt hơn 'TIntObjectMap' nên tôi đã loại bỏ cách tiếp cận này. –

4

Tôi sẽ xem triển khai SparseArray của Android để lấy cảm hứng. Bạn có thể xem nguồn bằng cách tải xuống mã nguồn của AOSP tại đây http://source.android.com/source/downloading.html

+0

https://code.google.com/p/android-source-browsing/source/browse/core/java/android/util/SparseArray.java?spec=svn.platform--frameworks--base.58aff7debfdab8ca99dd6bfcfa0c7bebdf2d303b&repo=platform --frameworks - base & r = 58aff7debfdab8ca99dd6bfcfa0c7bebdf2d303b trông có vẻ phù hợp — thời gian chạy phân bổ là không có giấy tờ nhưng từ kiểm tra, tôi đoán nó là logarit - và nằm dưới ASL 2.0, điều đó là tốt. Thật không may nó không phải là ở Trung mà tôi biết, và sẽ muốn nó tách rời khỏi những thứ không liên quan như hỗ trợ Android Bluetooth mà là tất cả trong cùng một nguồn gốc. –

+1

Dưới đây là một phiên bản khép kín có sử dụng tất cả các mã cần thiết từ android https://github.com/frostwire/frostwire-jlibtorrent/blob/b4b3f9a90d7a1dade864d7e3eaa88b616f200a9a/src/com/frostwire/jlibtorrent/SparseArray.java – Gubatron

1

Tôi sẽ đề nghị bạn sử dụng OpenIntObjectHashMap từ thư viện Colt. Link

+0

Thanks for the tip . Nó thực sự có mức tiêu thụ không gian vừa phải nhưng thấp hơn đáng kể so với các lựa chọn thay thế. Tôi đã bao gồm điều này trong trường hợp kiểm tra sửa đổi của tôi. –

Các vấn đề liên quan