ホームページ  >  記事  >  Java  >  Java データ構造の収集フレームワークと一般的なアルゴリズムは何ですか?

Java データ構造の収集フレームワークと一般的なアルゴリズムは何ですか?

王林
王林転載
2023-05-26 13:39:441078ブラウズ

    1 コレクション フレームワーク

    1.1 コレクション フレームワークの概念

    Java コレクション フレームワーク Java コレクション フレームワークは、コンテナ コンテナとも呼ばれ、定義です。 java.util パッケージ内の一連のインターフェイスとその実装クラス。

    その主なパフォーマンスは、複数の要素を 1 つのユニットに配置することです。これは、一般に CRUD として知られる、これらの要素を迅速かつ便利に保存、取得、管理するために使用されます。

    クラスとインターフェースの概要:

    Java データ構造の収集フレームワークと一般的なアルゴリズムは何ですか?

    1.2 コンテナーに関係するデータ構造

    Collection: 最も一般的に使用されるコンテナーを含むインターフェースです。一部のメソッド

    List: ArrayList と LinkedList に実装されるメソッドを標準化するインターフェイスです。

    • ArrayList: List インターフェイスを実装し、最下層は動的タイプ シーケンス リスト

    • LinkedList: List インターフェイスを実装します。最下層は二重リンク リストです

    Stack: 最下層はスタックです、スタックは特別なシーケンス リストです

    Queue: 最下層はキューであり、特別なシーケンス テーブルです。

    Deque: これはインターフェイスです。

    Set: Set はインターフェイスであり、K モデルはその中に配置されます

    • HashSet: 最下層はハッシュ バケットで、クエリ時間の複雑さは O(1)

    • TreeSet: 最下層は赤黒ツリーです。クエリの時間計算量は O()、キー順の

    マップ: K-V モデルのキーと値のペアを保存するマッピング

    • #HashMap: 最下層はハッシュ バケットで、クエリ時間の複雑さは O(1)

    • ツリーマップ: 最下層は赤黒のツリーで、クエリ時間の計算量は O()、キーの順序について

    2 アルゴリズム

    2.1 アルゴリズムの概念

    アルゴリズム (アルゴリズム): 明確に定義された計算プロセスです。1 つまたは 1 つの値のグループが入力され、次のように値または値のグループが生成されます。出力。アルゴリズムは、入力データを出力結果に変換するために設計された一連の計算ステップです。

    2.2 アルゴリズム効率

    アルゴリズム効率解析は 2 つのタイプに分類されます。1 つ目は時間効率、2 つ目はスペース効率です。時間効率は時間計算量と呼ばれ、空間効率は空間計算量と呼ばれます。時間計算量は主にアルゴリズムの実行速度を測定し、空間計算量は主にアルゴリズムに必要な追加スペースを測定します。コンピューター開発の初期には、コンピューターの記憶容量は非常に小さかったです。そのため、私たちは空間の複雑さを非常に重視しています。コンピュータ産業の急速な発展に伴い、コンピュータの記憶容量は非常に高いレベルに達しています。したがって、アルゴリズムの空間の複雑さに特別な注意を払う必要はなくなりました。

    3 時間計算量

    3.1 時間計算量の概念

    時間計算量は、アルゴリズムの実行時間を表し、アルゴリズムの時間効率を定量的に説明するコンピューター サイエンスの数学関数です。 。アルゴリズムの実行時間は理論的に計算することはできず、実際にコンピュータ上でプログラムを実行して初めて知ることができます。各アルゴリズムはコンピューター上でテストできますが、これは非常に面倒なので、時間計算量によって分析する方法があります。アルゴリズムの時間計算量はステートメントの数の実行にかかる時間に比例し、時間計算量はアルゴリズム内の基本操作の実行数に依存します。

    3.2 Big O の漸近表現

    // 请计算一下func1基本操作执行了多少次?
    void func1(int N){
    	int count = 0;
    	for (int i = 0; i < N ; i++) {
    		for (int j = 0; j < N ; j++) {
    			count++;
    		}
    	}
    	for (int k = 0; k < 2 * N ; k++) {
    		count++;
    	} 
    	int M = 10;
    	while ((M--) > 0) {
    		count++;
    	} 
    	System.out.println(count);
    }

    Func1 によって実行される基本演算の数: F(N)=N^2 2*N 10

    • #N = 10 F(N) = 130

    • N = 100 F(N) = 10210

    • N = 1000 F(N) = 1002010

    実際、時間計算量を計算するとき、正確な実行数を計算する必要はなく、おおよその実行数だけを計算する必要があるため、ここでは次の式を使用します。 Big O Notation の漸近。

    ビッグ O 記法 (ビッグ O 記法): 関数の漸近的な動作を記述するために使用される数学記号です。

    3.3 ビッグ O 順序法の導出

    • 使用 定数 1 は、実行時にすべての加算定数を置き換えます。

    • 修正された実行数関数では、最上位の項のみが保持されます。

    • 最上位の項が存在し、1 でない場合は、この項に乗じた定数を削除します。結果はビッグオーオーダー。

    Big O の漸近表現を使用した後、Func1 の時間計算量は次のようになります: O(n^2)

    • N = 10 F (N) = 100

    • N = 100 F(N) = 10000

    • N = 1000 F(N) = 1000000

    上記の内容から、Big O の漸近表記では結果にほとんど影響を与えない項目が除外され、実行数が簡潔かつ明確に表現されていることがわかります。さらに、一部のアルゴリズムの時間計算量には最良の場合、平均的な場合、および最悪の場合があります。

    最悪の場合: 任意の入力スケールの最大実行数 (上限)

    平均的な場合: 任意の入力スケール 予想される実行数

    ベストケース: 任意の入力サイズに対する最小実行数 (下限)

    例: 配列内のデータ x

    の検索長さ N のシナリオ:

    が 1 回見つかった 最悪のケース:

    が N 回見つかった

    平均情况:N/2次找到

    在实际中一般情况关注的是算法的最坏运行情况,所以数组中搜索数据时间复杂度为O(N)

    4 空间复杂度

    对于一个算法而言,空间复杂度表示它在执行期间所需的临时存储空间大小。空间复杂度的计算方式并非程序所占用的字节数量,因为这并没有太大的意义;实际上,空间复杂度的计算基于变量的数量。大O渐进表示法通常用来计算空间复杂度,其计算规则类似于实践复杂度的计算规则。

    实例1:

    // 计算bubbleSort的空间复杂度?
    void bubbleSort(int[] array) {
    	for (int end = array.length; end > 0; end--) {
    		boolean sorted = true;
    		for (int i = 1; i < end; i++) {
    			if (array[i - 1] > array[i]) {
    				Swap(array, i - 1, i);
    				sorted = false;
    			}
    		} 
    		if(sorted == true) {
    		break;
    		}
    	}
    }

    实例2:

    // 计算fibonacci的空间复杂度?
    int[] fibonacci(int n) {
    	long[] fibArray = new long[n + 1];
    	fibArray[0] = 0;
    	fibArray[1] = 1;
    	for (int i = 2; i <= n ; i++) {
    		fibArray[i] = fibArray[i - 1] + fibArray [i - 2];
    	} 
    	return fibArray;
    }

    实例3:

    // 计算阶乘递归Factorial的空间复杂度?
    long factorial(int N) {
    	return N < 2 ? N : factorial(N-1)*N;
    }
    • 实例1使用了常数个额外空间,所以空间复杂度为 O(1)

    • 实例2动态开辟了N个空间,空间复杂度为 O(N)

    • 实例3递归调用了N次,开辟了N个栈帧,每个栈帧使用了常数个空间。空间复杂度为O(N)

    以上がJava データ構造の収集フレームワークと一般的なアルゴリズムは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    声明:
    この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。