Document

データ構造とプログラミング
(第2回)
大岩 元
TA: 武田林太郎
SA: 明石 敬
array.java の問題点と改善
• クラスとメソッドがそれぞれ一つしかない手
続き型プログラム
• 改善の第1段: データ構造をオブジェクト
として独立させ、他をユーザーとする
• 改善の第2段: データ構造とユーザーの
間の情報伝達を改善する
LowArray.java
• クラス LowArray が配列を包み込み、メソッドを
通じてしか内容に到達できない
– setElem(), getElem(), LowArray
•
•
•
•
データを収納するクラスをコンテナクラスと呼ぶ
LowArrayApp クラスが LowArray を使う
表示をLowArrayAppがやっている
配列の index を LowArrayAppが管理している
highArray.java
• 何をやりたいか(what)と、どうやるか(how)
が分離された
• HighArray には、コンストラクタ, find, insert,
delete, display が用意されている
• HighArrayApp は index を扱わない
orderedArray.java
• 整列した配列は二分探索が使える
• 二分探索は線型探索より格段に速い(後
述)
• delete, insert には、線型探索を使っている
– 移動に時間がかかるため二分探索しても時間
がかかる
Log2(x)
比較回数
範囲
10
100
1,000
10,000
100,000
1,00,000
10,000,000
100,000,000
1,000,000,000
必要な比較
回数
4
7
10
14
17
20
24
27
30
0
1
2
3
4
5
6
7
8
9
10
x
2**x
1
2**0
2
2**1
4
2**2
8
2**3
16
2**4
32
2**5
64
2**6
128 2**7
256 2**8
512 2**9
1024 2**10
Big O 記法
• O(1): 非順序配列への挿入(追加)
• O(log2(N): 二分探索
• O(N): 線型探索、順序配列への挿入・削
除、非順序配列における削除
classDataArray.java
• 配列のタイプがdouble から Person に変っ
た
• 比較は == でなく、 String.equals() を使う
• highArray.java とほとんど同じ
演習問題
• orderedArray.java の insert を二分探索に
改善せよ。
• orderedArray.java の内容を 文字列にせよ。
さらに Person に拡張せよ。ふりがなの
フィールドを導入してもよい。