Javaデータ構造とアルゴリズム(二)——配列
3498 ワード
配列の用途は何ですか.--30個の数を大小に並べる必要がある場合は、配列のようなデータ構造で格納するのが良い選択で、クラスの担任である場合は、学生の欠勤回数を記録するたびに配列も役立ちます.配列は挿入、削除、検索などを行うことができます.
1)作成とメモリ割当て
Javaには2つのデータ型、基本型とオブジェクト型があり、参照型とも呼ばれ、Javaでは配列をオブジェクトとし、配列を作成する際にnewオペレータを使用します.
初期化:
2)配列パッケージング後の使用
配列全体をカプセル化し、配列の個数の代わりにnumberを使用し、データを挿入するときにどの下付き挿入を気にする必要はありません.もちろん、具体的な下付きの方法をカスタマイズすることもできます.
方法は比較的簡単で紹介しませんが、deleteでは削除要素から左に移動するだけなのでnumberが減少していますが、最後の要素は削除されていません.display出力展示の時に隠れているだけですが、次にエレメントを挿入すると、最後のエレメントの位置に新しいエレメントが置き換えられます.
3)検索最適化——二分検索
二分検索の前提は配列が秩序化されていることです.最初はindexがendとstartと書いて減少し、死の循環をもたらした.実は加算が必要です.1,2,3,6,7.index=2、value=7、3は7未満、start=3であると、indexは3と4の間の中間数を要するので、加算して2,6で7未満、start=4、findから7で割る.
ソートは、Javaデータ構造とアルゴリズム(3)--簡単なソートです.
オブジェクトを格納すると原理は同じです.
4)大O表現
Nをデータ総数とし,1つのデータを挿入する時間をKとする.
では、線形検索総時間T=K*N/2は、検索すると比較数の約半分になるからです.
二分検索するとT=k*log 2(N).
大きなO表現では,Oはorder ofと見なすことができ,おおよその意味であり,k/2も定数であるため,O(N)と見なすことができる.
配列の欠点は、サイズが固定され、検索が遅いことです.百万レベルのデータを常に検索する場合は、配列を使用しますか?いいえ、データ構造の選択は具体的な実情と結びつけて、最大の効率値を達成しなければなりません.
1)作成とメモリ割当て
Javaには2つのデータ型、基本型とオブジェクト型があり、参照型とも呼ばれ、Javaでは配列をオブジェクトとし、配列を作成する際にnewオペレータを使用します.
int array[] = new int[10];
オブジェクトである以上、arrayは配列の参照であり、Javaプログラミング思想(一)によると、すべてがオブジェクトのメモリ割り当てであり、arrayはスタックに空間を開き、配列が格納されたアドレスを格納し、本当にオブジェクトを保存する場所は正しい.new操作はスタックに必要な空間を開き、arrayはヘッダアドレスを指す.初期化:
public class UseArray {
public static void main(String[] args) {
int array[] = new int[10];
System.out.println(array[2]);
UseArray a[] = new UseArray[12];
System.out.println(a[1]);
int array2[] ={1,2,3,4,5,5,6};
}
}
new後の配列内の値はデフォルトで0に初期化され、オブジェクトの初期化は空です.null、もちろん{}で初期化することもできます.2)配列パッケージング後の使用
public class UseArray {
private int[] array;
private int number = 0;
public UseArray(int max){
array = new int[max];
}
public void insert(int value){
array[number] = value;
number++;
}
public int find(int value){
int index = 0;
for (int i= 0; i < number; i++) {
if(array[i]==value)
return index;
}
return number;
}
public boolean delete(int value){
int index = find(value);
if(index != number){
for (int i = index; i < number-1; i++) {
array[i] = array[i+1];
}
number--;
return true;
}
return false;
}
public void display(){
for (int i = 0; i < number; i++) {
System.out.printf(array[i]+" ");
}
}
public static void main(String[] args) {
UseArray ua = new UseArray(5);
ua.insert(1);
ua.insert(2);
ua.insert(6);
ua.insert(7);
ua.insert(3);
ua.display();
if(ua.find(5) != ua.number){
System.out.println();
}else{
System.out.println("not found!");
}
if(ua.delete(5)!=true){
System.out.println("can not delete!");
}
ua.display();
}
}
配列全体をカプセル化し、配列の個数の代わりにnumberを使用し、データを挿入するときにどの下付き挿入を気にする必要はありません.もちろん、具体的な下付きの方法をカスタマイズすることもできます.
方法は比較的簡単で紹介しませんが、deleteでは削除要素から左に移動するだけなのでnumberが減少していますが、最後の要素は削除されていません.display出力展示の時に隠れているだけですが、次にエレメントを挿入すると、最後のエレメントの位置に新しいエレメントが置き換えられます.
3)検索最適化——二分検索
public int find(int value){
int start = 0;
int end = number-1;
while(end>start){
int index =(end + start)/2;
if(array[index]==value){
return index;
}else if(array[index] >value){
end = index-1;
}else {
start = index+1;
}
}
return number;
}
二分検索の前提は配列が秩序化されていることです.最初はindexがendとstartと書いて減少し、死の循環をもたらした.実は加算が必要です.1,2,3,6,7.index=2、value=7、3は7未満、start=3であると、indexは3と4の間の中間数を要するので、加算して2,6で7未満、start=4、findから7で割る.
ソートは、Javaデータ構造とアルゴリズム(3)--簡単なソートです.
オブジェクトを格納すると原理は同じです.
4)大O表現
Nをデータ総数とし,1つのデータを挿入する時間をKとする.
では、線形検索総時間T=K*N/2は、検索すると比較数の約半分になるからです.
二分検索するとT=k*log 2(N).
大きなO表現では,Oはorder ofと見なすことができ,おおよその意味であり,k/2も定数であるため,O(N)と見なすことができる.
配列の欠点は、サイズが固定され、検索が遅いことです.百万レベルのデータを常に検索する場合は、配列を使用しますか?いいえ、データ構造の選択は具体的な実情と結びつけて、最大の効率値を達成しなければなりません.