オープニング:私たちが話した最後の時間、追加および削除の基本的な配列は、検索を変更します。今度は、最適化し、改善し、分析してみましょう。
1.まず、配列型は、ジェネリックをサポートしていません定義します。
容量が使用するのに十分でない場合は2、あなたは自動的に拡張操作をトリガすることができるはずです。
私たちは、達成するために見えます。私たちは、表現するためにジェネリック型Tを使用します。
パブリッククラスArray <T> { プライベートT []データ。 プライベートint型のサイズ。 プライベートint型の容量; パブリックブールIsFull => this.Capacity == this.Size。 公共配列(INT容量= 20) { this.Capacity =容量。 this.Data =新しいT [this.Capacity]。 } }
このとき、操作は、一般的な変数TをCRUD必要があります
このようなアレイの容量の大きさの容量の大きさに応じて、我々は事業の拡大を増やし、この時点で、我々は配列トラバーサルのコピー操作を追加する必要があり、追加として与えられるべきです。
公共 ボイド追加(T値) { 場合(IsFull) この .ExpandCapacity(この .Capacity * 2 )。 この .Size ++ ; この .DATA [ この .Size - 1 ] = 値。 } }
プライベート ボイド ExpandCapacity(INTの容量) { VARあるnewData = 新しいT [容量]。 以下のために(int型 i = 0 ; iは<newData.Length; iは++ ) { あるnewData [I] = この.DATA [I]。 } この .DATA = あるnewData。 この .Capacity = 能力; }
削除
パブリック T削除(int型のインデックス) { 場合(インデックスは< 0 ) スロー 新しい例外(「インデックスがゼロ未満です」)。 場合(インデックス>は、この .Capacity- 1 ) スロー 新しい例外を(「インデックスが容量を超えています」); もし(インデックス> この .Size- 1 ) リターン・ デフォルト。 VaRの値= この.DATA [インデックス]。 用(int型、I <I =索引この .Size- 1 ; iが++ ) { この .DATA [I] = この .DATA [I + 1 ]。 } この .SetEmpty(この .Size- 1 )。 この .Size-- ; もし(この .Size <= この .Capacity / 2 ) この .NarrowCapacity(この .Capacity / 2 )。 戻り値; } プライベート のボイドNarrowCapacity(INTの容量) { VARあるnewData = 新しいT [容量]。 以下のために(int型 i = 0 ; I < 本 .Data.Length; iは++ ) { あるnewData [I] = この.DATA [I]。 } この .DATA = あるnewData。 この .Capacity = 能力; }
このとき、()ルールを検索し、他の操作がTに等しい書き換え型オブジェクトの基本クラスと比較する必要があります
公共 BOOL IsContain(int型の値) { VARの isContain = 偽。 以下のために(int型 i = 0 ; I < 本 .Size; iは++ ) { 場合(この.DATA [I] .Equals(値)) isContain = 真。 } 戻りisContain。 }
この時点で、私たちは、アルゴリズムの複雑さを見て
1. O何も言うことはありません(1)を上げ、それがいっぱいになった場合には、複雑の拡大はO(n)が引き金となりました。
2.挿入、インデックスのサイズが挿入された場合、この時の複雑さはO(1)であるが、最初に、このときの複雑さに挿入される最悪の場合はO(N)、平均複雑です(N / 2)に、又はO(N)
3.同じを削除するには削除します。私たちは、複雑さはO(n)は最悪のケースを持っています。
4.検索O(1)
しかし、例えば、彼らはこの時点では、配列の最後、サイズを削除し、この時間は半分の容量で、我々はトリガ拡張を追加しました。この時点で容量いっぱいにするだけでなく、コンテナを縮小され、問題があります。複雑さのこの時点ではO(1)操作では、O(n)は、(複雑さの脳震盪)は、その後、我々はそれを変更することができますでしょう。場合サイズは、トリガの前に容器を収縮、容器の1/4以下です。これを避けるため、衝撃をもたらすために、操作のO(1)時間の複雑さを追加したり削除したりします。
もし(この .Size <= この .Capacity / 4 ) この .NarrowCapacity(この .Capacity / 2)。
Githubの次のアドレス私のプロジェクト貧しい生徒できる自己作成ああ住所: https://github.com/GuanZhengXin/DataStruct
だから我々は単に私たちが構造と実装を積み重ね、次の問題について学ぶために、構造体の基本的な配列を実装します。