1st Semester振返り②

Student Life in NUS

私が1st Semesterで履修した科目毎に、どのような内容をどのようなスタイルで学んでいったのかについて感想とともに書かせていただきます。

1st Semester 履修科目は以下3科目です。
① Software Development Fundamentals
② Data Structures and Algorithms
③ Artificial Intelligence

今回は Data Structures and Algorithms について振返ります。

Data Structures and Algorithms

前に紹介したSoftware Development Fundamentals では、Pythonを使ったプログラミングの基礎について学びましたが、この授業はよりデータの取扱いにフォーカスを当てた授業でした。

速く効率的にデータ処理をするためのデータ構造や、様々なタイプのデータを処理するためのアルゴリズムをPythonをベースに習得します。

期間は8週間(約2か月強)

下表は週ごとの学習内容です。
何言っているかさっぱりわからないですよね。。

week Topics
1 -Python review and the short coding style
-Analysis of Algorithms: O(1), O(log n), O(n), O(n log n), O(n2), O(n3)
2 -Sorting, O(n2) algorithms: Bubble, Selection, Insertion; Python list.sort()
O(n log n) Merge Sort, stable sort, the one in Python list.sort()
3 -List ADT, Python list, SLL, Stack ADT, Python list as stack
-Queue ADT, Python list as queue is slow, Python deque (Doubly Linked List)
4 -Priority Queue ADT, Binary Heap DS, Python heapq
-Build Heap O(n log n) and O(n) version, O(n log n) Heap Sort (or partial sort)
5 -Table ADT, DAT, basic hashing, Separate Chaining, Python set/dict/defaultdict. Alternative Table ADT, Binary Search Tree
6 -Graph, basic graph theory, 3 graph DS: Adjacent Matrix/Adjacent List/Edge List, simple graph DS applications
7 -Graph Traversal: DFS, BFS, reachability test, finding Connected Components
-Flood fill (2d implicit graph), topological sorting of a DAG
8 -SSSP: BFS/Dijkstra’s for unweighted/weighted graph
Summery of Lectures

前半は、ソートという数字を昇順・降順に並べ替える方法について学びます。エクセルだとソートってやれば特に何も考えずに昇順・降順に並び替えができますが、プログラミングでは様々な方法があり、より早く、よりメモリを消費しない方法など特徴があることを学びました。

次にADT(Abstract Data Type)という概念を学びます。データを処理する場合に先入先出、後入先出、優先度付きキューなど複数の方法があり、その概念をCodingする際の注意点などを知ることができました。

後半はより複雑になっていきますが、たとえば、A地点からB地点に行く方法が複数あるときに、どのルートが最短で行けるのかなど、Google Mapなどで経路検索するときの裏のロロジックのようなものを学んだりしました。

細かくオーガナイズされた授業

この科目の担当教授は、競技プログラミングの領域で東アジアでトップランナーらしく、世界大会にも何度も出ているようです。
ご参考:https://www.comp.nus.edu.sg/~stevenha/

授業の形態はSoftware development fundamentalsとほぼ同じで、
Lectureが週2回(水曜日と土曜日)で合計3時間
Labが週1回(月曜日)で2時間

これに加えてCodingの課題があります(毎週水曜提出)

この授業は、綿密に準備しているのが事前配布のシラバスからも読み取れるほどきちっとオーガナイズされています。授業で使用する教材も特徴的だったのでご紹介します。

Visualgohttps://visualgo.net/en
これは教授とエンジニアである教授のご兄弟で作成したフリーのオンライン教材です。データ構造とアルゴリズムをワンクリックで視覚的に学べるため、難しい概念のものでも容易に概要を理解できます。

Kattishttps://open.kattis.com/problems
こちらもオープンなプログラミング学習サイトで、多くのプログラミングの課題が掲載されていて、この中から指定された課題を授業内で解いたり、宿題として課されました。

充実感のある内容

この授業も予習復習と宿題提出に追われました。

教授の話すスピードがとても速く、プログラミングの課題を授業内でデモで解いてくれるのですが、競技プログラミングのスペシャリストだけあって、とてつもないスピードでCodingします。一度ではほぼ理解できません。

したがって授業が終わったあとは、一度教材を読み直して再度ビデオを見直おし理解を深めたうえで課題に取り組む必要がありました。

課題の難易度も高く、提出日の前日(火曜日)はTeaching Assistantを捕まえてヒントをもらいながら解いていました。

とてもきつかったのですが、数多くの課題をPythonでCodingしたため、Software Development Fundamentalsで学んだ知識の定着とともに、より効率的な解決方法を学ぶことができたという意味ではとても充実した8週間でした。

学びを後押しする仕組み

この授業も難易度が高く、かつすべてオンラインなので一人で気持ちが折れそうになりますが、3つの仕組みによってモチベーションを維持することができたので人材育成という観点でのインサイトとして共有します。

当たり前のことではありますが、新人研修や英語研修などにも応用できる部分があるなと思いました。

①わからないことを聞ける存在

この授業においてTeaching Assistant(TA)の存在は非常に大きいものでした。大体生徒20名に対して1名のTAがついてくれたので、授業や宿題でわからないことがあれば、TAに気軽に相談することができました。

TAも課題の進捗状況をかなり細かくチェックしていたので、私の進捗が悪いとTAの方からフォローアップしてくれ、無事に課題をクリアできると一緒に喜んでくれたのは学ぶ側からしてもモチベーションを維持できましたし、答えではなく考え方のヒントをくれる支援姿勢が、学生が自分で考えることを身に付けさせようとしていて素晴らしいと思いました。

②苦しいのは自分だけじゃないんだ

この授業ではDiscordといわれるチャットアプリを使って、教授や学生同士で質問や意見交換をしました。

意外にいいと思ったのはお互いニックネーム(匿名)でのやりとりだったことです。シンガポールの学生も日本人と似ていてシャイな人が多いのか、NUS生のプライドが高いのか、変な質問をすること恐れるので実名でのやりとりはあまり盛り上がりません。

その点Discordでは匿名なので、宿題がやばいとか、今更それ聞いちゃう?みたいな質問もバンバン投稿されていて、授業についていけてなかったり宿題に苦戦しているのは自分だけではないんだという幾ばくかの安心感を得られまし、教授も励ましてくれたのでリモートながらも一体感を得ることができました。

だからといってやばい状況が改善されることはないのですけどね。

③自分の立ち位置を把握

最後は、宿題の提出状況がランキングで発表されることです。

もちろん上位30人だけが実名で公表され、30位以降は自分の順位だけがわかるような仕組みになっており、早く宿題が終われば実名で自分の名前が出て自己肯定感を得ることができますし、自分が苦戦している間に他の人がどんどん提出すると自分の順位が下がっていき焦ります。

ランキングは下位の人にはモチベーションを落とすこともありますが、TAがしっかりサポートしてくれるので、仮に順位が低くても取り残されることのないような仕組みになっていて効果的だなと思いました。