課題3(5/25出題)


課題


Exercise 3.2ヒント

Exercise 3.2 はメンバー変数 n を使わないことが条件になっています.この条件 定義を満たさない誤った secondLastを実装する例を示します.report3.tgzの中に含まれるSLList.hの中からincludeされているex3_2.hは,

T secondLast() {
  Node *u = head;
  for (int i = 0; i < n - 2; i++) u = u->next;
  return u->x;
}
のように,メンバー変数 n を使っていますが,動くことは動きます.

動作チェックをおこなうプログラム check_ex3_2.cpp

g++ --std=c++11 -Wall -O2 -o check_ex3_2 check_ex3_2.cpp
でコンパイルし.
./check_ex3_2
で実行してOKが出ることで,このex3_2.hが正しく動作することを確認できます.以下のように,誤ったプログラム
 T secondLast() {
   if (head == NULL) return null;
   Node *u = head;
   while (u->next != NULL) u = u->next;
   return u->x;
 }
を実行すると,
NG
l=[1, 2, 3, 4, 5]
output: 5
expected: 4
...
のように,間違いを検出してくれます(このチェックプログラムで検出できない間違いもあります).なお,このプログラムは変数tailも変数nを使わずにlastを返す関数なので,secondLastを作る際にも参考になると思います.

Exercise 3.3ヒント

report3.tgzの中に含まれるSLList.hの中からincludeされているex3_3.hの空白部分を埋めてください.

T get(int i){
  // fill here
} // to check each index until reaches i takes O(1+i) time
  
T set(int i, T x){
  // fill here
} // runs in the same time as get(), for the same reason

void add(int i, T x){
  // fill here
}

T remove(int i){
  // fill here
}
動作チェックをおこなうプログラム check_ex3_3.cpp
g++ --std=c++11 -Wall -O2 -o check_ex3_3 check_ex3_3.cpp
でコンパイルし.
./check_ex3_3
で実行してOKが出ることで,このex3_3.hが正しく動作することを確認できます.誤ったプログラムを実行すると,
NG
before=[]
command: add 0 49
after=[]
のように,間違いを検出してくれます.上のメッセージは空の状態([])からadd(0, 49) を実行したのに,[49] ではなく[]となったことを示しています.

Exercise 3.4ヒント

Exercise 3.4 は "should not use any secondary data structures, and should not create any new nodes." という条件を満たす必要がありますが,report3.tgzの中に含まれるSLList.hの中からincludeされているex3_4.hは,

void reverse(){
  if (head == NULL) return;
  std::vector temp;
  Node* u = head;
  while (u != NULL){
    Node* next = u->next;
    temp.push_back(new Node(u->x));
    delete u;
    u = next;
  }
  for (size_t i = 0; i < temp.size() - 1; i++) {
    temp[i + 1]->next = temp[i];
  }
  head = temp[temp.size() - 1];
  tail = temp[0];
} //Ex3_4
のように,この条件を満たしていませんが(temp というsecondary data structureを使っている,new Nodeのところで,create new nodesを実行している),動くことは動きます.

動作チェックをおこなうプログラム check_ex3_4.cpp

g++ --std=c++11 -Wall -O2 -o check_ex3_4 check_ex3_4.cpp
でコンパイルし.
./check_ex3_3
で実行してOKが出ることで,このex3_4.hが正しく動作することを確認できます.誤ったプログラムを実行すると,間違いを検出できることもありますが,segmentation faultになることもあります. 

提出方法

作成したすべてのプログラムと,各プログラムに関する簡単な説明をまとめた プレインテキスト形式(テキストエディタで編集可能な形式), ipynb形式,またはPDF形式の ファイルを1つ作成して,ITC-LMSの「課題3(5/25出題)」(5/25の講義時間中に公開される予定)に提出してください.

締切は,6/13(日) 23:59です.締切を過ぎても2021年7月末までは6割を上限に採点します.


LeetCodeの関連問題


オプション課題

課題だけで物足りない人は,以下のオプション課題にも取り組んでください.