2009-11-22 77 views
12

Ok, vì vậy đây là thứ luôn khiến tôi bận tâm. Cây cấu trúc dữ liệu tôi biết là:Làm cách nào để xác định loại cấu trúc dữ liệu cây nào để chọn?

  • cây nhị phân Unbalanced cây
  • AVL cây
  • đỏ-đen
  • 2-3 cây
  • B-cây
  • B * -trees
  • Số lần thử
  • Heaps
  • Heaps

Làm cách nào để xác định loại cây nào là công cụ tốt nhất cho công việc? Rõ ràng đống được sử dụng theo kiểu kinh điển để tạo thành hàng đợi ưu tiên. Nhưng phần còn lại của họ dường như là những cách khác nhau để làm điều tương tự. Có cách nào để chọn cách tốt nhất cho công việc không?

+1

bạn đang thiếu cây Andersson (còn gọi là cây AA), tương đương với cây 2-3 và có đặc điểm hiệu suất tương tự như cây đỏ đen, nhưng dễ thực hiện hơn – Christoph

+1

một cây khác giống cấu trúc dữ liệu đang treaps – swegi

+4

Và danh sách bỏ qua xác định! – Anna

Trả lời

26

Hãy chọn từng cái một, phải không?

  • cây nhị phân Unbalanced

Đối với nhiệm vụ tìm kiếm, không bao giờ. Về cơ bản, đặc tính hiệu suất của chúng sẽ hoàn toàn không thể dự đoán được và chi phí của việc cân bằng một cây sẽ không quá lớn để làm cho cây không cân bằng trở thành một giải pháp thay thế khả thi.

Ngoài ra, cây nhị phân không cân bằng tất nhiên có các ứng dụng khác, nhưng không phải là cây tìm kiếm.

  • cây AVL

Họ rất dễ để phát triển nhưng hiệu suất của chúng thường được vượt qua bởi các chiến lược cân bằng khác vì cân bằng chúng là tương đối tốn thời gian. Wikipedia claims rằng chúng hoạt động tốt hơn trong các kịch bản tìm kiếm chuyên sâu vì chiều cao của chúng thấp hơn một chút trong trường hợp xấu nhất.

  • đỏ-đen cây

Chúng được sử dụng trong hầu hết C++’std::map implemenations và có lẽ trong một vài thư viện tiêu chuẩn khác là tốt. Tuy nhiên, có good evidence rằng chúng thực sự kém hơn B (+) cây trong mỗi trường hợp do hành vi lưu vào bộ nhớ cache của CPU hiện đại. Trong lịch sử, khi bộ nhớ đệm không quan trọng (hoặc là tốt), chúng vượt qua cây B khi được sử dụng trong bộ nhớ chính.

  • 2-3 cây
  • B-cây
  • B * -trees

Những đòi hỏi sự cân nhắc kỹ lưỡng nhất của tất cả các cây, vì hằng số khác nhau được sử dụng là về cơ bản các phép thuật "huyền diệu" liên quan đến cách kỳ lạ và đôi khi không thể đoán trước được với kiến ​​trúc phần cứng cơ bản. Ví dụ: số lượng nút con tối ưu cho mỗi cấp có thể phụ thuộc vào kích thước của trang bộ nhớ hoặc dòng bộ nhớ cache.

Tôi biết không có quy tắc chung tốt để phân biệt giữa chúng.

  • Thử

hoàn toàn khác nhau. Tries cũng là các cây tìm kiếm, nhưng đối với việc truy xuất văn bản của các phần tử trong một kho văn bản. Một trie là một cây tiền tố không nén (tức là một cây trong đó các đường dẫn từ gốc đến các nút lá tương ứng với tất cả các tiền tố của một chuỗi đã cho).

Tries nên được so sánh với, và bù trừ, cây hậu tố, mảng hậu tốchỉ số q-gram - không quá nhiều so với cây tìm kiếm khác vì dữ liệu rằng họ tìm kiếm khác: thay vì của các từ rời rạc trong một kho văn bản, cấu trúc chỉ mục sau cho phép tìm kiếm hệ số .

  • Heaps

Như bạn đã nói, họ không được cây tìm kiếm ở tất cả.

+0

+1 Câu trả lời rất hay. –

0

Mỗi trong số này có độ phức tạp khác nhau để chèn, xóa và truy xuất, Tất cả đều có thời gian truy cập chủ yếu là O log (n).

5

Giống như bất kỳ cấu trúc dữ liệu nào khác, bạn phải biết các đặc điểm (độ phức tạp của tìm kiếm, chèn và xóa hoạt động) của từng loại cây và các yêu cầu của công việc bạn đang chọn công cụ. Cây có hiệu suất tốt nhất cho loại hoạt động bạn thường làm nhất thường là công cụ tốt nhất cho công việc.

Bạn thường có thể tìm thấy các đặc điểm chung cho bất kỳ loại cấu trúc dữ liệu nào trên Wikipedia. Introduction to Algorithms cũng có ít nhất một phần (trong một số trường hợp là toàn bộ chương) trên hầu hết các cấu trúc dữ liệu bạn đã liệt kê, vì vậy đây là một tham chiếu tốt khác.

+1

Tôi đã lên kế hoạch đào bới cuốn sách đó cuối cùng. Tôi chỉ thấy rằng nó thường dễ dàng hơn để có được một ý tưởng tổng thể về những gì tôi nên chú ý trước khi vào nó. :-) –

+0

@ Jason: Tôi làm điều tương tự, kiểm tra Wikipedia và SO trước, trước khi poring thông qua các tài liệu in. –

0

Mỗi cây có các đặc điểm cụ thể giúp chúng hữu ích theo một cách nhất định. Bạn nên so sánh các đặc điểm với nhu cầu của bạn.

4

tương tự câu hỏi: When to choose RB tree, B-Tree or AVL tree?

sửa soạn trước, tôi muốn nói, viết mã đơn giản mà có thể làm việc (availing mình của cấu trúc dữ liệu thư viện được cung cấp nếu có thể). Sau đó đo lường các vấn đề hiệu suất của nó, nếu có.

Nếu nhu cầu hiệu suất của bạn thực sự khắc nghiệt, hãy đọc câu trả lời tuyệt vời của Konrad Rudolph.:)

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