2012-12-13 15 views

Trả lời

7

Cập nhật: - khác biệt so với độc đáo


Nếu bạn đang tìm kiếm "độc đáo" giá trị (Như trong nếu bạn nhìn thấy một yếu tố "JASON" nhiều hơn một lần, hơn là không có còn độc đáo và không nên được tính)

Bạn có thể làm điều đó trong thời gian tuyến tính bằng cách sử dụng một HashMap;)

(Các tổng quát/ngôn ngữ-agnostic ý tưởng là Hash table)

Mỗi mục của một HashMap/table Hash là <KEY, VALUE> cặp nơi các phím là duy nhất (nhưng không hạn chế đối với giá trị tương ứng của chúng trong cặp)

Bước 1:

Duyệt qua tất cả các yếu tố trong danh sách một lần: O (n)

  • Đối với mỗi yếu tố nhìn thấy trong danh sách, kiểm tra để xem nếu nó là trong HashMap đã O (1), khấu hao
    • Nếu không, hãy thêm nó vào HashMap với giá trị của các phần tử trong danh sách là KEY, và số lần bạn đã nhìn thấy giá trị này cho đến nay là GIÁ TRỊ O (1)
    • Nếu vậy, tăng số lần bạn đã nhìn thấy KEY này cho đến nay O (1)

Bước 2:

Duyệt qua HashMap và đếm KEYS với giá trị bằng chính xác 1 (do đó duy nhất) O (n)

Phân tích:

  • Runtime: O (n), khấu hao
  • Không gian: O (U), trong đó U là số giá trị khác biệt.

Tuy nhiên, nếu bạn đang tìm kiếm "khác biệt" giá trị (Như trong nếu bạn muốn đếm có bao nhiêu khác nhau yếu tố có), sử dụng một HashSet thay vì một HashMap/Hash bảng, và sau đó chỉ cần truy vấn kích thước của HashSet.

+0

Đây là cách tìm một số giá trị duy nhất trong danh sách và câu hỏi là tìm một số giá trị khác biệt. Để đếm các giá trị riêng biệt, hãy sử dụng [HashSet] (http://docs.oracle.com/javase/6/docs/api/java/util/HashSet.html). Chỉ cần thêm mọi phần tử của danh sách vào HashSet và kiểm tra cardinality của nó. – user1871166

+1

Bạn sẽ không muốn tính TẤT CẢ các giá trị trong HashMap ở bước 2, thay vì chỉ những giá trị có giá trị 1? Làm theo cách này sẽ chỉ đếm các phần tử xuất hiện chính xác một lần, ví dụ: danh sách {PAT, PAT, STEVE, JOEL} sẽ dẫn đến giá trị là 2 (chỉ STEVE và JOEL xảy ra một lần) thay vì giá trị đúng của 3 tên riêng biệt. – Jason

+0

Lưu ý! Có một sự khác biệt về giải thích ở đây: Giả định của tôi là nếu bạn thấy một giá trị cụ thể 2 hoặc nhiều lần, nó không còn "khác biệt"/"duy nhất" - nhưng tôi sẽ chỉnh sửa nó rõ ràng hơn. –

0

Bạn có thể điều chỉnh this extremely cool O(n)-time and O(1)-space in-place algorithm để xóa các mục trùng lặp với nhiệm vụ đếm các giá trị riêng biệt - chỉ cần đếm số giá trị bằng giá trị sentinel trong thẻ O (n) cuối cùng và trừ đi từ kích thước của danh sách.

0

Thêm mọi phần tử của danh sách vào một số HashSet và sau đó kiểm tra size (cardinality) của HashSet, là số giá trị khác biệt trong danh sách.

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