Có ổn không khi hiểu đầy đủ về cây RB? [đóng cửa]


15

Vì vậy, tôi mới học cây đen đỏ ở Cormen và wow! Thông thường tôi muốn hiểu tất cả các thuật toán và cấu trúc dữ liệu đến mức tôi có thể xây dựng lại chúng từ đầu mà không phải gian lận khi nhìn vào mã giả. Tôi thực sự thích các thuật toán vì vậy tôi thích học cách chúng hoạt động và tôi thường đi từng dòng một và thử một số trường hợp bằng cách xem mã và kiểm tra xem những gì đang xảy ra là điều tôi hiểu điều đó sẽ xảy ra.

Chỉ cần hiểu những gì đang xảy ra đã khiến tôi mất rất nhiều thời gian cho cây RB. Ngay cả với những lời giải thích của cuốn sách, tôi vẫn thấy khó nắm bắt được mã. Chưa kể rằng tôi không thể hiểu làm thế nào / tại sao các phép quay hoạt động. Tôi không thấy nó trực quan chút nào. Ý tôi là, ba (sáu thực tế) trường hợp khác nhau để chèn và sau đó là 4 trường hợp để xóa? Có thể hiểu điều này? Tôi không thể xây dựng lại mã này mà không gian lận. Cho đến khi cây nhị phân tôi có thể thực hiện những thứ trong đầu, với một số điều chỉnh nó sẽ luôn hoạt động, nhưng cây RB tôi thậm chí sẽ không thử. Ý tôi là, ngay cả giáo viên đôi khi cũng bối rối nên tôi cho rằng nó thực sự không dễ dàng, nhưng đồng thời, chúng ta không nên hiểu mọi thứ đang xảy ra hay ít nhất là tại sao? Cuốn sách đã không t thực sự giải thích làm thế nào một người nào đó nghĩ ra ý tưởng quay. Làm thế nào mà ai đó nhận thấy rằng với 2 lần quay, bạn có thể giải quyết bất kỳ vấn đề chèn nào? Thật ngạc nhiên!

Câu hỏi của tôi là, tôi thực sự phải hiểu 100% cây RB? Tôi cảm thấy loại bỏ qua những thứ xấu mà không hiểu đầy đủ về nó. Cảm ơn các bạn trước! (PS: không có thẻ cho cây RB, thực tế thậm chí không có cây, chỉ là cây nhị phân, vì vậy tôi chỉ đặt thuật toán)


18
"Chàng trai, trong toán học, bạn không hiểu mọi thứ. Bạn chỉ quen với chúng." - John von Neumann

2
@Clash Trong bối cảnh nào? Tôi không nghĩ rằng tôi đã từng cần biết cây RB hoạt động như thế nào trong môi trường chuyên nghiệp, nhưng điều đó có thể thay đổi dựa trên những gì bạn muốn làm. Tôi muốn nói rằng bạn ổn để bỏ qua chúng cho đến khi bạn cần chúng.
Adam Lear

4
@Clash Điều đó làm phiền tôi vô cùng khi bạn nói rằng đó là "gian lận" để thực hiện bất cứ điều gì với sự hướng dẫn từ một nguồn bên ngoài. Mã giả tồn tại vì một lý do - họ loại bỏ nhu cầu thực hiện nó khỏi bộ nhớ. Tôi hoàn toàn đồng ý với Winston: hiểu và biết từ bộ nhớ là hai thứ loại trừ lẫn nhau. Ghi nhớ! = Hiểu và hiểu! = Ghi nhớ.
doppelgreener

3
Bạn có thực sự không quan tâm đến cây RB - cho đến khi tôi cần chúng?
Steven A. Lowe

1
Có thể hiểu KHI bạn nên sử dụng cây RB, ưu tiên cho tất cả các loại thực hiện cây khác. Biết những vấn đề họ giải quyết và tất cả các lý do để chọn cây RB. Nhưng nếu bạn phải thực hiện một (tất nhiên là ngoài một bài kiểm tra), bạn sẽ có thể tra cứu nó; vậy tại sao phải biết làm thế nào để làm điều đó từ bộ nhớ?
Dawood nói phục hồi Monica

Câu trả lời:


13

Bạn dường như đánh đồng ý tưởng "hiểu" với "có thể viết mã mà không cần nhìn vào cuốn sách". Đây là hai điều khác nhau. Nếu bạn có thể thấy cách xoay các nút cây sắp xếp lại cây để duy trì sự cân bằng, thì bạn hiểu nó. Có thể nhớ lại ngay lập tức tất cả các trường hợp áp dụng phép quay không phải là điểm chính.

Bản thân tôi, có lẽ tôi có thể tìm ra các góc quay nếu tôi có bút / giấy / vài giờ để chơi với nó. Nhưng tôi chắc chắn không thể viết nó lên mà không suy nghĩ. Nếu tôi thực sự phải viết một thuật toán như vậy, tôi sẽ tra cứu nó để đảm bảo rằng tôi đã hiểu đúng tất cả các chi tiết. Tất nhiên, trong hầu hết mọi tình huống tôi sẽ sử dụng mã đã được viết.

Trường hợp tất cả những thứ này được sử dụng là khi bạn gặp một tình huống không phù hợp với bất kỳ thuật toán nào. Bạn sẽ không bao giờ cần phải viết thực hiện cây của riêng bạn. Nhưng bạn có thể thấy mình, cần phải san phẳng một người thừa kế các danh sách liên kết đôi. Trong trường hợp đó, việc hiểu được ý tưởng cơ bản đằng sau việc xoay vòng có thể rất hữu ích.


2
'Bạn dường như đánh đồng ý tưởng "hiểu" với "có thể viết mã mà không cần nhìn vào cuốn sách." Đây là hai điều khác nhau.' Ơ ... không. Nếu bạn đang viết bài này, điều đó có nghĩa là bạn chưa học toán nhiều hơn một hoặc hai năm đại học, thậm chí là thế. Tại một số điểm, "hiểu" toán học (mà, theo phép lịch sự của Turing, tương đương với điện toán) chỉ là về việc có thể chứng minh những gì bạn đã "hiểu". Không có cách giải quyết hoặc ifs hoặc maybes hoặc foo hoặc bar hoặc baz. Ở cấp độ đó, nếu bạn không thể chứng minh được khẳng định toán học của mình, bạn sẽ nướng. (Trừ khi tên của bạn là Fermat.)
Denis de Bernardy

14
@Dennis, tôi có bằng MS về CS với số lượng khóa học toán trên trung bình cho chuyên ngành. Tôi sợ rằng bạn đã không hiểu quan điểm của tôi. Có thể chứng minh hoặc chứng minh những gì bạn hiểu là rất quan trọng. Có thể ghi nhớ các chi tiết của một bằng chứng hoặc phương pháp không. Bạn NÊN có thể viết mã. Nhưng tôi không thấy bất kỳ việc sử dụng nào cho một yêu cầu để có thể viết mã từ NHỚ.
Winston Ewert

2
Hãy cẩn thận nơi bạn cũng tìm kiếm nó - IIRC, một số sách giáo khoa có lỗi đáng kể trong thuật toán cây đỏ đen của họ.
Steve314

2
@ Steve314, bạn thậm chí không cần phải hiểu RB để trở thành một tác giả sách giáo khoa! ;)
Winston Ewert

Cảm ơn Winston, điều này làm tôi nhẹ nhõm! Chỉ có một vài điều mà tôi không hiểu với mã mà tôi có thể đăng trong tương lai gần. Nhưng tôi rất vui vì không hiểu được (bằng cách hiểu ý tôi là viết mã mà không gian lận) tại sao / làm thế nào ai đó nhận thấy 3/6 trường hợp để chèn và 4/8 trường hợp để xóa.
Bernardo Pires

4

Nếu bạn hoàn toàn đối thoại với lập trình chức năng, bạn có thể thấy cách tiếp cận này với họ tốt hơn (Okasaki 1999):

http://www.eecs.usma.edu/webs/people/okasaki/jfp99redblack.pdf

Nếu không, ít nhất hãy lấy trái tim từ câu mở đầu:

Mọi người đều học về các cây tìm kiếm nhị phân cân bằng trong các lớp khoa học máy tính giới thiệu của họ, nhưng ngay cả sự run rẩy kinh ngạc khi nghĩ đến việc thực sự thực hiện một con thú như vậy.


Hahah ryan! Điều đó làm tôi nhẹ nhõm! Cảm ơn rất nhiều! Hôm nay tôi cũng nhận thấy rằng có rất ít câu hỏi về SO về RB-Plants. Vì vậy, tôi cho rằng họ thực sự khó khăn.
Bernardo Pires

2
Tôi nghĩ rằng đó chỉ là, ngoài các sinh viên CS đại học, họ là loại điều được thực hiện khoảng một lần cho mỗi ngôn ngữ lập trình. (Hoặc ít hơn. Tôi nghĩ rằng mã RB phổ biến nhất cho Lược đồ được chuyển từ mã RB cho OCaml.)
Ryan Culpepper

Liên kết bị hỏng: gương 1 , gương 2 . Trích dẫn đầy đủ trong trường hợp cả hai gương không có sẵn tại một thời điểm nào đó trong tương lai: Chris Okasaki, "Cây đỏ đen trong môi trường chức năng", Tạp chí lập trình chức năng, 9 (4), tr471-477, tháng 7 năm 1999.
Snowball

3

Bạn không cần phải hiểu chi tiết về các phép quay. Bạn nên hiểu mối quan hệ giữa cây RB và 2-3-4 cây (xem Sedgewick). Tất cả những góc quay điên rồ đó có ý nghĩa hơn rất nhiều khi bạn nghĩ về chúng như 2-3-4 cây. Nếu giáo sư của bạn không dạy cây RB như một chi tiết triển khai cho 2-3-4 cây, có lẽ bạn nên đọc một cái gì đó trên 2-3-4 cây. (Cách đối xử của Sedgewick khá tốt; Wikipedia không có.)

Tổng quát hơn, hiểu các chi tiết triển khai về lý do tại sao một thuật toán hoạt động đôi khi chỉ hữu ích. Hiểu logic tại sao thuật toán hoạt động hầu như luôn hữu ích. Việc có thể tự mình đưa ra thuật toán thường là không cần thiết, mặc dù bạn càng hiểu nhiều thuật toán thì cơ hội tốt hơn bạn sẽ có.


1

Nếu bạn cần "RB Plants By Heart" cho bài kiểm tra của bạn vào tuần tới, bạn sẽ phải cắn viên đạn và học chúng. Trong trường hợp đó, bạn nên xem xét lại phương pháp học tập của mình. Có lẽ cố gắng giải thích RB Plants cho một người bạn cùng lớp sẽ giúp bạn nhiều hơn một đêm viết mã đơn độc.

Nếu Cây RB là cơ sở cho khóa học tiếp theo của bạn sau kỳ nghỉ, hãy bỏ qua chúng ngay bây giờ (không có cảm giác xấu) và tập trung vào khóa học của học kỳ này. Nhưng hãy chú ý theo dõi các chủ đề có thể giúp bạn chuẩn bị cho lần thử thứ hai tại RB Plants.

Nếu bạn thành thật cảm thấy rằng bạn sẽ không bao giờ thực sự cần chúng (nhận xét của Anna Lear), hãy hôn tạm biệt họ mà không hối tiếc - không ai biết nhiều hơn rằng một giọt nước trong kiến ​​thức (thật tệ là giáo viên thường nghĩ rằng sự sụt giảm của họ là nhiều nhất quan trọng).


1

Chìa khóa để thành công trong lập trình là không bao giờ bỏ cuộc :

Hôm nay cây RB của nó vào ngày mai nó sẽ là một cái gì đó khác. Bài học lớn hơn là không từ bỏ .

Đối với tôi, đó là một trong những cốt lõi cốt lõi của lập trình, không từ bỏ ...

Tôi sẽ đề nghị bạn tiếp tục cố gắng và khi bạn thất bại HÃY THỬ .

"Cho đến khi bạn nhận được, cho đến khi nó nhấp, cho đến khi nó chạy."

Bởi vì một khi bạn vượt qua những ngọn núi, bầu trời trở nên rõ ràng. Tâm trí của bạn thay đổi trong sự hiểu biết, bạn được nâng lên theo thời gian (cho đến ngọn núi tiếp theo) . Độ cao tạm thời này đáng giá hơn tất cả số tiền trên thế giới ..


Cảm ơn, đây chính xác là nỗi sợ của tôi! Nếu tôi từ bỏ điều này, điều gì ngăn tôi từ bỏ điều tiếp theo? Đây là lý do tại sao tôi lãng phí gần như cả ngày chỉ để hiểu chèn và xóa.
Bernardo Pires

Nó không bao giờ là một sự lãng phí, hãy tin tôi khi nó "nhấp" độ cao nhiều hơn là bù cho tất cả mồ hôi và nước mắt.
Tối

0

Cách tốt nhất để hiểu nó là dùng thử :

  • Có 3 hoặc 6 vòng quay. Lấy một mảnh giấy và viết chúng ra từng cái một.
  • Khi bạn đã nhận được nó, hãy đi và thực hiện Red Black Tree. Không sao nếu bạn phải tìm kiếm một vài thứ.

Đó là cách chúng tôi đã làm nó ở trường đại học. Và để kiểm tra, chúng tôi phải giải thích một phần của nó hoạt động như thế nào.

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.