現在、私は私の大学のためのプロジェクトをやっています。既知のデータ構造(配列、リンクリスト、BSTなど)を実装しています。たとえば、私にとって最初のものは配列でした。私は配列の途中に要素を追加する時間を測定しました。(さらに値を移動すると、n = n + 1
です。もちろん、これはO(n)
です。ここでnは要素の数です。 。アレイと、それ(最後に加える)に要素を追加するの先頭に私は(私はSTL
またはboost::
を使用することはできません)2つの、簡単なアルゴリズムを持っている:並べ替えられた配列の複雑な計算
が先頭に追加:
void array::beginning_append(int value)
{
int *temp = new int[n + 1];
memcpy(temp + 1, table, sizeof(int) * n);
n = n + 1;
temp[0] = value;
delete[] table;
table = new int[n];
memcpy(table, temp, sizeof(int) * n);
delete[] temp;
}
最後に追加:
void array::append(int value)
{
int *temp = new int[n + 1];
memcpy(temp, table, sizeof(int) * n);
temp[n] = value;
n = n + 1;
delete[] table;
table = new int[n];
memcpy(table, temp, sizeof(int) * n);
delete[] temp;
}
これらはメソッドまたはarray
クラスです。table
およびn
はこのクラスのメンバーです。今ではそれほど違いはないと思いますが、その時代は同じだと思っていました(500000
のような要素の数が多いとQueryPerformanceCounter
でチェックしました)、私にはO(n)
の複雑さが与えられましたが、 O(n)
の計算量が必要ですが、最後に要素を追加または削除すると複雑さはO(1)
になるため、要素の数に関係なくconstになります。だから、私はアルゴリズムが悪い場合、私は彼らが不必要なものを行う意味、彼らは要素の数に依存している理由です、または私の講師はちょうど間違っていた君たちをお願いしたいと思い
追加するのではなく、前に追加しますか? :) – gsamaras
私はそれをすべきです:D私がコーディングしているとき、私の話す能力、または適切な英語を書く能力が低下するので、私は '始まり 'の代わりに'ベージニング 'を書いています – Frynio
どちらの場合も配列全体を再割り当てしてコピーします。なぜ最後に追加するのが常であるのか理解したいのであれば、_amortized一定時間@ – paddy