データ構造シリーズ パート1
このステップを始める開始スタック、キュー、二分木、ハッシュテーブル、連結リスト。それぞれをRustでゼロから実装し、実際に問題を解くのに使います。Rustでは次のノードを所有するノードはOption<Box<Node>>なので、所有権が自然に感じられ始めるのはここです。これを終えると、Vec、VecDeque、HashMapが何をしてくれているかがわかります。開始Rustの標準ライブラリには構造の大半(Vec、VecDeque、HashMap、BTreeMap、BinaryHeap)がそろっており、自分で書く構造には借用チェッカーが口を出してきます。単方向連結リストはOption<Box<Node>>で、親へのリンクを持つ木にはRc、RefCell、Weakが必要です。このパスでは、そのひとつひとつをRustで作り、それを使ってソート、再帰、グラフ探索を行い、最後は採点付きの面接問題で締めくくります。無料、ブラウザ完結、ほとんどのコースに修了証が付きます。
377 レッスン228 チャレンジ702 クイズの問題
各ステップは、すでにあるCoddyのコースの組み合わせで、どの「開始」ボタンもコースをRustで開きます。まだRustで教えていない3つのコースは、ステップの後にまとめて載せています。
Option<Box<Node>>なので、所有権が自然に感じられ始めるのはここです。これを終えると、Vec、VecDeque、HashMapが何をしてくれているかがわかります。開始BinaryHeapはデフォルトで最大値から出てくる、自分で書いたことのあるヒープになり、BTreeMapは仕組みのわかる順序付きの木になります。開始sortは安定で、sort_unstableはたいていそれより高速です。このステップを終えれば、安定性にどんなコストがかかり、いつそれを手放すべきかを説明できます。開始Boxを挟まないとコンパイラがサイズを決めてくれません。そしてその型に対する再帰関数は、SomeかNoneかの各ケースにマッチし、それがそのままベースケースと再帰ケースの分かれ目になります。Rustは末尾呼び出し最適化を約束していないので、十分に深い再帰はスタックをあふれさせ、プログラムを異常終了させます。動的計画法とビット演算は、それぞれPythonとC++で教えているため、ステップの後にまとめて載せています。開始専用ページReverse((distance, node))を入れたBinaryHeap、つまり最小ヒープに変えたステップ2のヒープです。開始Write real code, query databases, build websites, and master AI prompts. Our interactive lessons cover every skill modern developers need.
Stay consistent and watch your progress grow! Track your daily coding habit, protect your streak with freeze days, and earn rewards for showing up every day.
12 days streak
Return tomorrow to keep your streak!
January 2026
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
21
22
23
24
25
26
27
28
29
30
Double or Nothing
Day 5 of 7
Streak Freeze
2 left
Take your coding journey on the go! No setup, no downloads - just open and start coding. Available on iOS, Android and Web with 4.9 star ratings.
Compete on global leaderboards, invite friends to earn rewards, and celebrate each other's wins. Coding is better with friends!
Read, listen, test yourself, ask the AI, or look up anything you've already covered. Every lesson meets you where you are.
A variable is a named container that stores a value you can reference later in your program.
In Python, you create one by writing the name, an equals sign, then the value you want to store.
The value can change over time - reassigning the name simply points it to a new value.
Earn certificates for every course you complete. Add them to your LinkedIn profile and resume to showcase your coding expertise to employers.
Box、Option::take、Rc<RefCell<T>>、Weakは単なる構文ではなく設計判断になります。この言語の有名な解説に『Learning Rust With Entirely Too Many Linked Lists』という題名が付いているのは、そのためです。Vec<T>はスタック、VecDeque<T>はリングバッファでキュー、HashMapは意図的な衝突に備えてシードが設定されたハッシュテーブル、BTreeMapは順序付きのB木、BinaryHeap<T>は最大ヒープです。一度構造を自分で作れば、問題がどれを求めているのか、そしてダイクストラ法がなぜ要素をReverseで包むのかがわかります。!xと書き、立っているビットはcount_ones()で数えます。sortは安定で、安全なRustはガベージコレクタなしで、ダングリングポインタとデータ競合をコンパイル時に排除します。ポインタでつなぐ構造を書く側としては、CやJavaより難しくなります。RcとRefCellをあえて使わない限り、所有権が共有された可変のリンクを許さないからで、双方向連結リストや親ポインタを持つ木は、まさにそうしたリンクでできています。その難しさこそが学びでもあります。Rustでそれらを書けるようになれば、何を誰が所有しているのかが正確にわかります。Vec<T>は動的配列でスタック、VecDeque<T>はリングバッファでキュー、HashMapとHashSetはハッシュテーブル(デフォルトはSipHashで、多少の速度と引き換えに意図的な衝突に強くなっています)、BTreeMapとBTreeSetは順序付きのB木、BinaryHeap<T>は最大ヒープです。そしてLinkedList<T>は双方向連結リストですが、VecやVecDequeより好んで使う場面はめったにありません。トライ木やグラフの型はないので、それらは自分で作ります。Option<Box<Node>>を通じて次のノードを所有するからです。双方向連結リストや親へのリンクを持つ木は合いません。どのノードにも2本のポインタが向かうので、Rc<RefCell<Node>>を使い、逆向きのリンクにはWeakを充てるか、ノードをVecに入れてインデックスでつなぐことになります。『Learning Rust With Entirely Too Many Linked Lists』があるのは、まさにここでつまずく人がとても多いからです。BinaryHeap<T>は最大ヒープなので、各要素をstd::cmp::Reverseで包みます。Reverse(x)をプッシュすれば、最小のxが最初に出てきます。ダイクストラ法ではReverse((distance, node))をプッシュします。タプルはまず距離で比較されます。ステップ2で自分でヒープを書いたあとなら、順序を反転させるのは自明です。VecかHashMapです。またデバッグビルドでは整数のオーバーフローでパニックが起きるので、ラップアラウンドに頼るビットのテクニックでは、wrapping_addやwrapping_mulでそれを明示します。Optionは必要です。Boxとトレイトも知っていると役立ちます。初めて見るものがあれば、まずCoddyのRustコースが無料でそこまで連れて行ってくれます。このパスは、そのコースが終わるところから始まります。