データ構造シリーズ パート1
このステップを始める開始スタック、キュー、二分木、ハッシュテーブル、連結リスト。それぞれをRustでゼロから実装し、実際に問題を解くのに使います。Rustでは次のノードを所有するノードはOption<Box<Node>>なので、所有権が自然に感じられ始めるのはここです。これを終えると、Vec、VecDeque、HashMapが何をしてくれているかがわかります。開始Rustの標準ライブラリには構造の大半(Vec、VecDeque、HashMap、BTreeMap、BinaryHeap)がそろっており、自分で書く構造には借用チェッカーが口を出してきます。単方向連結リストはOption<Box<Node>>で、親へのリンクを持つ木にはRc、RefCell、Weakが必要です。このパスでは、そのひとつひとつをRustで作り、それを使ってソート、再帰、グラフ探索を行い、最後は採点付きの面接問題で締めくくります。無料、ブラウザ完結、ほとんどのコースに修了証が付きます。
377 レッスン284 チャレンジ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のヒープです。開始実際のコードを書き、データベースをクエリし、ウェブサイトを構築し、AIプロンプトをマスターしましょう。インタラクティブなレッスンで現代の開発者に必要なすべてのスキルを網羅しています。
継続して進捗を見守りましょう!毎日のコーディング習慣を追跡し、フリーズ日で連続記録を守り、毎日参加することで報酬を獲得しましょう。
12 日連続
明日も戻ってきて連続記録を維持しましょう!
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
ダブル・オア・ナッシング
7日中5日目
連続記録フリーズ
2 left
コーディングの旅を持ち歩こう!セットアップ不要、ダウンロード不要 - 開いてすぐにコーディング開始。iOS、Android、Webで4.9星評価で利用可能。
グローバルリーダーボードで競い、友達を招待して報酬を獲得し、お互いの成功を祝いましょう。プログラミングは友達と一緒の方が楽しい!
読む・聴く・自分を試す・AIに聞く・学んだことを調べる。どんな学び方にも対応したレッスンです。
変数は、後でプログラム内で参照できる値を格納する、名前のついた入れ物です。
Pythonでは、名前、イコール記号、格納したい値の順で書くことで作成します。
値は後から変えられます。再代入すると、名前は新しい値を指すようになります。
完了したすべてのコースで証明書を獲得しましょう。LinkedInプロフィールや履歴書に追加して、雇用主にプログラミングスキルをアピールしましょう。
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コースが無料でそこまで連れて行ってくれます。このパスは、そのコースが終わるところから始まります。