アルゴリズムとデータ構造1 2009年6月11日 酒居敬一([email protected]) http://www.info.kochi-tech.ac.jp/k1sakai/Lecture/ALG/2009/index.html アルゴリズムとデータ構造基礎 オブジェクト指向の概念とJava言語 オブジェクト指向 = Object Oriented Java言語のOO的なところの概説 計算量の概念とO記法 空間計算量と時間計算量 O記法 オブジェクト指向(OO)の概念 • オブジェクトを基本にとらえようとする考え • オブジェクト間はメッセージパッシング – オブジェクトの中身をいぢるのはオブジェクト自身 • メソッドが内蔵されている • 従来の考えとちょっと違う メソッドがオブジェクトに内蔵されてるとか クラスが継承できるとか いろいろありますね… オブジェクトとクラス • オブジェクト=もの – 実体のあるものすべてオブジェクト • クラスとは? – 設計図のようなもの – 型のようなものだけど型ではない • メソッドを含むこともできる • メソッドとは? – オブジェクトへの操作を定義したもの – オブジェクトへメッセージが送られたとき使われる 簡単な例 クラス: 人間 この講義の受講生だけでも90人いたりするわけで… Aさん Bさん Zzさん 学習方法 学習方法 学習方法 教科書 教科書 お金の使途 お金の使途 お金の使途 財布+お金 財布+お金 財布+お金 ・・・ 教科書 OOの概念とJava言語 • オブジェクトはクラスのインスタンス – 例えば、newすればインスタンスは生成できる • メッセージを渡すこと=関数を呼ぶこと – 渡したいメッセージは引数 – 受け取りたいメッセージは戻り値 • 継承、インターフェース 継承(inheritance) • 基底クラスの構成要素をそのままに、拡 張する仕組み。 – Javaではextendsにより継承 – extendsの右側のクラスが基底クラス – 継承の結果できたクラス=派生クラス class baseClass { void methodBase(){ // 何らかの処理1 } } class inheritedClass extends baseClass { void methodInherited(){ // 何らかの処理2 } } 静的束縛と動的束縛 • オーバーライド – 基底クラスで定義されるメソッドを派生クラスで 再定義すること • 隠蔽 – 基底クラスのstaticメソッドを派生クラスの staticメソッドでオーバーライドすること – 隠蔽は静的束縛が適用される • 動的束縛 – クラス構成要素を呼び出す際に決定 – オブジェクト変数に代入されたオブジェクトによ り呼ばれる構成要素が決まる 継承とオーバーライド class baseClass { // 基底クラス void methodA(int i){ // 派生クラスによりオーバーライドされる int x = i * 1000; System.out.println(x); } void methodB(int i){ // 派生クラスに継承される int x = i + 1000; System.out.println(x); } } class inheritedClass extends baseClass { // 派生クラス void methodA(int i){ // オーバーライドします int x = i * 10; System.out.println(x); } public static void main(String[ ] args) { inheritedClass objectInherited = new inheritedClass( ); objectInherited.methodA(10); // 100 を表示 objectInherited.methodB(10); // 1010 を表示 } } 静的束縛 class baseClass { // 基底クラス static void methodA(int i){ // クラスメソッド int x = i * 1000; // プログラムとともに存在 System.out.println(x); } static void methodB(int i){ // クラスメソッド int x = i + 1000; System.out.println(x); } } class inheritedClass extends baseClass { // 派生クラス static void methodA(int i){ // クラスメソッド int x = i * 10; // プログラムとともに存在 System.out.println(x); } public static void main(String[ ] args) { baseClass certainObject = new inheritedClass( ); certainObject.methodA(10); // 10000を表示 certainObject.methodB(10); // 1010を表示 } } 動的束縛 class baseClass { // 基底クラス void methodA(int i){ // インスタンスメソッド int x = i * 1000; // newしたときに生成 System.out.println(x); } void methodB(int i){ // インスタンスメソッド int x = i + 1000; System.out.println(x); } } class inheritedClass extends baseClass { // 派生クラス void methodA(int i){ // インスタンスメソッド int x = i * 10; // newしたときに生成 System.out.println(x); } public static void main(String[ ] args) { baseClass certainObject = new inheritedClass( ); certainObject.methodA(10); // 100を表示 certainObject.methodB(10); // 1010を表示 } } 計算量の概念(7ページ 1.2節) • アルゴリズムの性能を示す指標 – 時間計算量 • (文字通り)計算に要する時間 – 空間計算量 • どれくらいの作業領域を必要とするかを表す • 大きな問題が少ない計算量で解ければ優秀 – 漸近的に表現したものがO記法 • 計算量を定式化したとき、計算量に最も大きな影響 を及ぼす項をとりだしたもの。 O記法 • 漸近的な振る舞いを表す – 定数項は無視 – 係数は1 – 一般には最も影響力の強い項のみで表す • 項の形で大きく2つに分けられる(問題:n) – 多項式 – 指数関数 k n n k O(n) 2 O(n ) O(e ) n O(n log n)
© Copyright 2024 ExpyDoc