挿入関数「insert(A、n)」を介したヒープへの新しい要素の挿入には、O(log n)時間がかかります(nは配列「A」の要素の数です)。挿入機能を以下に示します。
void insert(int A[], int n)
{
int temp,i=n;
cout<<"Enter the element you want to insert";
cin>>A[n];
temp=A[n];
while(i>0 && temp>A[(i-1)/2])
{
A[i]=A[(i-1)/2];
i=(i-1)/2;
}
A[i]=temp;
}
挿入関数の時間計算量はO(log n)です。
配列をヒープ配列に変換する関数は次のように与えられます。
void create_heap()
{
int A[50]={10,20,30,25,5,6,7};
//I have not taken input in array A from user for simplicity.
int i;
for(i=1;i<7;i++)
{
insert(A,i);
}
}
この関数の時間計算量はO(nlogn)であることが与えられました。
->ただし、挿入関数には、各呼び出しで比較する要素の最大「i」があります。つまり、ループの1回の実行における時間計算量は、各呼び出しでO(log i)です。
->つまり、最初はlog1、次にlog2、次にlog3というように、log6まで続きます。
->したがって、配列のn個の要素の場合、合計時間計算量はlog2 + log3 + log4 + .... lognになります。
->これはlog(2x3x4x ... xn)= log(n!)になります
では、なぜ時間計算量はO(log(n!))ではなくO(nlogn)なのですか?
Log(n!)は、ログルールのn * lognからlog(n ^ n)によって制限されます。
1*2*3*4*....*n = n!
n*n*n*n*....*n = n^n
明らかにn!<n ^ n
それでは、なぜより厳しい境界があるO(nlogn)
ときに使用するのO(logn!)
ですか?nlogn
log(n!)で囲まれているので、驚くべきことではありませんか?
log(1*2*3*4*....*n) = log(1) + log(2) + ... + log(n)
前半は捨てましょう
log(1*2*3*4*....*n) > log(n/2) + log((n/2) + 1) + log((n/2)+2) + ... + log(n)
> log(n/2) + log(n/2) + ... + log(n/2)
= n/2*log(n/2) = O(nlogn)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加