だから私はコーメンで赤黒木を学び、すごいです!通常、すべてのアルゴリズムとデータ構造を理解して、疑似コードを見なくても、最初から再構築できるようにします。私はアルゴリズムが本当に好きなので、アルゴリズムの仕組みを学ぶのを楽しんでいます。通常は1行ずつコードを見て、何が起こっているのかがわかっているかどうかを確認して、いくつかのケースを試します。
何が起こっているのかを理解するだけで、RBツリーにかなりの時間がかかりました。その本の説明があっても、コードを理解するのは難しいと感じました。言うまでもなく、ローテーションがどのように/なぜ機能するのか理解できませんでした。直感的にはわかりません。つまり、3つの(実際には6つの)挿入の場合があり、次に4つの削除の場合がありますか?このことを理解することは可能ですか?不正行為なしでこのコードを再構築することは不可能です。バイナリツリーができるまでは、頭の中で実装することができましたが、少し調整することで常に機能しますが、RBツリーでは試そうとはしていません。つまり、先生でさえ混乱することがあったので、それほど簡単ではないと思いますが、同時に、起こっていることすべてを理解する必要はないのでしょうか。この本は、ローテーションのアイデアを誰かが思いついた方法を実際には説明していませんでした。 2回転で挿入の問題を解決できることに誰かが気づいたのはどうしてですか?すごい!
私の質問は、RBツリーを100%理解しなければならないのですか?私はそれを完全に理解していないと、一種の悪いスキップを感じます。よろしくお願いします! (PS:RBツリーのタグはなく、実際にはツリーもありません。バイナリツリーだけなので、アルゴリズムのみを配置します)
あなたは「理解する」という考えを「本を見なくてもコードを書くことができる」ということと同じように思われます。これらは2つの異なるものです。バランスを維持するために、ツリーノードを回転させるとツリーがどのように再配置されるかがわかると、理解できます。ローテーションが適用されるすべてのケースをすぐに思い出せることは重要ではありません。
私自身、ペン/紙/数時間それをいじってみれば、回転を理解できるでしょう。しかし、私は確かにそれを考えずに書くことはできませんでした。実際にそのようなアルゴリズムを作成する必要がある場合は、それを調べて、すべての詳細が正しいことを確認します。もちろん、ほとんどすべての状況で、すでに記述されているコードを使用します。
このすべてが使用されるのは、どのアルゴリズムにもまったく適合しない状況に遭遇したときです。独自のツリー実装を作成する必要はありません。しかし、たとえば、二重にリンクされたリストの履歴をフラット化する必要があることに気づくかもしれません。その場合、ローテーションの背後にある基本的な考え方を理解しておくと非常に役立ちます。
関数型プログラミングにまったく精通している場合は、このアプローチの方が良いかもしれません(Okasaki 1999)。
http://www.eecs.usma.edu/webs/people/okasaki/jfp99redblack.pdf
そうでない場合は、少なくとも最初の文から心を奪ってください。
誰もが、コンピュータサイエンスの入門クラスでバランスのとれたバイナリサーチツリーについて学習しますが、そのような獣を実際に実装することを考えると、心を揺さぶられます。
ローテーションを詳細に理解する必要はありません。あなたshould RBツリーと2-3-4ツリーの関係を理解している(Sedgewickを参照)。あなたがそれらを2-3-4の木と考えると、それらすべてのクレイジーローテーションははるかに意味があります。教授が2-3-4ツリーの実装の詳細としてRBツリーを教えていない場合は、おそらく2-3-4ツリーについて何かを読む必要があります。 (セジウィックの扱いはかなり良いです;ウィキペディアはそれを持っていません。)
より一般的には、アルゴリズムが機能する理由の実装の詳細を理解することが役立つ場合があります。アルゴリズムが機能する理由のロジックを理解することは、ほとんど常に役立ちます。アルゴリズムを自分で思いつくことができる必要は通常ありませんが、理解するアルゴリズムが多ければ多いほど、チャンスが高まります。
来週の試験で「RB Trees By Heart」が必要な場合は、弾丸をかじって学ぶ必要があります。その場合、学習方法を再考する必要があります。おそらく、RBツリーをクラスメートに説明しようとすることは、孤独なコードを書く別の夜よりも役立つでしょう。
RB Treesが休暇後の次のコースのベースである場合は、すぐにスキップして(悪感情なしで)、この学期のコースに集中してください。しかし、RB Treesでの2回目の試みに備えることができるトピックに目を離さないでください。
本当に必要がないと正直に感じた場合(Anna Learのコメントを参照)、後悔せずにキスをして別れを告げてください-知識の低下が誰よりも少ないことを誰も知りません(あまりにも悪いので、教師はその低下が最も多いと考えています)重要)。
プログラミングの成功の鍵は決してあきらめないこと:
今日、そのRBツリーは明日は別のものになります。より大きなレッスンはあきらめないです。
私にとって、それはあきらめるのではなく、プログラミングの本質の1つです...
私はあなたに挑戦を続けるを、そして失敗した場合もう一度やり直すをお勧めします。
「手に入るまで、それがカチッと鳴るまで、それが実行されるまで。」
山を越えると空が晴れるから。あなたの心は理解において変化します、あなたは一時的に上昇します(次の山まで)。この一時的な標高は、世界中のすべてのお金よりも価値があります。
それを理解する最良の方法は、試してみることです:
それは私たちが大学でそれをした方法です。そして試験では、その一部がどのように機能したかを説明しなければなりませんでした。