Cây AVL và thế giới THỰC SỰ


14

ở trường, chúng ta được dạy cách chúng ta có thể cân bằng cây AVL khi chèn hoặc xóa.

Làm thế nào là loại kiến ​​thức này thực sự sẽ hữu ích trong thế giới thực? Ai đó có thể đưa ra một ví dụ về khi loại kiến ​​thức này thực sự hữu ích?

Từ những gì tôi đã thấy, ở nơi làm việc, những chi tiết như vậy hầu như không xuất hiện ...

Tôi có thể thấy kiến ​​thức chi tiết về thuật toán và một số cấu trúc dữ liệu có thể quan trọng nhưng không phải là chi tiết như xoay cây AVL (và các khái niệm chi tiết tương tự).

cảm ơn!


7
Nó hữu ích trong các cuộc phỏng vấn, nếu đó là thế giới thực.
Kevin

Đây là lý lẽ tương tự mà một số người đưa ra về việc học lượng giác ở trường "Sheesh! Khi nào tôi sẽ sử dụng nó trong cuộc sống thực?", Và câu trả lời là "nó nghĩ bạn làm thế nào để phân tích và giải quyết toàn bộ một lớp vấn đề" . Điều đó và một ngày nào đó bạn muốn chặt một cái cây và đối tác của bạn hỏi "Bạn có chắc là nó sẽ không đâm vào nhà không?" Trig để giải cứu!
Nhị phân nhị phân

Câu trả lời:


13

Nghiên cứu về cây AVL có thể hữu ích vì những lý do sau:

  • Đó là thực tiễn tuyệt vời cho lý luận về dữ liệu trừu tượng. Bạn không cần phải suy nghĩ về một cây cụ thể, bạn phải xem xét mọi khả năng. Thực hành với loại lý luận này cũng có thể giúp với các trường hợp đơn giản hơn.

  • Đó là thực hành tuyệt vời để hiểu các vị ngữ và hợp đồng. Đảm bảo rằng một cây được cân bằng và các công cụ bạn sử dụng để chứng minh mỗi cân bằng được bảo toàn hoạt động, ví dụ, có thể được áp dụng cho các mối quan tâm bảo mật và mã song song.

  • Nó trao quyền cho bạn để viết các biến thể của riêng bạn hoặc thậm chí để tạo ra các loại cấu trúc dữ liệu hoàn toàn mới.

  • Bạn cũng có thể phải triển khai cây AVL cho thư viện hoặc nền tảng mới.

Bạn có thể tranh luận về giá trị cụ thể của việc học từng loại thuật toán sắp xếp hoặc từng loại cây cân bằng. Nó không thực sự quan trọng với những gì bạn kết thúc việc học, nhưng bạn nên chắc chắn để có được bảo hiểm đầy đủ của các chủ đề quan trọng nhất.

Nếu bạn muốn xem các thuật toán hiểu biết quan trọng như thế nào trong thế giới thực, hãy đọc " Cách tiêu diệt một ý tưởng tuyệt vời! ", Một bài viết trên Inc về sự sụp đổ của Friendster và cách áp dụng các nguyên tắc cơ bản nhỏ nhất để cải thiện hiệu quả có thể giúp họ.


Bài viết thú vị, nhưng tôi không thấy cây AVL sẽ giúp bạn như thế nào.
Eratosthenes

Tôi muốn xem một ví dụ, như B + -Trees được sử dụng để lập chỉ mục cơ sở dữ liệu.
Luca Fülbier

5

Ngoài điểm Macneils ...

Cây đỏ đen có thể hữu ích trực tiếp hơn vì có những hoạt động hiệu quả hữu ích không được hỗ trợ rộng rãi trong việc triển khai thư viện tiêu chuẩn như C ++ std::map(ít nhất là AFAIK). Cây đỏ đen có thể hỗ trợ "tách" (cắt một cây thành hai, một cây chứa các khóa nhỏ hơn một khóa được chỉ định và một khóa chứa khóa lớn hơn) và "nối" (ngược lại, kết hợp một cây các phím lớn với một cây nhỏ cả hai khóa đều có thể được thực hiện trong thời gian O (log n), nhưng nếu chúng được hỗ trợ trong các thư viện container tiêu chuẩn, thì nó dường như là một điều được giấu kín.

Tuy nhiên, cấu trúc dữ liệu "tăng cường" là phổ biến. Một ví dụ đơn giản là thêm thông tin kích thước của cây con vào các nút trong hầu hết mọi cấu trúc dữ liệu cây để hỗ trợ đăng ký O (log n). Ví dụ phức tạp hơn bao gồm cây khoảng.

Khi bạn có ý tưởng tăng cấu trúc dữ liệu, có rất nhiều biến thể có thể hữu ích cho các ứng dụng cụ thể - và rất ít có sẵn được đóng gói sẵn dưới dạng thư viện. Các cấu trúc dữ liệu thư viện chuẩn hiện tại (ví dụ như std::map) không thể được tăng cường sao chép mã nguồn và sửa đổi trực tiếp - bạn không thể tăng chúng bằng các tham số mẫu.

Tất nhiên để phát triển cấu trúc dữ liệu tăng cường, bạn cần hiểu cấu trúc dữ liệu không tăng cường cơ bản.

Cây AVL có thể nhanh hơn cây đỏ đen nếu bạn thực hiện nhiều tìm kiếm hơn chèn / xóa (và với điều kiện bạn không cần các thao tác tách / nối đó), vì vậy tùy thuộc vào ứng dụng, chúng có thể là cơ sở rất tốt cho gia tăng.


1
+1 để tăng cấu trúc dữ liệu, mặc dù đó là một điều khá hiếm để làm. Hầu hết các lập trình viên không phải phấn đấu để thực hiện (tất cả chúng ta sẽ sử dụng C ++ / C / Fortran / hội).
Matthieu M.

@Matthieu - Tôi tin rằng nó phổ biến, nhưng chỉ trong một số loại môi trường phát triển nhất định. Đó không phải là một mâu thuẫn, trung thực, bởi vì ... errm, well ...
Steve314

Tôi hoàn toàn đồng ý! : D
Matthieu M.

5

Không

Nó thực sự không hữu ích trong thế giới thực ...

Ngoại trừ để làm cho bạn suy nghĩ .

Thế giới thực có nhiều vấn đề khó khăn hơn , nhiều trong số đó chưa có giải pháp nổi tiếng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.