lựa chọn đầu tiên của bạn nên phụ thuộc vào mô hình truy cập mong đợi, và bao nhiêu dữ liệu bạn có thể sẽ lưu trữ: ...
- nếu không bao giờ có nhiều dữ liệu (n ít hơn 30, nói), một mảng unsorted sẽ được sử dụng tốt;
- nếu bạn gần như không bao giờ thêm, xóa hoặc cập nhật, một mảng được sắp xếp sẽ bị phạt;
- nếu n nhỏ hơn 1 triệu và bạn chỉ tìm kiếm phần tử hàng đầu (xếp hạng đầu tiên hoặc cuối cùng), heaps sẽ hoạt động tốt (đặc biệt nếu bạn thường xuyên cập nhật các phần tử đã chọn) một cách ngẫu nhiên, giống như bạn làm trong một hàng đợi LRU (ít được sử dụng gần đây nhất) cho bộ nhớ cache, vì trung bình một bản cập nhật là O (1), chứ không phải O (log (n)))
- nếu n nhỏ hơn 1 triệu, và bạn không chắc chắn mình sẽ tìm kiếm gì trong số , một cây cân bằng (nói, đỏ đen hoặc AVL) sẽ ổn;
- nếu n lớn (1 triệu trở lên), bạn có thể tốt hơn với b-tree hoặc một trie (hiệu suất của cây nhị phân cân bằng có xu hướng "rơi khỏi vách đá" khi n lớn đủ: truy cập bộ nhớ có xu hướng quá phân tán và bộ nhớ cache nhớ thực sự bắt đầu bị tổn thương)
...nhưng tôi khuyên bạn nên để tùy chọn mở càng tốt, để bạn có thể đánh dấu ít nhất một trong các lựa chọn thay thế và chuyển sang tùy chọn đó, nếu nó hoạt động tốt hơn. Trong hai mươi năm qua, tôi đã chỉ làm việc trên hai ứng dụng mà heaps là sự lựa chọn tốt nhất cho bất cứ điều gì (một lần cho một LRU, và một lần trong một ứng dụng nghiên cứu hoạt động khó chịu, khôi phục lại độ nhạy với k-chiều ngẫu nhiên bị nhiễu loạn hypercubes, nơi mà hầu hết các tế bào trong hypercube xuất hiện trong k khác nhau heaps và bộ nhớ là ở phí bảo hiểm). Tuy nhiên, trong hai lần đó, họ thực hiện tốt hơn nhiều so với các lựa chọn thay thế: nghĩa đen nhanh hơn hàng chục lần so với cây cân bằng hoặc cây b. Đối với vấn đề hypercube mà tôi đã đề cập trong đoạn cuối, đội trưởng của tôi nghĩ rằng cây đỏ đen sẽ hoạt động tốt hơn đống, nhưng điểm chuẩn cho thấy cây đỏ đen chậm hơn nhiều (như tôi nhớ lại, chúng là khoảng hai mươi lần chậm hơn), và mặc dù b-cây đã nhanh hơn đáng kể, heaps đánh bại họ thoải mái quá.
Tính năng quan trọng của heap, trong cả hai trường hợp tôi đã đề cập ở trên, không phải là O (1) tra cứu giá trị tối thiểu, mà là O (1) thời gian cập nhật trung bình cho một phần tử được chọn ngẫu nhiên .
-James Barbetti (Vâng, tôi nghĩ rằng tôi đã. Nhưng hình ảnh xác thực không ngừng nói với tôi rằng tôi không phải là người)
Nếu bạn đã triển khai một heap bằng cách sử dụng cấu trúc nút thay vì mảng, thì tôi sẽ tin những gì bạn đang nói :). –
A Heap là một cấu trúc dữ liệu khá đơn giản để thực hiện ... –