RBツリーを完全に理解しなくても大丈夫ですか?[閉まっている]


15

だから私はちょうどコーメンで赤黒の木を学び、すごい!通常、私はすべてのアルゴリズムとデータ構造を理解して、疑似コードをチートすることなく最初から再構築できるようにします。私はアルゴリズムが本当に好きなので、それらがどのように機能するかを学ぶことを楽しんでいます。通常、1行ずつ行き、コードを見て、何が起こっているのか理解しているかどうかを確認して、いくつかのケースを試します。

何が起こっているのかを理解するだけで、RBツリーにかなりの時間がかかりました。本の説明があっても、コードを理解するのは難しいと感じました。言うまでもなく、回転がどのように/なぜ機能するのか理解できませんでした。直感的ではありません。つまり、3つの(実際には6つの)挿入の場合と、4つの削除の場合ですか?このことを理解することは可能ですか?不正行為をせずにこのコードを再構築することは不可能です。バイナリツリーまでは、いくつかの微調整を行って頭の外にあるものを実装できますが、RBツリーは試してさえいません。つまり、先生でさえ混乱することもあるので、それほど簡単ではないと思いますが、同時に、起こっていることすべてを理解する必要があるのでしょうか、少なくともその理由は何でしょうか?本はしなかった 誰かがどのように回転のアイデアを思いついたのかを本当に説明します。誰かが2回転で挿入の問題を解決できることに気づきましたか?すごい!

私の質問は、本当にRBツリーを100%理解する必要があるのですか?私はそれを完全に理解せずにある種の悪いスキップを感じます。よろしくお願いします!(PS:RB-treeにはタグがなく、実際にはツリーにもタグがなく、バイナリツリーだけなので、アルゴリズムのみを配置します)


18
「若い男、数学では物事を理解していません。あなたはそれらに慣れるだけです。」-ジョン・フォン・ノイマン

2
@Clashどのコンテキストで?RBツリーがプロフェッショナルな環境でどのように機能するかを知る必要はないと思いますが、それはあなたが何をしたいかによって異なるかもしれません。必要になるまでスキップしても構いません。
アダム・リア

4
@Clash外部ソースからのガイダンスで何かを実装するのは「ごまかし」だと言うのは非常に気になります。疑似コードは理由があるため、メモリから実行する必要がなくなります。私はウィンストンに完全に同意します。記憶から理解し知ることは、2つの異なる相互に排他的なものです。暗記!=理解と理解!=暗記。
-doppelgreener

3
実際にRBツリーを気にしなくても大丈夫です-必要になるまで?
スティーブンA.ロウ

1
他のすべてのタイプのツリー実装に優先して、RBツリーを使用する必要がある場合は理解できます。それらが解決する問題と、RBツリーを選択するすべての理由を知ってください。ただし、(もちろん試験の外で)1つを実装する必要がある場合は、調べることができます。なぜメモリからそれを行う方法をわざわざわざわざ?
ダウッドは、モニカを

回答:


13

あなたは「理解する」という考えを「本を見なくてもコードを書くことができる」という考えと同一視しているようです。これらは2つの異なるものです。バランスを維持するためにツリーノードを回転させるとツリーがどのように再配置されるかを確認できれば、理解できます。回転が適用されるすべてのケースをすぐに思い出せることは重要ではありません。

筆者は、ペン/紙/数時間プレイしてみたら、おそらく回転を理解できたでしょう。しかし、私は確かに考えずにそれを書くことができませんでした。実際にこのようなアルゴリズムを作成する必要がある場合、詳細をすべて確認するために調べます。もちろん、ほとんどすべての状況で、すでに記述されたコードを使用します。

このすべてが使用されるのは、どのアルゴリズムにも適合しない状況に遭遇したときです。独自のツリー実装を記述する必要はありません。ただし、たとえば、二重リンクリストの階層をフラット化する必要がある場合があります。その場合、回転の背後にある基本的な考え方を理解することは非常に役立ちます。


2
「あなたは「理解する」という考えを「本を見ずにコードを書くことができる」と同じように思えます。これらは2つの異なるものです。」エラー...いいえ。あなたがこれを書いているなら、それはおそらく、大学の1年か2年を超えて数学をあまり勉強していないことを意味します。ある時点で、「理解」数学(チューリングの礼儀、コンピューティングに相当します)は、あなたが「理解」したことを示すことができることについてのみです。回避策、ifs、maybes、foo、bar、bazはありません。そのレベルでは、数学の主張を証明できなければ、乾杯です。(あなたの名前がフェルマーでない限り)
デニスドバーナーディ

14
@デニス、私はCSで修士号を取得しており、メジャーの平均以上の数の数学コースがあります。あなたは私の意味を理解していないのではないかと心配しています。理解したことを証明または実証できることが非常に重要です。証明や方法の詳細を覚えることはできません。コードを記述できる必要があります。しかし、MEMORYからコードを作成できるようにするための要件の使用は見当たりません。
ウィンストンイーバート

2
あなたがそれを調べる場所にも注意してください-IIRC、いくつかの教科書は赤黒木アルゴリズムに重大な間違いがあります。
Steve314

2
@ Steve314、あなたはRBを教科書の著者になるために理解する必要さえありません!;)
ウィンストンイーバート

ウィンストンに感謝します、これは私を安心させます!近いうちに投稿するかもしれないコードで理解できなかったことがいくつかあります。しかし、挿入の3/6ケースと削除の4/8ケースになぜ/どのように気づいたのか、なぜ/どのように誰かが気づいたのか理解できなくても大丈夫です(理解することで理解できます)。
ベルナルドピレス

4

関数型プログラミングに精通しているのであれば、それらへのこのアプローチの方が良いかもしれません(Okasaki 1999):

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

そうでない場合、少なくとも冒頭の文から心を取ります:

誰もがコンピュータサイエンスの入門クラスでバランスのとれたバイナリ検索ツリーについて学びますが、実際にそのような獣を実装するという考えに心震えさえします。


ハハライアン!それは私を安心させます!どうもありがとう!今日、私はRBツリーに関するSOに関する質問がほとんどないことに気付きました。だから、彼らは本当にトリッキーだと思います。
ベルナルドピレス

2
私は、大学生のCS学生を除いて、彼らはプログラミング言語ごとに約1回実装されているようなものだと思う。(またはそれ以下。Schemeで最も人気のあるRBコードはOCamlのRBコードから移植されたと思います。)
ライアンカルペッパー

リンクが壊れています:ミラー1ミラー2。将来のある時点で両方のミラーが利用できない場合の完全な引用:クリス・オカサキ、「機能設定の赤黒木」、Journal of Functional Programming、9(4)、pp471-477、1999
Snowball

3

ローテーションを詳細に理解する必要はありません。RBツリーと2-3-4ツリーの関係理解する必要があります(Sedgewickを参照)。これらのクレイジーなローテーションはすべて、2〜3〜4本の木と考えると非常に理にかなっています。教授が2-3-4ツリーの実装の詳細としてRBツリーを教えていない場合は、おそらく2-3-4ツリーの内容を読んでください。(Sedgewickの扱いはかなり良い。Wikipediaにはない。)

より一般的には、アルゴリズムが機能する理由の実装の詳細を理解することが役立つ場合があります。アルゴリズムが機能する理由のロジックを理解することは、ほとんどの場合に役立ちます。アルゴリズムを自分で考え出すことは通常は必要ありませんが、理解するアルゴリズムが多いほど、より良いチャンスが得られます。


1

来週の試験で「RB Trees By Heart」が必要な場合は、弾丸を噛んで学習する必要があります。その場合、学習方法を再検討する必要があります。おそらく、RB Treesをクラスメートに説明しようとすることは、寂しいコード作成の夜よりもあなたを助けるでしょう。

RBツリーが休暇後の次のコースのベースになっている場合は、今すぐ(悪い気持ちなしに)スキップして、この学期のコースに集中してください。ただし、RB Treesでの2回目の試行に備えたトピックについては、目を離さないでください。

本当に必要ないだろうと正直に感じたら(アンナリアのコメントを参照)、後悔せずにキスしてください-知識の海の低下を知っている人はいません重要)。


1

プログラミングの成功の鍵は、決してあきらめないことです:

今日、そのRBツリーは明日、何か別のものになります。大きな教訓はあきらめない

私にとって、それはプログラミングの核心の本質の1つであり、あきらめません...

私はあなたがいることを示唆している努力を続ける、とあなたが失敗したときにDO IT AGAINを

「取得するまで、クリックするまで、実行するまで」

山に打ち勝つと空が晴れるからです。あなたの心は理解において変化し、あなたは一時的に(次の山まで)上昇します。この一時的な上昇は、世界のすべてのお金よりも価値があります。


おかげで、これはまさに私の恐怖でした!これをあきらめた場合、次のことをあきらめるのを妨げるものは何ですか?これが、挿入と削除を理解するためだけにほぼ1日無駄にした理由です。
ベルナルドピレス

それは決して無駄ではありません。すべての汗と涙を補う以上に標高を「クリック」すると信じられます。
ダークナイト

0

それを理解する最良の方法は、試してみることです:

  • 3または6回転があります。一枚の紙を取り、それらを一つずつ書きます。
  • 入手したら、Red Black Treeを実装します。いくつかの項目を調べる必要がある場合でも問題ありません。

それが大学でのやり方です。そして、試験のために、その一部がどのように機能したかを説明しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.