Cây nhị phân có phục vụ một mục đích cụ thể trong việc lưu trữ dữ liệu phân cấp không? Sử dụng kinh điển của họ là gì?


12

Tôi hiểu cấu trúc của cây nhị phân và làm thế nào để vượt qua chúng. Tuy nhiên, tôi đang vật lộn để nhận ra mục đích sử dụng thực tế của họ, mục đích trong các chương trình và lập trình. Khi tôi nghĩ về các ví dụ 'đời thực' về dữ liệu phân cấp, họ gần như chắc chắn có nhiều hơn 2 con. Ví dụ, trong một cây gia đình, một người mẹ thường có thể có nhiều hơn hai đứa con.

Có phải 'cây nhị phân' thực sự chỉ hữu ích để lưu trữ dữ liệu liên quan tuyến tính do thời gian xử lý nhanh hơn các mảng và danh sách? Ngoài ra, họ có phục vụ một mục đích cụ thể trong việc lưu trữ dữ liệu phân cấp không? Nếu vậy, những ví dụ nào có ứng dụng của cây nhị phân. Dữ liệu nào mà một nút có nhiều nhất là 2 con?


Tôi nghĩ rằng công dụng chính của cây nhị phân là đặt hàng dữ liệu. https://en.wikipedia.org/wiki/Binary_search_tree
Mandrill

Câu trả lời:


25

Không, cây nhị phân không phải để lưu trữ dữ liệu phân cấp theo nghĩa bạn nghĩ đến. Trường hợp sử dụng chính cho các cây n-ary, trong đó nlà một số cố định, là khả năng tìm kiếm nhanh , không phải là hệ thống phân cấp ngữ nghĩa.

Hãy nhớ trò chơi cũ trong đó một người nghĩ về một số từ 1 đến 100, và người kia phải đoán nó trong số ít lần đoán nhất có thể, và nếu bạn đoán sai, người đó nghĩ về số đó sẽ cho bạn biết nếu bạn cũng vậy cao hay quá thấp? Sau một thời gian, nó trở nên nhàm chán vì bạn nhanh chóng nhận ra rằng bạn nên luôn bắt đầu từ 50, sau đó chuyển sang 25 hoặc 75 và tiếp tục chia phạm vi để tìm kiếm một nửa với mỗi lần đoán mới sau đó, và cuối cùng bạn có thể đoán bất kỳ số nào trong tối đa 7 lần đoán, đảm bảo.

Nó có thể không tạo ra một trò chơi vui nhộn, nhưng thuộc tính đó là thứ làm cho cây nhị phân (và các n-ary khác) trở nên hữu ích: bạn có thể sử dụng chúng để tìm kiếm một tập dữ liệu rất lớn trong một khoảng thời gian rất nhỏ.


Câu trả lời tuyệt vời cảm ơn bạn rất nhiều. Vì vậy, cây nhị phân thực sự chỉ là một cấu trúc khác để lưu trữ dữ liệu như bạn có trong một mảng hoặc danh sách, nhưng với lợi ích bổ sung của khả năng tìm kiếm nhanh?
sw123456

1
@ sw123456: Đúng vậy. Như với bất kỳ kỹ thuật nào, nó đi kèm với sự đánh đổi, (sử dụng bộ nhớ nhiều hơn và phân mảnh hơn so với một mảng có cùng số phần tử, truy cập O (n) vào phần tử #n của tập dữ liệu thay vì O (1) truy cập, v.v.) nhưng tìm kiếm nhanh chắc chắn là lợi ích chính của cây nhị phân.
Mason Wheeler

@ sw123456 Vui mừng tôi có thể giúp giải thích nó :)
Mason Wheeler

3
Truy cập vào các phần tử là O (log (n)) khi cây được cân bằng. O (n) sẽ là trường hợp xấu nhất khi nó bị suy biến (hầu hết các nút chỉ có một dấu ngoặc).
Mandrill

@ sw123456 Định tuyến mạng sử dụng một sửa đổi nhỏ của cây nhị phân gọi là Trie (được tạo để mang lại hiệu quả cao hơn cho miền có vấn đề). Nó thực sự lưu trữ thông tin phân cấp khi các bộ định tuyến truyền qua cây từng bit một khi tìm kiếm địa chỉ IP để tìm nơi cần chuyển tiếp gói tin đến. Các địa chỉ IP về bản chất cũng được phân cấp, do đó, khi đi ngang qua IP để tìm tiền tố dài nhất, bộ định tuyến đang đi qua hệ thống phân cấp IP, IP mạng con, v.v. Không rõ ràng về mặt ngữ nghĩa, nhưng mối quan hệ là ở đó. Bộ định tuyến sử dụng cấu trúc này để tìm kiếm hiệu quả, như Mason đã trả lời.
Chris Cirefice

3

Bất kỳ cấu trúc cây nào, nơi một nút có thể có số lượng con không giới hạn, có thể được thực hiện bằng cách sử dụng cây nhị phân.

Đối với mỗi nút trong cây của bạn, thay thế nó bằng một nút bằng con trỏ phải và trái. Con trỏ bên trái đi đến con đầu tiên của nút. Nút bên phải đi đến anh chị em tiếp theo của nút. Tất cả các phần tử con của một nút đã cho đều nằm trong một danh sách được liên kết được nối bởi các con trỏ bên phải của chúng, với phần đầu của danh sách được trỏ bởi con trỏ bên trái của cha mẹ chúng.

Cây n-ary phức tạp của bạn đã trở thành một cây nhị phân đơn giản.

Tôi chắc chắn đây là ở Knuth, Vol. 1 đâu đó.


Đây là một thực hiện thực sự thú vị. Tôi có đúng không khi nghĩ rằng vì mỗi nút con là điểm bắt đầu của danh sách được liên kết, nên cây sẽ không còn là O (log) n) nếu được cân bằng hoặc O (n) nếu không, do thực tế là việc truy cập từng nút sẽ bắt đầu tắt một tìm kiếm tuyến tính? Việc thực hiện này sẽ dẫn đến thời gian tìm kiếm chậm hơn nhiều? Nhưng về mặt tích cực, thời gian tìm kiếm sẽ nhanh hơn so với cấu trúc tuyến tính tiêu chuẩn? Tôi đã hiểu điều này một cách chính xác?
sw123456

@ sw123456, Nếu cây ban đầu được cân bằng, cây nhị phân kết quả gần như chắc chắn sẽ không. Tôi tin rằng mọi thứ khác sẽ phụ thuộc vào quạt ra khỏi cây, có bao nhiêu nút con có. Một tìm kiếm tuyến tính sẽ chỉ xảy ra khi tìm ra con nào của một nút đã cho. Nhưng tôi không chắc bạn có thể tránh điều đó trong bất kỳ triển khai nào khác của cây n-ary.
Jowersalt 8/07/2015

2

Cây nhị phân tại sao sử dụng chúng?

Trong lập trình, bạn làm việc rất nhiều với các bộ sưu tập cùng loại dữ liệu.

Hai cách cơ bản để lưu trữ dữ liệu này là: danh sách và mảng được liên kết.

Cả hai đều đi kèm với những nhược điểm: Trong một danh sách được liên kết, thật dễ dàng để thêm các phần tử ở bất kỳ vị trí nào hoặc loại bỏ các phần tử. Nhưng việc truy cập vào một yếu tố cụ thể khó hơn, bởi vì bạn phải đi qua danh sách cho đến khi bạn ở yếu tố bạn muốn.

  • Nó không tìm kiếm hiệu quả nhưng chèn và xóa rất dễ dàng.

Với việc truy cập mảng vào một phần tử cụ thể thì dễ dàng, nhưng việc chèn hoặc xóa phần tử sẽ khó hơn vì chèn phương tiện: mở rộng mảng bằng một, dịch chuyển tất cả các phần tử trước vị trí chèn 1 sang phải và chèn phần tử.

  • Nó tìm kiếm hiệu quả (nếu được sắp xếp) nhưng chèn và xóa là khó.

Vì vậy, cả danh sách liên kết và mảng có nhược điểm.

Cây nhị phân được tạo để giải quyết cả hai vấn đề của mảng và danh sách được liên kết:

  1. Dễ dàng chèn và xóa
  2. Dễ dàng tìm kiếm

Vì vậy, cây nhị phân được tạo ra khi bạn có nhiều dữ liệu thay đổi thường xuyên.

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.