Tùy thuộc vào nhiều thứ. Đó là thường là O (1), với một băm phong nha mà chính nó là không đổi ... nhưng bạn có thể có một băm mất nhiều thời gian để tính toán, và nếu có nhiều mục trong bản đồ băm trả về cùng một mã băm, get
sẽ phải lặp qua chúng gọi equals
trên mỗi người trong số họ để tìm một kết quả phù hợp.
Trong trường hợp xấu nhất, HashMap
có tra cứu O (n) do đi qua tất cả các mục nhập trong cùng một nhóm băm (ví dụ: nếu tất cả đều có cùng mã băm). May mắn thay, trường hợp xấu nhất đó không xuất hiện rất thường xuyên trong đời thực, theo kinh nghiệm của tôi. Vì vậy, không, O (1) chắc chắn không được đảm bảo - nhưng nó thường là những gì bạn nên giả định khi xem xét các thuật toán và cấu trúc dữ liệu để sử dụng.
Trong JDK 8, HashMap
đã được tinh chỉnh sao cho nếu các phím có thể được so sánh để đặt hàng, thì bất kỳ nhóm đông dân cư nào được triển khai dưới dạng cây, để ngay cả khi có nhiều mục nhập có cùng mã băm, độ phức tạp là O (log n). Điều đó có thể gây ra các vấn đề nếu bạn có một loại khóa nơi mà sự bình đẳng và thứ tự khác nhau, tất nhiên.
Và có, nếu bạn không có đủ bộ nhớ cho bản đồ băm, bạn sẽ gặp sự cố ... nhưng điều đó sẽ đúng với bất kỳ cấu trúc dữ liệu nào bạn sử dụng.
Nguồn
2010-12-29 11:25:06
Bạn có thể muốn tìm khái niệm về độ phức tạp phân bổ. Xem ví dụ ở đây: stackoverflow.com/questions/3949217/time-complexity-of-hash-table Trường hợp phức tạp tồi tệ nhất không phải là biện pháp quan trọng nhất đối với bảng băm –
Đúng - đó là _amortized_ O (1) - không bao giờ quên rằng phần đầu tiên và bạn sẽ không có các loại câu hỏi này :) –