Tôi chạy qua một xác nhận rằng HashSet <T> .Contains() là một hoạt động O (1). Điều này làm tôi ngạc nhiên vì mọi cuộc thảo luận về băm tôi gặp phải đều đề cập đến khả năng va chạm, có khả năng dẫn đến thời gian chạy O (n).O (1) tìm kiếm băm?
Tò mò, tôi đã xem tài liệu cho HashSet <T> .Có và cũng có HashTable.Contains. Tài liệu cho cả hai phương pháp đều đưa ra tuyên bố đó.
Khi tôi nhìn vào phản xạ, HashSet <T> .Contains() được thực hiện với vòng lặp for, trải qua danh sách các vị trí chứa các giá trị có cùng giá trị băm.
Bây giờ phải thừa nhận rằng, những thảo luận tương tự về băm cũng đã đề cập rằng một thuật toán băm tốt tránh va chạm và trong những trường hợp đó tra cứu thực sự sẽ là O (1). Nhưng sự hiểu biết của tôi về ký hiệu Big O là nó là thời gian chạy trường hợp xấu nhất, không tốt nhất.
Vì vậy, yêu cầu O (1) không chính xác? Hay tôi đang thiếu một cái gì đó?
Tôi ghét ký hiệu O lớn =] – Luiscencio
@Luiscencio Ký hiệu Big O chỉ đơn giản là những từ cho phép bạn nói với một lập trình viên khác về cách một hàm sẽ mở rộng. Những từ nào bạn đề nghị sẽ nhanh chóng cung cấp cho một lập trình viên một ý tưởng bán chính xác về mức độ của một hàm nhất định? –
[đùa] những gì về "chức năng của bạn là f ***** g ăn bộ xử lý f ***** g" – Luiscencio