2分探索木の演習
先週までで、2分探索木の説明を終えたので、今日は演習を行う。
課題テーマ(基本)
2分探索木を使ったプログラムの作成。データ構造は、以下の中から出席番号にて選ぶ。(出席番号%3)
- 名前と生年月日(年月日は別要素が望ましい)
- 名前と電話番号
- 学科・学年・出席番号・名前の名簿
上記のデータ構造にて、データを入力し「保存」、その後「検索」し目的のデータを表示する機能を実装せよ。
定番ではあるが、(a)プログラム説明、(b)プログラムリスト、(c)動作検証、(d)動作考察の観点で評価を行う。
課題テーマ(オプション)
上記の基本テーマは簡単であるため、オプションテーマを以下に示す。基本テーマの代わりにオプションテーマにてレポートを提出せよ。
数値をデータとする2分木を、その構造がイメージできるようにアスキーアート的に、あるいはグラフィック的に表示するプログラムを作成せよ。
(例1) (例2) {[29] 51 [(60) 75 (80)]} 51 / \ (例3) 51 29 75 | / \ +------+-------+ 60 80 | | 29 75 | +---+---+ | | 60 80
EthernetとCSMA/CD
ネットワークトポロジ
ネットワークに機器を接続する方式をネットワークトポロジと言う。
1本の線を共有するバス型、機器どうしがリング型に接続するリング型、中央の機器を通して接続されるスター型が基本となる。
基本的に、Ethernet は 1本の線を機器で共有するバス型。ただし、10BASE-T,100BASE-TX などの HUB で繋がることから、HUB を中心に広がるスター型とも言える。それぞれれのネットワークは相互につながることから、木の枝状に見えるものはツリー型と呼ばれる。また、上流ネットワークでは、機器が故障した場合に一切の通信ができなくなるのは問題があるため、複数のネットワークで相互に接続される。この場合、網が絡むような構造になることから、ネットワーク型と呼ばれる。
2分探索木への追加
2分木へのデータの追記
前回の授業で、2分探索木のデータに対する処理を説明したので、今回は木にデータを追加する処理。
struct Tree { int data ; struct Tree* left ; struct Tree* right ; } ; struct Tree* tcons( int x, struct Tree*L, struct Tree*R ) { struct Tree* ans ; ans = (struct Tree*)malloc( sizeof( struct Tree ) ) ; if ( ans != NULL ) { ans->data = x ; ans->left = L ; ans->right = R ; } return ans ; } struct Tree* top = NULL ; void insert( int x ) { struct Tree** tail = &top ; // 書換えるべき末端ポインタへのポインタ while( (*tail) != NULL ) { if ( (*tail)->data == x ) break ; // 同じデータは重複するので、追加処理は行わない else if ( (*tail)->data > x ) tail = &( (*tail)->left ) ; // 左の枝を降りていく else tail = &( (*tail)->right ) ; // 右の枝を降りていく } if ( (*tail) == NULL ) (*tail) = tcons( x , NULL , NULL ) ; }
単純リストの時は、2重ポインタの混ざった式の部分的に、型を意識する説明をした。今回は、”tail = &( (*tail)->left )“の赤のカッコが省略されたら、青のカッコが省略されたら、どちらが文法エラーかを「演算子の優先順位」の話を交えながら説明する。 (さらに…)
物理層WAN接続
前回の物理層のLANの話に引き続き、WANの話を説明。
バス接続(LAN)と転送速度
基本的な Ethernet の接続では、1本の通信路を共有するバス型接続のため、1本の信号線をパケット単位の通信の短い時間に区切って、送信を交代しながら行う時分割多重方式で行い通信を行う。
このため、下図で通信路が10BASE/T であった場合、PC-A から PC-B にCD1枚のデータ700MBを送る場合、
>-----+-----------+------< CD1枚 700MB | | をPC-A⇒PC-Bに転送 PC-A PC-B 何秒かかる? 700M[Byte] * 8 = 5.6 G[bit] を 10M[bps] で送ると 5.6G[bit] / 10M[bit/sec] = 560[sec]
また、PC-A から、PC-B , PC-C に同時にCDデータをダウンロードする場合、時分割多重となるため、時間は倍かかる。
>-----+------+------+-----< | | | PC-A PC-B PC-C
2分探索木
2分木(2分探索木)
struct Tree { int data ; struct Tree* left ; struct Tree* right ; } ; struct Tree* tcons( int x, struct Tree*L, struct Tree*R ) { struct Tree* ans ; ans = (struct Tree*)malloc( sizeof( struct Tree ) ) ; if ( ans != NULL ) { ans->data = x ; ans->left = L ; ans->right = R ; } return ans ; } void main() { struct Tree* top = tcons( 52 , tcons( 24 , tcons( 10 , NULL , NULL ) , tcons( 35 , NULL , NULL ) ) , tcons( 73 , tcons( 60 , NULL , NULL ) , tcons( 95 , NULL , NULL ) ) ) ; }
出来上がった木構造のイメージ
top \ 52 / \ / \ 24 73 / \ / \ 10 35 60 95
データベースとガイダンス
今日が後期の選択科目「データベース」の第一回目ということで、シラバス説明&ガイダンスをしてからぁ〜のぉ〜、概要説明。
インターネットの情報量
インターネット上の情報量の話として、2010年度に281EB(エクサバイト)参考:kMGTPEZYの情報があるらしい。また 2013年度で、1.2 ZB(ゼタバイト)という情報があった。これらをムーアの法則(2年で2倍)の概算に照らし合わせても、それなりに近い。2017年であれば、約4年で、5 ZBにはなっているかな。
そして、これらの情報をGoogleなどで探す場合、すぐにそれなりに情報をみつけてくれる。これらは、どの様に実装されているのか?
Webシステムとデータベース
まず、指定したキーワードの情報を見つけてくれるものとして、検索システムがあるが、このデータベースはどのようにできているのか?
Web創成期の頃であれば、Yahooがディレクトリ型の検索システムを構築した。(ページ作者がキーワードとURLを登録する方式) しかし、ディレクトリ型では、自分が考えたキーワードではページが見つからないことが多い。
そこで、GoogleはWebロボット(クローラー)による検索システムを構築した。Webロボットは、定期的に登録されているURLをアクセスし、そのページ内の単語を分割しURLと共にデータベースに追加する。さらに、ページ内にURLが含まれていると、そのURLの先で、同様の処理を再帰的に繰り返す。 (さらに…)
情報ネットワーク基礎・ガイダンス
シラバス:情報ネットワーク基礎
情報ネットワーク基礎では、インターネットがどのような仕組みなのか、どのようにして動いているのかを説明する。TCP/IPって何? IPアドレスって何? セキュリティって何?
あなたが使っているネットワーク機能は?
共有:ネットワークプリンタ、ファイル共有…
分散:大量のコンピュータで負荷分散、リスク分散…
ネットワークの歴史
昔のコンピュータは、開発にお金がかかるため1台のコンピュータを全員で使うもの(TSS)だった。冷戦の時代、軍の重要な処理を行うコンピュータでは、コンピュータのある所に核攻撃を加えられ、軍の機能がすべて動かなくなることは問題だった。1970年頃にアメリカ国防総省ARPANETがインターネットの原型(TCP/IP)を作る。
1980年代には、パソコンがインターネットで繋がるようになる(LAN)。1990年代には、LANどうしを遠隔地接続をするWANが発達。欧州原子核研究機構(CERN)で、ティム・バーナーズ=リーがWorld Wide Web/httpを開発(1989)。1995年、マイクロソフトの家庭用パソコンのOS Windows95の普及と共にWWWが普及する。
※1980年代:パソコン通信、1997年:weblog,1998年:Google検索、1999年:2ch、2002年:SNSの誕生、2006年:Twitter,Facebook(一般開放)
リストの利点/欠点と双方向リスト
リストを使った集合演算のように、データを連ねたリストは、単純リストとか線形リストと呼ばれる。特徴はデータ数に応じてメモリを確保する点や、途中へのデータの挿入削除が得意な点があげられる。一方で、配列は想定最大データ件数で宣言してしまうと、実際のデータ数が少ない場合、メモリの無駄も発生する。しかし、想定件数と実データ件数がそれなりに一致していれば、無駄も必要最小限となる。リスト構造では、次のデータへのポインタを必要とすることから、常にポインタ分のメモリは、データにのみ注目すれば無駄となる。
シーケンシャルアクセス・ランダムアクセス
もう1つの欠点がシーケンシャルアクセスとなる。テープ上に記録された情報を読む場合、後ろのデータを読むには途中データを読み飛ばす必要があり、データ件数に比例したアクセス時間を要する。このような N番目 データ参照に、O(N)の時間を要するものは、シーケンシャルアクセスと呼ばれる。
一方、配列はどの場所であれ、一定時間でデータの参照が可能であり、これは ランダムアクセスと呼ばれる。N番目のアクセス時間がO(1)を要する。
このため、プログラム・エディタの文字データの管理などに単純リストを用いた場合、1つ前の行に移動するには、先頭から編集行までの移動で O(N) の時間がかかり、大量の行数の編集では、使いものにならない。ここで、シーケンシャルアクセスでも1つ前にもどるだけでも処理時間を改善してみよう。 (さらに…)
構造体と実体について
構造体と実体の違いや、Javaに慣れている学生さんに あらためて、データ構造のイメージを持って欲しいので、 以下のコードを示す。
struct Complex { double re ; double im ; } ; struct Complex2 { double* pre ; double* pim ; } ; void main() { // メモリ確保失敗のNULLチェックは省略 struct Complex a ; struct Complex* p ; struct Complex2 b ; struct Complex2* q ; a.re = 1.2 ; a.im = 2.3 ; p = (struct Complex*)malloc( sizeof( struct Complex ) ) ; p->re = 1.2 ; p->im = 2.3 ; // in Java // p = new Complex ; // p.re = 1.2 ; // p.im = 2.3 ; b.pre = (double*)malloc( sizeof( double ) ) ; *(b.pre) = 1.2 ; b.pim = (double*)malloc( sizeof( double ) ) ; *(b.pim) = 2.3 ; q = (struct Comple2*)malloc( sizeof( struct Complex2 ) ) ; q->pre = (double*)malloc( sizeof( double ) ) ; *(q->pre) = 1.2 ; q->pim = (double*)malloc( sizeof( double ) ) ; *(q->pim) = 2.3 ; }
上記プログラムのメモリの格納イメージ図を以下に示す。

データベースの課題ER図の作成
課題
「卒業研究で扱うデータをER図で表現する」 実験系のテーマの人は、実験結果をデータベースに保存することを 想定してER図を作成すること。 どうしても、ER図で表現しづらいテーマの人は、身の回りのデータ をデータベースで扱うことをテーマにしてもいい。
内容
データベースを、トップダウンで設計した場合のER図、 ボトムアップで設計した場合のER図を作成すること。
提出物に記載すべき内容
- トップダウンで設計する場合の、要求仕様に相当するもの
- それから抽出した実体・関連・属性などの説明
- そこから作成したER図
- 正規形の条件を満たすために書き換えたER図の説明、および結果の図が正規形
の条件を満たしていることの確認
- ボトムアップ設計する場合の、もともとのデータ(帳票)に相当するもの
- その説明
- レベル分けやグループ分けをして作成したER図
- 正規形の条件を満たすために書き換えたER図の説明、および結果の図が正規形
の条件を満たしていることの確認
- 2つのER図を見比べた場合の考察