ලොකු ඕ, ඔබ එය ගණනය කරන්නේ / දළ වශයෙන් ගණනය කරන්නේ කෙසේද?


889

සීඑස් උපාධියක් ඇති බොහෝ අය නිසැකවම කුමක් දැයි දැන ගනු ඇත බිග් ඕ යනු . ඇල්ගොරිතම පරිමාණය කොතරම් හොඳින් මැනීමට එය අපට උපකාරී වේ.

නමුත් මම කුතුහලයෙන් ඉන්නේ කොහොමද කියලා ඔබ ගණනය හෝ ඔබේ ගණිත ක්රමයක්, මෙම සංකීර්න ආසන්න?


4
සමහර විට ඔබට ඇත්ත වශයෙන්ම ඔබේ ඇල්ගොරිතමයේ සංකීර්ණතාව වැඩි දියුණු කිරීමට අවශ්‍ය නොවනු ඇත, නමුත් ඔබට අවම වශයෙන් එය ගණනය කිරීමට හැකි විය යුතුය ...
සේවියර් නොඩෙට්

5
බිග් ඕ, බිග් ඔමේගා සහ බිග් තේටා පිළිබඳ ඉතා පැහැදිලි පැහැදිලි කිරීමක් මට හමු විය: xoax.net/comp/sci/algorithms/Lesson6.php
සෑම්

33
-1: සුසුම්ලන්න, බිග් ඕ හි තවත් අපයෝජනයකි. බිග් ඕ යනු අසමමිතික ඉහළ මායිමක් වන අතර එය ඕනෑම දෙයකට භාවිතා කළ හැකි අතර එය සීඑස් සම්බන්ධ නොවේ. බිග් ඕ ගැන කතා කිරීම එක් අද්විතීය දෙයක් ලෙස අර්ථ විරහිත ය (රේඛීය කාල ඇල්ගොරිතමයක් ද ඕ (එන් ^ 2), ඕ (එන් ^ 3) යනාදියයි). එය කාර්යක්ෂමතාව මැනීමට උපකාරී වන බව පැවසීම ද නොමඟ යවන සුළුය. එසේම, සංකීර්ණ පන්ති වලට සබැඳිය කුමක්ද? ඔබ උනන්දු වන්නේ නම්, ඇල්ගොරිතම වල ධාවන කාලය ගණනය කිරීමේ ක්‍රමවේදයන් තිබේ නම්, එය අදාළ වන්නේ කෙසේද?

35
බිග්-ඕ කාර්යක්ෂමතාව මනින්නේ නැත; එය ප්‍රමාණයෙන් ඇල්ගොරිතම පරිමාණය කොතරම් හොඳින් මැන බලයි (එය ප්‍රමාණයට වඩා වෙනත් දේවලට ද අදාළ විය හැකි නමුත් එය අප මෙහි උනන්දු වන්නේ එයයි) - සහ එය අසමමිතික ලෙස පමණි, එබැවින් ඔබ වාසනාවන්ත නොවන්නේ නම් “කුඩා” විශාල ඇල්ගොරිතමයක් ඔබ අතිශය විශාල සංඛ්‍යාවක් කරා ළඟා වන තුරු O වෙනස් (Big-O චක්‍ර සඳහා අදාළ වේ නම්) වෙනස් වේ.
ILoveFortran

5
ඇල්ගොරිතමයක් එහි බිග්-ඕ සංකීර්ණතාවයේ පදනම මත තෝරා ගැනීම සාමාන්‍යයෙන් වැඩසටහන් නිර්මාණයේ අත්‍යවශ්‍ය අංගයකි. එය නියත වශයෙන්ම 'නොමේරූ ප්‍රශස්තිකරණය' පිළිබඳ සිද්ධියක් නොවේ , එය ඕනෑම අවස්ථාවක බොහෝ අපයෝජනයට ලක්වූ වරණීය උපුටා දැක්වීමක් වේ.
ලෝර්න් හි මාක්විස්

Answers:


1484

මම එය මෙහි සරල වචන වලින් පැහැදිලි කිරීමට උපරිම උත්සාහයක් දරමි, නමුත් මෙම මාතෘකාව මගේ සිසුන්ට අවසාන වශයෙන් ග්‍රහණය කර ගැනීමට මාස කිහිපයක් ගතවන බවට අනතුරු අඟවන්න. ජාවා පොතේ දත්ත ව්‍යුහයන් සහ ඇල්ගොරිතම පිළිබඳ 2 වන පරිච්ඡේදය පිළිබඳ වැඩි විස්තර ඔබට සොයාගත හැකිය .


යාන්ත්‍රික ක්‍රියා පටිපාටියක් නොමැත ද BigOh ලබා ගැනීමට භාවිතා කළ හැකි බව.

BigOh ලබා ගැනීම සඳහා "කුක් පොතක්" ලෙස කේත කැබැල්ලකින් ඔබ මුලින්ම තේරුම් ගත යුත්තේ ඔබ ගණිත සූත්‍රයක් නිර්මාණය කරන්නේ යම් ප්‍රමාණයක ආදානයක් ලබා දී ගණනය කිරීම් කොපමණ ප්‍රමාණයක් ක්‍රියාත්මක වේද යන්න ගණනය කිරීමට ය.

අරමුණ සරලයි: කේතය ක්‍රියාත්මක කිරීමේ අවශ්‍යතාවයකින් තොරව න්‍යායාත්මක දෘෂ්ටි කෝණයකින් ඇල්ගොරිතම සංසන්දනය කිරීම. පියවර ගණන අඩු වන තරමට ඇල්ගොරිතම වේගවත් වේ.

උදාහරණයක් ලෙස, ඔබට මෙම කේත කොටස ඇති බව කියමු:

int sum(int* data, int N) {
    int result = 0;               // 1

    for (int i = 0; i < N; i++) { // 2
        result += data[i];        // 3
    }

    return result;                // 4
}

මෙම ශ්‍රිතය අරාවෙහි සියලුම මූලද්‍රව්‍යයන්ගේ එකතුව ලබා දෙන අතර, එම ශ්‍රිතයේ පරිගණකමය සංකීර්ණතාව ගණනය කිරීම සඳහා සූත්‍රයක් නිර්මාණය කිරීමට අපට අවශ්‍යය :

Number_Of_Steps = f(N)

එබැවින් අපට f(N)ගණනය කිරීමේ පියවර ගණන ගණනය කිරීමේ ශ්‍රිතයක් ඇත. ශ්‍රිතයේ ආදානය යනු සැකසීමට ව්‍යුහයේ ප්‍රමාණයයි. එයින් අදහස් වන්නේ මෙම ශ්‍රිතය පහත පරිදි හැඳින්වේ:

Number_Of_Steps = f(data.length)

පරාමිතිය අගය Nගනී data.length. දැන් අපට ශ්‍රිතයේ සත්‍ය අර්ථ දැක්වීම අවශ්‍යයි f(). මෙය සිදු කරනුයේ ප්‍රභව කේතයෙන් වන අතර, සෑම සිත්ගන්නා රේඛාවක්ම 1 සිට 4 දක්වා අංකනය කර ඇත.

BigOh ගණනය කිරීමට බොහෝ ක්‍රම තිබේ. මෙතැන් සිට අපි උපකල්පනය කිරීමට යන්නේ ආදාන දත්තවල ප්‍රමාණය මත රඳා නොපවතින සෑම වාක්‍යයක්ම නියතයක් ගනීC සංඛ්‍යා ගණනය කිරීමේ පියවර ගන්නා බවයි.

අපි ශ්‍රිතයේ එක් එක් පියවර ගණන එකතු කිරීමට යන අතර, දේශීය විචල්‍ය ප්‍රකාශය හෝ ආපසු ප්‍රකාශය dataඅරාවේ ප්‍රමාණය මත රඳා නොපවතී.

ඒ කියන්නේ 1 සහ 4 පේළි එක් එක් පියවර සී පියවර ගන්නා අතර ශ්‍රිතය මේ හා සමාන ය:

f(N) = C + ??? + C

ඊළඟ කොටස forප්‍රකාශයේ වටිනාකම නිර්වචනය කිරීමයි . අප ගණනය කරන්නේ ගණනය කිරීමේ පියවර ගණන බව මතක තබා ගන්න, එයින් අදහස් කරන්නේ forප්‍රකාශයේ සිරුර ක්‍රියාත්මක වන Nවේලාවන් බවයි. එකතු කිරීම හා සමාන වේ C, Nවේලාවන්:

f(N) = C + (C + C + ... + C) + C = C + N * C + C

ශරීරය ක්‍රියාත්මක වන වාර ගණන ගණනය කිරීමට යාන්ත්‍රික රීතියක් නොමැත for, කේතය කරන්නේ කුමක්දැයි බැලීමෙන් ඔබ එය ගණන් කළ යුතුය. ගණනය කිරීම් සරල කිරීම සඳහා, අපි විචල්ය ආරම්භක, තත්වය සහ වර්ධක කොටස් නොසලකා හරිමුfor ප්‍රකාශයේ .

නියම BigOh ලබා ගැනීම සඳහා අපට ශ්‍රිතයේ අසමමිතික විශ්ලේෂණය අවශ්‍ය වේ. මෙය දළ වශයෙන් මේ ආකාරයට සිදු කරයි:

  1. සියලුම නියතයන් ඉවත් කරන්න C.
  2. සිට f()ලබා polynomium එහි standard form.
  3. බහුපදයේ නියමයන් බෙදන්න සහ වර්ධන වේගය අනුව ඒවා වර්ග කරන්න.
  4. Nළඟා වන විට විශාල වන එක තබා ගන්න infinity.

අපට f()පද දෙකක් තිබේ:

f(N) = 2 * C * N ^ 0 + 1 * C * N ^ 1

සියලුම Cනියතයන් සහ අතිරික්ත කොටස් ඉවත් කිරීම:

f(N) = 1 + N ^ 1

අන්තිම පදය අනන්තයට f()ළඟා වන විට විශාල වන ( සීමාවන් ගැන සිතන්න ) මෙය BigOh තර්කය වන අතර, sum()ශ්‍රිතයට BigOh එකක් ඇත:

O(N)

සමහර උපක්‍රමශීලී ඒවා විසඳීමට උපක්‍රම කිහිපයක් තිබේ: ඔබට හැකි සෑම විටම සාරාංශ භාවිතා කරන්න.

උදාහරණයක් ලෙස, මෙම කේතය සාරාංශ භාවිතයෙන් පහසුවෙන් විසඳා ගත හැකිය:

for (i = 0; i < 2*n; i += 2) {  // 1
    for (j=n; j > i; j--) {     // 2
        foo();                  // 3
    }
}

ඔබෙන් ඇසිය යුතු පළමු දෙය වන්නේ ක්‍රියාත්මක කිරීමේ අනුපිළිවෙලයි foo(). සුපුරුදු පරිදි විය යුතු අතර O(1), ඔබ ඒ පිළිබඳව ඔබේ මහාචාර්යවරුන්ගෙන් විමසිය යුතුය. O(1)මාධ්‍යයෙන් (පාහේ, බොහෝ දුරට) නියත C, ප්‍රමාණයෙන් ස්වාධීන වේ N.

මෙම forවාක්යය අංක එක මත ප්රකාශ ගැටලුව නිරාකරණය වෙයි. දර්ශකය අවසන් වන අතර 2 * N, වර්ධක දෙකකින් සිදු කෙරේ. එයින් අදහස් වන්නේ පළමුවැන්නා forක්‍රියාත්මක වන්නේ Nපියවරයන් පමණක් වන අතර, අපි ගණන් දෙකකින් බෙදිය යුතුය.

f(N) = Summation(i from 1 to 2 * N / 2)( ... ) = 
     = Summation(i from 1 to N)( ... )

වාක්‍ය අංක දෙක ඊටත් වඩා උපක්‍රමශීලී වන්නේ එය වටිනාකම මත රඳා පවතින බැවිනි i. බලන්න: දර්ශකය i අගයන් ගනී: 0, 2, 4, 6, 8, ..., 2 * N, සහ දෙවැන්න forක්‍රියාත්මක වේ: N පළමු වරට මෙන්, N - 2 දෙවන, N - 4 තෙවනුව ... N / 2 අදියර දක්වා, දෙවනුව forකිසි විටෙකත් ක්‍රියාත්මක නොවේ.

සූත්‍රය මත, එයින් අදහස් වන්නේ:

f(N) = Summation(i from 1 to N)( Summation(j = ???)(  ) )

නැවතත්, අපි පියවර ගණන ගණනය කරමු . අර්ථ දැක්වීම අනුව, සෑම සාරාංශයක්ම සෑම විටම එකකින් ආරම්භ විය යුතු අතර, එකකට වඩා විශාල හෝ සමාන සංඛ්‍යාවක අවසන් විය යුතුය.

f(N) = Summation(i from 1 to N)( Summation(j = 1 to (N - (i - 1) * 2)( C ) )

(අපි උපකල්පනය කරන්නේ foo()එය O(1)සහ ගත යුතු බවයිC පියවර.)

අපට මෙහි ගැටළුවක් ඇත: iඅගය N / 2 + 1ඉහළට ගත් විට, අභ්‍යන්තර සාරාංශය negative ණ අංකයකින් අවසන් වේ! එය කළ නොහැකි හා වැරදි ය. මේ මොහොතේ iගතවන ප්‍රධාන ලක්ෂ්‍යය වන අපි සාරාංශය දෙකට බෙදිය යුතුය N / 2 + 1.

f(N) = Summation(i from 1 to N / 2)( Summation(j = 1 to (N - (i - 1) * 2)) * ( C ) ) + Summation(i from 1 to N / 2) * ( C )

වැදගත් මොහොතේ සිට i > N / 2, අභ්‍යන්තරයfor ක්‍රියාත්මක නොවනු ඇති අතර, අපි එහි ශරීරයේ නිරන්තර සී ක්‍රියාත්මක කිරීමේ සංකීර්ණතාවයක් උපකල්පනය කරමු.

දැන් සමහර අනන්‍යතා රීති භාවිතයෙන් සාරාංශ සරල කළ හැකිය:

  1. සාරාංශය (w 1 සිට N දක්වා) (C) = N * C.
  2. සාරාංශය (w 1 සිට N දක්වා) (A (+/-) B) = සාරාංශය (w 1 සිට N දක්වා) (A) (+/-) සාරාංශය (w 1 සිට N දක්වා) (B)
  3. සාරාංශය (w 1 සිට N දක්වා) (w * C) = C * සාරාංශය (w 1 සිට N දක්වා) (w) (C යනු නියත, ස්වාධීනව w )
  4. සාරාංශය (w 1 සිට N දක්වා) (w) = (N * (N + 1)) / 2

වීජ ගණිතය යෙදීම:

f(N) = Summation(i from 1 to N / 2)( (N - (i - 1) * 2) * ( C ) ) + (N / 2)( C )

f(N) = C * Summation(i from 1 to N / 2)( (N - (i - 1) * 2)) + (N / 2)( C )

f(N) = C * (Summation(i from 1 to N / 2)( N ) - Summation(i from 1 to N / 2)( (i - 1) * 2)) + (N / 2)( C )

f(N) = C * (( N ^ 2 / 2 ) - 2 * Summation(i from 1 to N / 2)( i - 1 )) + (N / 2)( C )

=> Summation(i from 1 to N / 2)( i - 1 ) = Summation(i from 1 to N / 2 - 1)( i )

f(N) = C * (( N ^ 2 / 2 ) - 2 * Summation(i from 1 to N / 2 - 1)( i )) + (N / 2)( C )

f(N) = C * (( N ^ 2 / 2 ) - 2 * ( (N / 2 - 1) * (N / 2 - 1 + 1) / 2) ) + (N / 2)( C )

=> (N / 2 - 1) * (N / 2 - 1 + 1) / 2 = 

   (N / 2 - 1) * (N / 2) / 2 = 

   ((N ^ 2 / 4) - (N / 2)) / 2 = 

   (N ^ 2 / 8) - (N / 4)

f(N) = C * (( N ^ 2 / 2 ) - 2 * ( (N ^ 2 / 8) - (N / 4) )) + (N / 2)( C )

f(N) = C * (( N ^ 2 / 2 ) - ( (N ^ 2 / 4) - (N / 2) )) + (N / 2)( C )

f(N) = C * (( N ^ 2 / 2 ) - (N ^ 2 / 4) + (N / 2)) + (N / 2)( C )

f(N) = C * ( N ^ 2 / 4 ) + C * (N / 2) + C * (N / 2)

f(N) = C * ( N ^ 2 / 4 ) + 2 * C * (N / 2)

f(N) = C * ( N ^ 2 / 4 ) + C * N

f(N) = C * 1/4 * N ^ 2 + C * N

බිග් ඕ යනු:

O(N²)

6
@arthur එය O (N ^ 2) වනු ඇත, මන්ද ඔබට සියලු තීරු හරහා කියවීමට එක් ලූපයක් සහ විශේෂිත තීරුවක සියලුම පේළි කියවීමට අවශ්‍ය වනු ඇත.
අභිෂේක් ඩේ දාස්

@arthur: එය රඳා පවතී. ඒක O(n)කොහෙද nඅංග ගණන ද, නැතහොත් O(x*y)එහිදී xසහ yඅරාව මානයන් වේ. බිග්-ඕ යනු "ආදානයට සාපේක්ෂව" වේ, එබැවින් එය ඔබගේ ආදානය කුමක්ද යන්න මත රඳා පවතී.
මූයිං තාරා

1
නියම පිළිතුර, නමුත් මම ඇත්තටම හිරවෙලා. සාරාංශය (i 1 සිට N / 2 දක්වා) (N) (N ^ 2/2) බවට පත් වන්නේ කෙසේද?
පාර්සා

2
ArParsaAkbari සාමාන්‍ය රීතියක් ලෙස, එකතුව (i 1 සිට a දක්වා) (b) යනු * b වේ. මෙය b + b + ... (එක් වරක්) + b = a * b (පූර්ණ සංඛ්‍යා ගුණනයේ සමහර අර්ථ දැක්වීම් සඳහා අර්ථ දැක්වීම අනුව) කීමේ තවත් ක්‍රමයකි.
මාරියෝ කානීරෝ

එතරම් අදාළ නොවේ, නමුත් ව්‍යාකූලත්වය වළක්වා ගැනීම සඳහා, මෙම වාක්‍යයේ ඉතා කුඩා වැරැද්දක් තිබේ: "දර්ශකය i අගයන් ගනී: 0, 2, 4, 6, 8, ..., 2 * එන්". දර්ශකය i ඇත්ත වශයෙන්ම 2 * N - 2 දක්වා ඉහළ යයි, එවිට ලූපය නතර වේ.
ඇල්බට්

202

බිග් ඕ ඇල්ගොරිතමයක කාල සංකීර්ණතාව සඳහා ඉහළ සීමාව ලබා දෙයි. එය සාමාන්‍යයෙන් දත්ත කට්ටල (ලැයිස්තු) සැකසීමට සමගාමීව භාවිතා කරන නමුත් වෙනත් තැනක භාවිතා කළ හැකිය.

සී කේතයේ එය භාවිතා කරන ආකාරය පිළිබඳ උදාහරණ කිහිපයක්.

අපට මූලද්‍රව්‍ය n සමූහයක් ඇති බව පවසන්න

int array[n];

අරාවෙහි පළමු අංගයට ප්‍රවේශ වීමට අපට අවශ්‍ය නම් මෙය O (1) වනු ඇත, එය අරාව කොතරම් විශාලද යන්න ගැටළුවක් නොවන බැවින්, පළමු අයිතමය ලබා ගැනීමට සෑම විටම එකම නියත කාලයක් ගතවේ.

x = array[0];

ලැයිස්තුවේ අංකයක් සොයා ගැනීමට අපට අවශ්‍ය නම්:

for(int i = 0; i < n; i++){
    if(array[i] == numToFind){ return i; }
}

මෙය O (n) වනු ඇත, මන්ද අපගේ අංකය සොයා ගැනීම සඳහා බොහෝ විට සමස්ත ලැයිස්තුවම සොයා බැලිය යුතුය. බිග්-ඕ ඇල්ගොරිතමයක් සඳහා ඉහළ මායිම විස්තර කරන හෙයින් (ඔමේගා පහළ මායිම සඳහා වන අතර තීටා තදින් බැඳී ඇත) .

අපි කැදැලි ලූප වෙත ගිය විට:

for(int i = 0; i < n; i++){
    for(int j = i; j < n; j++){
        array[j] += 2;
    }
}

මෙය O (n ^ 2) වන බැවින් පිටත ලූපයේ (O (n)) එක් එක් පාස් සඳහා අපට නැවත සම්පූර්ණ ලැයිස්තුව හරහා යා යුතු අතර n හි ගුණනය අපව වර්ග කොටසට තබයි.

මෙය යන්තම් මතුපිට සීරීමට ලක්වන නමුත් ඔබ වඩාත් සංකීර්ණ ඇල්ගොරිතම විශ්ලේෂණය කිරීමට ගිය විට සාක්ෂි ඇතුළත් සංකීර්ණ ගණිතය ක්‍රියාත්මක වේ. අවම වශයෙන් වුවද මෙය මූලික කරුණු ඔබට හුරු කරයි යැයි සිතමු.


නියම පැහැදිලි කිරීමක්! ඉතින් ඔහුගේ ඇල්ගොරිතමයට O (n ^ 2) සංකීර්ණතාවයක් ඇතැයි යමෙකු පැවසුවහොත් එයින් අදහස් කරන්නේ ඔහු කැදැලි වළළු භාවිතා කරන බවයි?
නවනීත් කේඑන්

2
ඇත්ත වශයෙන්ම නොවේ, වර්ග කාලයට තුඩු දෙන ඕනෑම අංගයක් n ^ 2 ලෙස සලකනු ලැබේ
අසින්ක්වයිට්

1
AvNavaneethKN: ක්‍රියාකාරී ඇමතුම් වලට> වැඩ කිරීමට හැකි බැවින්, ඔබ සැමවිටම කැදැලි ලූපය නොදකිනුO(1) ඇත. නිදසුනක් ලෙස සී සම්මත ඒපීඅයි වල, bsearchසහජයෙන්ම O(log n), strlenතිබේ O(n), සහ qsortවේ O(n log n)(තාක්‍ෂණිකව එයට කිසිදු සහතිකයක් නොමැත, සහ ක්වික්සෝර්ට් හි නරකම අවස්ථාවක සංකීර්ණතාවයක් ඇත O(n²), නමුත් ඔබේ libcකතුවරයා මෝඩයෙකු නොවන බව උපකල්පනය කිරීම , එහි සාමාන්‍ය සිද්ධි සංකීර්ණතාවය O(n log n)සහ එය භාවිතා කරයි O(n²)නඩුවට පහර දීමේ අවාසිය අඩු කරන හැරවුම් තේරීමේ උපාය ). සංසන්දනාත්මක ක්‍රියාකාරිත්වය ව්යාධිජනක නම් දෙකම bsearchහා qsortවඩාත් නරක විය හැකිය.
ෂැඩෝ රේන්ජර්

95

ඔබගේ විශේෂිත ගැටලුව සඳහා විශාල කාලය ගණනය කරන්නේ කෙසේදැයි දැන ගැනීම ප්‍රයෝජනවත් වන අතර, සමහර සාමාන්‍ය අවස්ථා දැන ගැනීම ඔබේ ඇල්ගොරිතමයේ තීරණ ගැනීමට ඔබට උදව් කිරීමට බොහෝ දුරක් යා හැකිය.

Http://en.wikipedia.org/wiki/Big_O_notation#Orders_of_common_functions වෙතින් ඉවත් කරන ලද වඩාත් සුලභ අවස්ථා කිහිපයක් මෙන්න :

O (1) - සංඛ්‍යාවක් ඉරට්ටේ හෝ අමුතුද යන්න තීරණය කිරීම; නියත ප්‍රමාණයේ බැලීමේ වගුවක් හෝ හැෂ් වගුවක් භාවිතා කිරීම

O (logn) - ද්විමය සෙවුමක් සමඟ වර්ග කළ අරාවෙහි අයිතමයක් සොයා ගැනීම

O (n) - වර්ගීකරණය නොකළ ලැයිස්තුවක අයිතමයක් සොයා ගැනීම; n- ඉලක්කම් අංක දෙකක් එකතු කිරීම

ඕ (n 2 ) - සරල ඇල්ගොරිතමයකින් n- ඉලක්කම් දෙකක් ගුණ කිරීම; n × n න්‍යාස දෙකක් එකතු කිරීම; බුබුලු වර්ග කිරීම හෝ ඇතුළත් කිරීමේ වර්ග කිරීම

ඕ (n 3 ) - සරල ඇල්ගොරිතම මගින් n × n matrices දෙකක් ගුණ කිරීම

O (c n ) - ගතික ක්‍රමලේඛන භාවිතා කරමින් සංචාරක විකුණුම්කරුගේ ගැටලුවට (නිශ්චිත) විසඳුම සොයා ගැනීම; තිරිසන් බලය භාවිතා කරමින් තාර්කික ප්‍රකාශ දෙකක් සමාන දැයි තීරණය කිරීම

O (n!) - තිරිසන් බල සෙවීම හරහා සංචාරක විකුණුම්කරුගේ ගැටළුව විසඳීම

O (n n ) - අසමමිතික සංකීර්ණතාව සඳහා සරල සූත්‍ර ව්‍යුත්පන්න කිරීම සඳහා බොහෝ විට O (n!) වෙනුවට භාවිතා වේ


x&1==1අමුතුකම පරීක්ෂා කිරීමට භාවිතා නොකරන්නේ ඇයි ?
සැමී බෙන්චරිෆ්

2
Am සාමිබෙන්චෙරිෆ්: එය පරීක්ෂා කිරීම සඳහා සාමාන්‍ය ක්‍රමයක් වනු ඇත (ඇත්ත වශයෙන්ම, පරීක්ෂා කිරීම පමණක් x & 1ප්‍රමාණවත් වේ, පරීක්ෂා කිරීම අවශ්‍ය නොවේ == 1; සී හි, ක්‍රියාකරුගේ ප්‍රමුඛතාවයට ස්තූතිවන්ත වනx&1==1 පරිදි ඇගයීමට ලක් කෙරේ , එබැවින් එය ඇත්ත වශයෙන්ම පරීක්ෂාවට සමාන වේ ). මම හිතන්නේ ඔබ පිළිතුර වැරදියට කියවනවා; එහි අර්ධ කොලන් එකක් ඇත, කොමාවක් නොවේ. ඉරට්ටේ / අමුතු පරීක්ෂණ සඳහා ඔබට බැලීමේ වගුවක් අවශ්‍ය යැයි එය නොකියයි, එය කියන්නේ ඉරට්ටේ / අමුතු පරීක්ෂණ සහ බැලීමේ වගුවක් පරීක්ෂා කිරීම මෙහෙයුම් බවයි. x&(1==1) x&1O(1)
ෂැඩෝ රේන්ජර්

අවසාන වාක්‍යයේ භාවිතය පිළිබඳ හිමිකම් පෑම ගැන මම නොදනිමි, නමුත් කවුරුන් එය කරන්නේද යන්න පංතියක් වෙනත් අයෙකු විසින් සමාන නොවන වෙනත් අයෙකු විසින් ප්‍රතිස්ථාපනය කරයි. O (n!) පන්තියේ අඩංගු නමුත් එය O (n ^ n) ට වඩා තදින් විශාලය. සත්‍ය සමානතාවය O (n!) = O (n ^ ne ^ {- n} sqrt (n)) වේ.
කොන්දේසිගත ක්‍රමය

43

කුඩා මතක් කිරීම: big Oඅංකනය භාවිතා කරනුයේ අසමමිතික සංකීර්ණතාව දැක්වීමට ය (එනම්, ගැටලුවේ ප්‍රමාණය අනන්තය දක්වා වර්ධනය වන විට), සහ එය නියත හැංගෙනවා.

මෙයින් අදහස් කරන්නේ O (n) හි ඇල්ගොරිතමයක් සහ O (n 2 ) හි ඇල්ගොරිතමයක් අතර බවයි ) හි එකක් අතර වේගවත්ම සෑම විටම පළමු එක නොවන බවයි (සෑම විටම n හි අගයක් පැවතුනද විශාලත්වයේ ගැටළු සඳහා n> පළමු ඇල්ගොරිතමය වේගවත්ම).

සැඟවුණු නියතය බොහෝ දුරට ක්‍රියාත්මක කිරීම මත රඳා පවතින බව සලකන්න!

එසේම, සමහර අවස්ථාවලදී, ධාවන කාලය ආදානයේ n ප්‍රමාණයේ නිර්ණායක ශ්‍රිතයක් නොවේ . නිදසුනක් ලෙස ඉක්මන් වර්ග කිරීම භාවිතයෙන් වර්ග කිරීම ගන්න: n මූලද්‍රව්‍ය සමූහයක් වර්ග කිරීමට ගතවන කාලය නියත නොවන නමුත් අරාවෙහි ආරම්භක වින්‍යාසය මත රඳා පවතී.

විවිධ කාල සංකීර්ණතා ඇත:

  • නරකම අවස්ථාව (සාමාන්‍යයෙන් ඉතා සරල වුවත්, සෑම විටම ඉතා අර්ථවත් නොවේ)
  • සාමාන්‍ය නඩුව (සාමාන්‍යයෙන් හඳුනා ගැනීමට වඩා අපහසුය ...)

  • ...

හොඳ හැඳින්වීමක් වන්නේ ආර්. සෙඩ්ජ්වික් සහ පී. ෆ්ලජොලෙට් විසින් ඇල්ගොරිතම විශ්ලේෂණය සඳහා හැඳින්වීමක් .

ඔබ පවසන පරිදි premature optimisation is the root of all evil, සහ (හැකි නම්) කේත ප්‍රශස්තිකරණය කිරීමේදී පැතිකඩ සැබවින්ම භාවිතා කළ යුතුය. එය ඔබගේ ඇල්ගොරිතම වල සංකීර්ණත්වය තීරණය කිරීමට පවා උපකාරී වේ.


3
ගණිතයේ දී, ඕ (.) යන්නෙන් ඉහළ සීමාවක් ඇති අතර තීටා (.) යන්නෙන් අදහස් කරන්නේ ඔබට ඉහළින් හා පහළින් සීමාවක් ඇති බවයි. සීඑස් හි අර්ථ දැක්වීම ඇත්ත වශයෙන්ම වෙනස් ද, නැතහොත් එය සාමාන්‍ය අංකනය අනිසි ලෙස භාවිතා කිරීමක් ද? ගණිතමය අර්ථ දැක්වීම අනුව, sqrt (n) යනු O (n) සහ O (n ^ 2) යන දෙකම වේ, එබැවින් O (n) ශ්‍රිතයක් කුඩා වන විට යම් n ප්‍රමාණයක් ඇති බව සැමවිටම නොවේ.
ඩග්ලස් සාරේ

29

මෙහි පිළිතුරු දුටු මම හිතන්නේ අපි අප බොහෝ සැබවින්ම විසින් ඇල්ගොරිතමය අනුපිළිවෙල ආසන්න නැහැ ඇති බව නිගමනය කළ හැකි බලා එය හා පොදු හැඟීමක් වෙනුවට එය ගණනය, උදාහරණයක් ලෙස, භාවිතා ස්වාමියා ක්රමය අපි විශ්වවිද්යාලයේ දී සිතා ලෙස. මහාචාර්යවරයා පවා එය ගණනය කිරීම වෙනුවට ඇත්ත වශයෙන්ම ගැන සිතා බැලීමට අපව දිරිමත් කළ බව මම පැවසිය යුතුය .

පුනරාවර්තන කාර්යයන් සඳහා එය කරන්නේ කෙසේද යන්න එක් කිරීමට මම කැමතියි :

අපට ( යෝජනා ක්‍රමය ) වැනි ශ්‍රිතයක් ඇතැයි සිතමු :

(define (fac n)
    (if (= n 0)
        1
            (* n (fac (- n 1)))))

එය ලබා දී ඇති සංඛ්‍යාවේ සාධකය පුනරාවර්තනය කරයි.

පළමු පියවර වන්නේ ශ්‍රිතයේ ශරීරයේ කාර්ය සාධන ලක්ෂණය මෙම අවස්ථාවේ දී පමණක් උත්සාහ කිරීම සහ තීරණය කිරීම ය, ශරීරයේ විශේෂ කිසිවක් සිදු නොකෙරේ, ගුණ කිරීම (හෝ අගය 1 නැවත පැමිණීම).

එබැවින් ශරීරයේ කාර්ය සාධනය: ඕ (1) (නියත).

ඊළඟට උත්සාහ කර පුනරාවර්තන ඇමතුම් ගණන සඳහා මෙය තීරණය කරන්න . මෙම අවස්ථාවේදී අපට n-1 පුනරාවර්තන ඇමතුම් ඇත.

එබැවින් පුනරාවර්තන ඇමතුම් සඳහා කාර්ය සාධනය වනුයේ: O (n-1) (අනුපිළිවෙල n, අප නොවැදගත් කොටස් ඉවතට විසි කරන බැවින්).

ඉන්පසු එම දෙක එකට තබා සම්පූර්ණ පුනරාවර්තන ශ්‍රිතය සඳහා ඔබට කාර්ය සාධනය ඇත:

1 * (n-1) = O (n)


පේතෘස් , ඔබ මතු කළ ප්‍රශ්නවලට පිළිතුරු දීමට ; මා මෙහි විස්තර කරන ක්‍රමය ඇත්ත වශයෙන්ම මෙය හොඳින් හසුරුවයි. නමුත් මෙය තවමත් දළ විශ්ලේෂණයක් මිස ගණිතමය වශයෙන් නිවැරදි පිළිතුරක් නොවන බව මතක තබා ගන්න . මෙහි විස්තර කර ඇති ක්‍රමය විශ්ව විද්‍යාලයේ අපට උගන්වන ලද එක් ක්‍රමයක් වන අතර, මට නිවැරදිව මතක නම් මෙම උදාහරණයේ දී මා භාවිතා කළ සාධකයට වඩා බොහෝ දියුණු ඇල්ගොරිතම සඳහා භාවිතා කරන ලදී.
ඇත්ත වශයෙන්ම ඒ සියල්ල රඳා පවතින්නේ ශ්‍රිතයේ ධාවන කාලය සහ පුනරාවර්තන ඇමතුම් ගණන ඔබට කොතරම් හොඳින් තක්සේරු කළ හැකිද යන්න මතය, නමුත් එය අනෙක් ක්‍රම සඳහාම සත්‍ය වේ.


ස්වේන්, පුනරාවර්තන ශ්‍රිතයක සංකීර්ණත්වය විනිශ්චය කිරීමේ ක්‍රමය ඉහළ සිට පහළට සෙවීම / සාරාංශ කිරීම / ද්විමය ගසක යමක් කිරීම වැනි වඩාත් සංකීර්ණ ඒවා සඳහා ක්‍රියා කරනු ඇතැයි මට විශ්වාස නැත. ඔබට සරල උදාහරණයක් ගැන තර්කානුකූලව පිළිතුරු දිය හැකිය. නමුත් මම හිතන්නේ ඔබට පුනරාවර්තන අය සඳහා ගණිතයක් කළ යුතු යැයි?
පීටර්

3
පුනරාවර්තනය සඳහා +1 ... එසේම මෙය ලස්සනයි: "... මහාචාර්යවරයා පවා සිතීමට අපව දිරිමත් කළේය ..." :)
TT_

ඔව් මේක ගොඩක් හොඳයි. මම මේ ආකාරයට සිතීමට නැඹුරු වෙමි, O (..) තුළ ඇති පදය වැඩි කරන්න, ඔබ / යන්ත්‍රය කරන වැඩ වැඩි වේ. යම් දෙයක් සම්බන්ධව එය සිතීම දළ වශයෙන් විය හැකි නමුත් මෙම සීමාවන් ද එසේමය. යෙදවුම් ගණන වැඩි වූ විට කළ යුතු වැඩ වැඩි වන්නේ කෙසේදැයි ඔවුන් ඔබට කියනු ඇත.
අභිනව් ගෞනියල්

26

ඔබේ පිරිවැය බහුපදයක් නම්, එහි ගුණකය නොමැතිව ඉහළම ඇණවුම් පදය තබා ගන්න. උදා:

සාමාන්ය ((n / 2 + 1) * (n / 2)) = O (n 2 /4 + n / 2) = O (n 2 /4) = O (n 2 )

මෙය අනන්ත ශ්‍රේණියක් සඳහා ක්‍රියා නොකරයි, මතක තබා ගන්න. සාමාන්‍ය නඩුව සඳහා තනි වට්ටෝරුවක් නොමැත, සමහර පොදු අවස්ථා සඳහා පහත සඳහන් අසමානතාවයන් අදාළ වේ:

O (ලොග් N ) <O ( N ) <O ( N log N ) <O ( N 2 ) <O ( N k ) <O (e n ) <O ( n !)


8
නිසැකවම O (N) <O (NlogN)
jk.

22

තොරතුරු අනුව මම ඒ ගැන සිතමි. ඕනෑම ගැටළුවක් සමන්විත වන්නේ නිශ්චිත බිටු සංඛ්‍යාවක් ඉගෙනීමෙනි.

ඔබේ මූලික මෙවලම වන්නේ තීරණ ගැනීමේ සංකල්පය සහ ඒවායේ එන්ට්‍රොපියයි. තීරණාත්මක ස්ථානයක එන්ට්‍රොපිය යනු එය ඔබට ලබා දෙන සාමාන්‍ය තොරතුරු ය. නිදසුනක් ලෙස, වැඩසටහනක ශාඛා දෙකක් සහිත තීරණාත්මක ලක්ෂ්‍යයක් තිබේ නම්, එය එන්ට්‍රොපිය යනු එක් එක් ශාඛාවේ සම්භාවිතාවේ එකතුව, එම ශාඛාවේ ප්‍රතිලෝම සම්භාවිතාවේ ලොග් 2 ට වඩා දෙගුණයකි. එම තීරණය ක්‍රියාත්මක කිරීමෙන් ඔබ ඉගෙන ගන්නේ එයයි.

උදාහරණයක් ලෙස, ifශාඛා දෙකක් ඇති ප්‍රකාශයකට සමානව ඉඩ ඇති 1/2 * ලොග් (2/1) + 1/2 * ලොග් (2/1) = 1/2 * 1 + 1/2 * 1 = 1. එබැවින් එහි එන්ට්‍රොපිය බිට් 1 කි.

ඔබ N = 1024 වැනි N අයිතම වගුවක් සොයන්නේ යැයි සිතමු. ලොග් (1024) = බිටු 10 නිසා එය බිටු 10 ක ගැටළුවක් වේ. එබැවින් ඔබට සමානව ප්‍රති come ල ඇති IF ප්‍රකාශ සමඟ එය සෙවිය හැකි නම්, එය තීරණ 10 ක් ගත යුතුය.

ද්විමය සෙවුමෙන් ඔබට ලැබෙන්නේ එයයි.

ඔබ රේඛීය සෙවීමක් කරනවා යැයි සිතමු. ඔබ පළමු අංගය දෙස බලා එය ඔබට අවශ්‍ය දැයි විමසන්න. සම්භාවිතාව එය 1/1024 ක් වන අතර 1023/1024 එය නොවේ. එම තීරණයෙහි එන්ට්‍රොපිය 1/1024 * ලොග් (1024/1) + 1023/1024 * ලොග් (1024/1023) = 1/1024 * 10 + 1023/1024 * ගැන 0 = බිට් .01 පමණ වේ. ඔබ ඉගෙනගෙන ඇත්තේ ඉතා අල්පයකි! දෙවන තීරණය වඩා හොඳ නැත. රේඛීය සෙවීම එතරම් මන්දගාමී වන්නේ එබැවිනි. ඇත්ත වශයෙන්ම එය ඔබ ඉගෙන ගත යුතු බිටු ගණනෙහි on ාතීය වේ.

ඔබ සුචිගත කිරීමක් කරනවා යැයි සිතමු. වගුව බඳුන් රාශියකට පෙර වර්ග කර ඇති බව සිතමු, ඔබ යතුරේ ඇති බිටු සමහරක් සෘජුවම මේස සටහනට දර්ශක කිරීමට භාවිතා කරයි. බඳුන් 1024 ක් තිබේ නම්, එන්ට්‍රොපිය 1/1024 * ලොග් (1024) + 1/1024 * ලොග් (1024) + ... විය හැකි සියලුම ප්‍රති 10 ල සඳහා. මෙය එක් දර්ශක මෙහෙයුමක් සඳහා 1/1024 * 10 ගුණයක් 1024 හෝ එන්ට්‍රොපි බිටු 10 කි. සුචිගත කිරීමේ සෙවීම වේගවත් වන්නේ එබැවිනි.

දැන් වර්ග කිරීම ගැන සිතන්න. ඔබට N අයිතම තිබේ, ඔබට ලැයිස්තුවක් ඇත. සෑම අයිතමයක් සඳහාම, ලැයිස්තුවේ අයිතමය යන්නේ කොතැනට දැයි සෙවිය යුතු අතර පසුව එය ලැයිස්තුවට එක් කරන්න. එබැවින් වර්ග කිරීම යටි සෙවුමේ පියවර ගණන මෙන් දළ වශයෙන් N ගුණයක් ගනී.

එබැවින් දළ වශයෙන් සමාන ප්‍රති come ල ඇති ද්විමය තීරණ මත පදනම් වූ වර්ග සියල්ලම O (N log N) පියවර ගනී. O (N) වර්ග කිරීමේ ඇල්ගොරිතමයක් සුචිගත කිරීමේ සෙවීම මත පදනම් වේ නම් එය කළ හැකිය.

සියලුම ඇල්ගොරිතම කාර්ය සාධන ගැටළු මේ ආකාරයෙන් සොයා බැලිය හැකි බව මම සොයාගෙන ඇත්තෙමි.


වොව්. ඔබට මේ පිළිබඳව ප්‍රයෝජනවත් යොමු කිරීම් තිබේද? මෙම දේවල් මට සැලසුම් / ප්‍රතික්‍රියාකාරක / නිදොස් කිරීමේ වැඩසටහන් සඳහා උපකාරී වන බව මට හැඟේ.
ජෙස්වින් ජෝස්

3
ichaitchnyu: එය වටින දේ සඳහා, මම ඒ හා වෙනත් මාතෘකා ආවරණය වන පරිදි පොතක් ලිව්වෙමි . මුද්‍රණය නොකොට බොහෝ කාලයක් ගත වී ඇත, නමුත් පිටපත් සාධාරණ මිලකට යයි. මම එය ලබා ගැනීමට ගූගල් බුක්ස් ලබා ගැනීමට උත්සාහ කර ඇත්තෙමි, නමුත් මේ මොහොතේ ප්‍රකාශන හිමිකම ඇත්තේ කාටදැයි සොයා ගැනීම ටිකක් අපහසුය.
මයික් ඩන්ලාවි

21

මුල සිටම ආරම්භ කරමු.

පළමුවෙන්ම, දත්ත පිළිබඳ ඇතැම් සරල මෙහෙයුම් O(1)කාලයාගේ ඇවෑමෙන් කළ හැකිය යන මූලධර්මය පිළිගන්න , එනම්, ආදානයේ ප්‍රමාණයෙන් ස්වාධීන වන වේලාවක. C හි මෙම ප්‍රාථමික මෙහෙයුම් වලින් සමන්විත වේ

  1. අංක ගණිතමය මෙහෙයුම් (උදා + හෝ%).
  2. තාර්කික මෙහෙයුම් (උදා: &&).
  3. සංසන්දනය කිරීමේ මෙහෙයුම් (උදා: <=).
  4. ව්‍යුහයට ප්‍රවේශ වීමේ මෙහෙයුම් (උදා: A [i] වැනි අරාව-සුචිගත කිරීම, හෝ -> ක්‍රියාකරු සමඟ දර්ශකය අඩු කිරීම).
  5. අගය විචල්‍යයකට පිටපත් කිරීම වැනි සරල පැවරුම.
  6. පුස්තකාල කාර්යයන් සඳහා ඇමතුම් (උදා: ස්කෑන්ෆ්, ප්‍රින්ට්එෆ්).

මෙම මූලධර්මය සාධාරණීකරණය කිරීම සඳහා සාමාන්‍ය පරිගණකයක යන්ත්‍ර උපදෙස් (ප්‍රාථමික පියවර) පිළිබඳ සවිස්තරාත්මක අධ්‍යයනයක් අවශ්‍ය වේ. විස්තර කරන ලද සෑම මෙහෙයුමක්ම යන්ත්‍ර උපදෙස් සුළු සංඛ්‍යාවක් සමඟ කළ හැකිය; බොහෝ විට අවශ්‍ය වන්නේ උපදෙස් එකක් හෝ දෙකක් පමණි. එහි ප්‍රති consequ ලයක් ලෙස, C හි ප්‍රකාශ වර්ග කිහිපයක් O(1)කාලයාගේ ඇවෑමෙන් ක්‍රියාත්මක කළ හැකිය , එනම් ආදාන වලින් ස්වාධීනව යම් නියත කාලයක් තුළ. මෙම සරල ඇතුළත් වේ

  1. ඒවායේ ප්‍රකාශනවල ක්‍රියාකාරී ඇමතුම් සම්බන්ධ නොවන පැවරුම් ප්‍රකාශ.
  2. ප්‍රකාශ කියවන්න.
  3. තර්ක තක්සේරු කිරීමට ක්‍රියාකාරී ඇමතුම් අවශ්‍ය නොවන ප්‍රකාශ ලියන්න.
  4. පැනීමේ ප්‍රකාශයන් කැඩී යයි, ඉදිරියට යයි, ගොටෝ සහ ආපසු ප්‍රකාශනය කරයි, එහිදී ප්‍රකාශනයේ ක්‍රියාකාරී ඇමතුමක් නොමැත.

C හි, බොහෝ ලූප සඳහා සෑදී ඇත්තේ දර්ශක විචල්‍යයක් යම් අගයකට ආරම්භ කිරීමෙන් සහ එම විචල්‍යය ලූපය වටා සෑම අවස්ථාවකම 1 කින් වැඩි කිරීමෙනි. දර්ශකය යම් සීමාවකට ළඟා වූ විට for-loop අවසන් වේ. උදාහරණයක් ලෙස, for-loop

for (i = 0; i < n-1; i++) 
{
    small = i;
    for (j = i+1; j < n; j++)
        if (A[j] < A[small])
            small = j;
    temp = A[small];
    A[small] = A[i];
    A[i] = temp;
}

දර්ශක විචල්‍යය භාවිතා කරයි i. එය ලූපය වටා සෑම වාරයක්ම 1 කින් වැඩි කරන අතර, මම n - 1 කරා ළඟා වූ විට නැවත නැවත ක්‍රියා කරයි.

කෙසේ වෙතත්, මේ මොහොතේ, ෆෝ-ලූප් හි සරල ස්වරූපය කෙරෙහි අවධානය යොමු කරන්න, එහිදී අවසාන හා ආරම්භක අගයන් අතර වෙනස, දර්ශක විචල්‍යය වැඩි කරන ප්‍රමාණයෙන් බෙදනු ලැබේ. . පැනීමේ ප්‍රකාශයක් හරහා ලූපයෙන් පිටවීමට ක්‍රම නොමැති නම්, එම ගණන හරියටම වේ; එය ඕනෑම අවස්ථාවක පුනරාවර්තන ගණනට ඉහළින් බැඳී ඇත.

නිදසුනක් ලෙස, for-loop iterates ((n − 1) − 0)/1 = n − 1 times, 0 යනු i හි ආරම්භක අගය වන බැවින්, n - 1 යනු i වෙත ළඟා වූ ඉහළම අගයයි (එනම්, මම n - 1 කරා ළඟා වූ විට, ලූපය නතර වන අතර i = n− සමඟ කිසිදු ක්‍රියාවක් සිදු නොවේ. 1), සහ 1 ලූපයේ එක් එක් පුනරාවර්තනයේදී i ට එකතු වේ.

සරලම අවස්ථාවෙහිදී, ලූප් ශරීරයේ ගත කරන කාලය එක් එක් පුනරාවර්තනය සඳහා සමාන වන විට, අපට ලූපය වටා ඇති වාර ගණන අනුව ශරීරය සඳහා විශාල-ඕ ඉහළ මායිම ගුණ කළ හැකිය . නිශ්චිතවම කිවහොත්, අපි ලූප දර්ශකය ආරම්භ කිරීමට O (1) කාලය සහ ලූප දර්ශකයේ පළමු සංසන්දනය සඳහා O (1) කාලය සීමාව සමඟ එකතු කළ යුතුය , මන්ද අපි ලූපය වටා ගමන් කරනවාට වඩා එක් වරක් පරික්ෂා කරමු. කෙසේ වෙතත්, ලූපය ශුන්‍ය වාරයක් ක්‍රියාත්මක කිරීමට නොහැකි නම්, ලූපය ආරම්භ කිරීමට සහ සීමාව වරක් පරීක්ෂා කිරීමට ගතවන කාලය සාරාංශ නියෝගයෙන් ඉවත් කළ හැකි පහත් පෙළේ යෙදුමකි.


දැන් මෙම උදාහරණය සලකා බලන්න:

(1) for (j = 0; j < n; j++)
(2)   A[i][j] = 0;

අපි දන්නවා මාර්ගය (1) ගනී O(1)කාලය. (1) පේළියේ ඇති ඉහළ සීමාවෙන් පහළ සීමාව අඩු කිරීමෙන් පසුව 1 එකතු කිරීමෙන් අපට තීරණය කළ හැකි පරිදි පැහැදිලිවම අපි ලූපය වටා ගමන් කරමු. ශරීරය, රේඛාව (2), O (1) කාලය ගතවන බැවින්, j වැඩි කිරීමට ගතවන කාලය සහ j සමඟ n සංසන්දනය කිරීමට ගතවන කාලය අපට නොසලකා හැරිය හැකිය, මේ දෙකම O (1) වේ. මේ අනුව, සහ (2) මාර්ග (1) ධාවන කාලය යනු n හා සාමාන්ය (1) නිෂ්පාදන වන, O(n).

ඒ හා සමානව, (2) සිට (4) රේඛා වලින් සමන්විත පිටත පුඩුවේ ධාවන කාලය අපට බැඳිය හැකිය

(2) for (i = 0; i < n; i++)
(3)     for (j = 0; j < n; j++)
(4)         A[i][j] = 0;

(3) සහ (4) රේඛා වල ලූපයට O (n) කාලය ගතවන බව අපි දැනටමත් තහවුරු කර ඇත්තෙමු. මේ අනුව, I වැඩි කිරීමට O (1) කාලය නොසලකා හැරිය හැකි අතර, එක් එක් නැවතීමේ දී i <n දැයි පරීක්ෂා කිරීමට, පිටත ලූපයේ එක් එක් පුනරාවර්තනයට O (n) කාලය ගතවන බව නිගමනය කළ හැකිය.

පිටත ලූපයේ i = 0 ආරම්භය සහ (n + 1) තත්වයේ පරීක්ෂණය i <n ඒ හා සමානව O (1) කාලය ගත වන අතර එය නොසලකා හැරිය හැකිය. අවසාන වශයෙන්, අපි පිටත පුඩුවක් වටා n වාරයක් ගමන් කරන බව නිරීක්ෂණය කරමු, එක් එක් පුනරාවර්තනය සඳහා O (n) කාලය ගත කරමින්, සම්පූර්ණ O(n^2)ධාවන කාලය ලබා දේ.


වඩාත් ප්‍රායෝගික උදාහරණයක්.

රූප විස්තරය මෙහි ඇතුළත් කරන්න


ගොටෝ ප්‍රකාශයක ක්‍රියාකාරී ඇමතුමක් තිබේ නම් කුමක් කළ යුතුද? පියවර 3 වැනි දෙයක්: if (M.step == 3) {M = step3 (done, M); } step4: if (M.step == 4) {M = step4 (M); } if (M.step == 5) {M = step5 (M); goto step3; } if (M.step == 6) {M = step6 (M); goto step4; } ආපසු කට්_මැට්‍රික්ස් (ඒ, එම්); එවිට සංකීර්ණතාව ගණනය කරන්නේ කෙසේද? පියවර 4 n ^ 3 සහ පියවර 5 n ^ 2 ලෙස සලකන විට එය එකතු කිරීමක් හෝ ගුණ කිරීමක් ද?
ටහා තාරික්

14

කේතය විශ්ලේෂණය කරනවාට වඩා ආනුභවිකව ඔබේ කේතයේ අනුපිළිවෙල තක්සේරු කිරීමට ඔබට අවශ්‍ය නම්, ඔබට n සහ ඔබේ කේතය වැඩි කරන අගයන් මාලාවකට ඇලී සිටිය හැකිය. ඔබේ වේලාවන් ලොග් පරිමාණයෙන් සැලසුම් කරන්න. කේතය O (x ^ n) නම්, අගයන් n බෑවුමක වැටිය යුතුය.

කේතය හැදෑරීමට වඩා මෙය වාසි කිහිපයක් ඇත. එක් දෙයක් නම්, ඔබ ධාවන කාලය එහි අසමමිතික අනුපිළිවෙලට ළඟා වන පරාසය තුළ දැයි ඔබට දැක ගත හැකිය. එසේම, O (x) ඇණවුම යැයි ඔබ සිතූ සමහර කේත සැබවින්ම O (x ^ 2) ඇණවුමක් බව ඔබට පෙනී යා හැකිය, උදාහරණයක් ලෙස පුස්තකාල ඇමතුම් සඳහා ගත කරන කාලය නිසා.


මෙම පිළිතුර යාවත්කාලීන කිරීම සඳහා: en.wikipedia.org/wiki/Analysis_of_algorithms , මෙම සබැඳිය ඔබට අවශ්‍ය සූත්‍රය ඇත. බොහෝ ඇල්ගොරිතමයන් බල රීතියක් අනුගමනය කරයි, ඔබ එසේ කරන්නේ නම්, යන්ත්‍රයක කාල ලක්ෂ්‍ය 2 ක් සහ ධාවන වේලාවන් 2 ක් තිබේ නම්, අපට ලොග්-ලොග් බිම් කැබැල්ලක බෑවුම ගණනය කළ හැකිය. A = log (t2 / t1) / log (n2 / n1), මෙය මට O (N ^ a) හි ඇල්ගොරිතම සඳහා on ාතයක් ලබා දුන්නේය. කේතය භාවිතා කර අතින් ගණනය කිරීම හා සැසඳිය හැකිය.
ක්‍රිස්ටෝපර් ජෝන්

1
හායි, හොඳ පිළිතුරක්. මෙම ආනුභවික ක්‍රමය සාමාන්‍යකරණය කිරීම සඳහා ඔබ කිසියම් පුස්තකාලයක් හෝ ක්‍රමවේදයක් (උදාහරණයක් ලෙස පයිතන් / ආර් සමඟ වැඩ කරමි) ගැන දැනුවත්ව සිටීදැයි මම කල්පනා කළෙමි. ස්තූතියි
agenis

11

මූලික වශයෙන් 90% ක්ම වගා කරන දෙය වන්නේ ලූප විශ්ලේෂණය කිරීමයි. ඔබට තනි, ද්විත්ව, ත්‍රිත්ව කැදැලි වළළු තිබේද? ඔබට O (n), O (n ^ 2), O (n ^ 3) ධාවන කාලය ඇත.

ඉතා කලාතුරකින් (ඔබ පුළුල් පාදක පුස්තකාලයක් සහිත වේදිකාවක් ලියන්නේ නැත්නම් (නිදසුනක් ලෙස .NET BCL, හෝ C ++ ගේ STL වැනි) ඔබේ ලූප දෙස බැලීමට වඩා අපහසු ඕනෑම දෙයක් ඔබට හමුවනු ඇත (ප්‍රකාශ සඳහා, ගොටෝ, etc ...)


1
ලූප මත රඳා පවතී.
kelalaka

8

බිග් ඕ අංකනය ප්‍රයෝජනවත් වන්නේ එය සමඟ වැඩ කිරීම පහසු වන අතර අනවශ්‍ය සංකූලතා සහ විස්තර සඟවයි (අනවශ්‍ය අර්ථ දැක්වීමක් සඳහා). බෙදීම්වල සංකීර්ණත්වය සහ ඇල්ගොරිතම යටත් කර ගැනීමේ එක් හොඳ ක්‍රමයක් වන්නේ ගස් ක්‍රමයයි. මධ්යන්ය ක්රියා පටිපාටිය සමඟ ඔබට ක්වික්සෝර්ට් අනුවාදයක් ඇති බව කියමු, එබැවින් ඔබ සෑම විටම අරාව පරිපූර්ණ සමතුලිත උප අරා වලට බෙදයි.

දැන් ඔබ සමඟ වැඩ කරන සියලුම අරා වලට අනුරූප ගසක් සාදන්න. මූලයේ ඔබට මුල් අරාව ඇත, මූලයට දරුවන් දෙදෙනෙකු සිටින අතර ඒවා උප කුලක වේ. ඔබට පතුලේ තනි මූලද්‍රව්‍ය අරා ඇති තෙක් මෙය නැවත කරන්න.

අපට O (n) වේලාවේ මධ්‍යන්‍යය සොයා ගත හැකි අතර O (n) වේලාවෙන් අරාව කොටස් දෙකකට බෙදිය හැකි බැවින්, සෑම නෝඩයකම සිදු කරන කාර්යය O (k) වන අතර k යනු අරාවේ ප්‍රමාණයයි. ගසෙහි සෑම මට්ටමකම (බොහෝ දුරට) මුළු අරාව අඩංගු වේ, එබැවින් එක් මට්ටමකට වැඩ කිරීම O (n) වේ (උප කුලකවල ප්‍රමාණය n දක්වා එකතු වේ, සහ අපට O (k) මට්ටමකට ඇති බැවින් අපට මෙය එකතු කළ හැකිය) . අපි ආදානය අඩක් කරන සෑම අවස්ථාවකම ගසෙහි ලොග් (n) මට්ටම් පමණක් ඇත.

එබැවින් අපට O (n * log (n)) මගින් වැඩ ප්‍රමාණය ඉක්මවා යා හැකිය.

කෙසේ වෙතත්, බිග් ඕ අපට සමහර විට නොසලකා හැරිය නොහැකි තොරතුරු සඟවයි. සමඟ ෆිබොනාච්චි අනුක්‍රමය ගණනය කිරීම සලකා බලන්න

a=0;
b=1;
for (i = 0; i <n; i++) {
    tmp = b;
    b = a + b;
    a = tmp;
}

a සහ b යනු ජාවා හි බිග් ඉන්ටෙජර්ස් හෝ අත්තනෝමතික ලෙස විශාල සංඛ්‍යාවක් හැසිරවිය හැකි දෙයක් යැයි උපකල්පනය කරමු. බොහෝ අය පවසන්නේ මෙය නොපෙනෙන O (n) ඇල්ගොරිතමයක් බවයි. හේතුව නම්, ඔබ for for loop හි n පුනරාවර්තන ඇති අතර O (1) ලූපයේ වැඩ කරයි.

නමුත් ෆිබොනාච්චි සංඛ්‍යා විශාලය, n- වන ෆිබොනාච්චි අංකය n හි on ාතීය වේ, එබැවින් එය ගබඩා කිරීම බයිට් n අනුපිළිවෙලට ගනු ඇත. විශාල සංඛ්‍යා සමඟ එකතු කිරීම සිදු කිරීමෙන් O (n) වැඩ ප්‍රමාණයක් ගත වේ. එබැවින් මෙම ක්‍රියා පටිපාටිය තුළ සිදු කරන ලද මුළු වැඩ ප්‍රමාණය වේ

1 + 2 + 3 + ... + n = n (n-1) / 2 = O (n ^ 2)

ඉතින් මෙම ඇල්ගොරිතම ක්‍රියාත්මක වන්නේ චතුරස්රාකාර වේලාවක!


1
සංඛ්‍යා ගබඩා කර ඇති ආකාරය ගැන ඔබ සැලකිලිමත් නොවිය යුතුය, ඇල්ගොරිතම O (n) හි ඉහළ මායිමක වර්ධනය වන බව වෙනස් නොවේ.
mikek3332002

8

සාමාන්‍යයෙන් අඩු ප්‍රයෝජනවත් යැයි මම සිතමි, නමුත් සම්පූර්ණත්වය සඳහා ඇල්ගොරිතමයේ සංකීර්ණතාවයට පහළ සීමාවක් නිර්වචනය කරන බිග් ඔමේගා and සහ ඉහළ සහ පහළ මායිම යන දෙකම අර්ථ දක්වන බිග් තීටා ද ඇත.


7

විශාල O අංකනය සඳහා ඔබ දන්නා ඇල්ගොරිතම කැබලිවලට කඩා, විශාල O ක්‍රියාකරුවන් හරහා ඒකාබද්ධ කරන්න. මා දන්නා එකම ක්‍රමය එයයි.

වැඩි විස්තර සඳහා, විෂය පිළිබඳ විකිපීඩියා පිටුව පරීක්ෂා කරන්න .


7

මා භාවිතා කරන ඇල්ගොරිතම / දත්ත ව්‍යුහයන් පිළිබඳ හුරුපුරුදුකම සහ / හෝ පුනරාවර්තන කැදැල්ල පිළිබඳ ඉක්මන් බැල්ම විශ්ලේෂණය. දුෂ්කරතාව වන්නේ ඔබ පුස්තකාල ශ්‍රිතයක් අමතන විට, සමහර විට කිහිප වතාවක් - ඔබ විටින් විට ශ්‍රිතය අනවශ්‍ය ලෙස අමතන්නේද යන්න හෝ ඔවුන් භාවිතා කරන්නේ කුමන ක්‍රියාත්මක කිරීමද යන්න පිළිබඳව ඔබට සැකයක් නැත. සමහර විට පුස්තකාල කාර්යයන් සංකීර්ණ / කාර්යක්ෂමතා මිනුමක් තිබිය යුතුය, එය බිග් ඕ හෝ වෙනත් මෙට්‍රික් වේවා, එය ලේඛනවල හෝ ඉන්ටෙලිසෙන්ස් වලින් ලබා ගත හැකිය .


6

බිග් ඕ "ඔබ ගණනය කරන්නේ කෙසේද" යන්නට අනුව මෙය පරිගණක සංකීර්ණතා සිද්ධාන්තයේ කොටසකි . සමහර (බොහෝ) විශේෂ අවස්ථා සඳහා ඔබට සරල සුවපහසුවක් (කැදැලි වළළු සඳහා ලූප ගණනය කිරීම වැනි) පැමිණිය හැකිය. ඔබට අවශ්‍ය වන්නේ ඕනෑම ඉහළ තක්සේරුවක් වන අතර, එය අශුභවාදී නම් ඔබට කමක් නැත - මම අනුමාන කරන්නේ ඔබේ ප්‍රශ්නය කුමක් විය හැකිද යන්නයි.

ඕනෑම ඇල්ගොරිතමයක් සඳහා ඔබේ ප්‍රශ්නයට පිළිතුරු දීමට ඔබට සැබවින්ම අවශ්‍ය නම් ඔබට කළ හැකි හොඳම දේ න්‍යාය ක්‍රියාත්මක කිරීමයි. සරල "නරකම" විශ්ලේෂණයට අමතරව ක්‍රමක්ෂය විශ්ලේෂණය ප්‍රායෝගිකව ඉතා ප්‍රයෝජනවත් බව මට පෙනී ගොස් ඇත.


6

1 වන නඩුව සඳහා, අභ්යන්තර පුඩුවක් ක්රියාත්මක වන n-iමරණ දඬුවම සංඛ්යාව සඳහා මුදලක්, එසේ, වරක් iයනවා 0කිරීමට n-1පිළිබඳ (පහළ වඩා අඩු හෝ සමාන නොවන, වඩා නිසා) n-i. ඔබ අවසානයේ n*(n + 1) / 2, එසේO(n²/2) = O(n²) .

2 වන පුඩුවක් ලෙස, iත් අතර ය 0සහ nපිටත පුඩුවක් සඳහා ඇතුළත්; එවිට අභ්‍යන්තර ලූපය ක්‍රියාත්මක jවන්නේ ඊට වඩා තදින් වැඩි වූ විටය n.


5

මාස්ටර් ක්‍රමය (හෝ එහි විශේෂීකරණයන්ගෙන් එකක්) භාවිතා කිරීමට අමතරව, මම මගේ ඇල්ගොරිතම අත්හදා බැලුවෙමි. කිසියම් විශේෂිත සංකීර්ණ පන්තියක් සාක්ෂාත් කර ගත් බව මෙයින් සනාථ කළ නොහැකි නමුත් ගණිතමය විශ්ලේෂණය සුදුසු බවට එය සහතික විය හැකිය. මෙම සහතික කිරීම සඳහා උපකාර කිරීම සඳහා, මම මගේ අත්හදා බැලීම්වලට සමගාමීව කේත ආවරණ මෙවලම් භාවිතා කරමි.

ඉතා සරල උදාහරණයක් ලෙස .NET රාමුවේ ලැයිස්තු වර්ග කිරීමේ වේගය පිළිබඳව සනීපාරක්ෂාව පරීක්ෂා කිරීමට ඔබට අවශ්‍ය විය. ඔබට පහත සඳහන් දේ වැනි දෙයක් ලිවිය හැකිය, ඉන්පසු එක්සෙල් හි ප්‍රති results ල විශ්ලේෂණය කර ඒවා n * ලොග් (n) වක්‍රය ඉක්මවා නොගිය බවට වග බලා ගන්න.

මෙම උදාහරණයේ දී මම සැසඳීම් ගණන මනිනු ලැබේ, නමුත් එක් එක් නියැදි ප්‍රමාණයට අවශ්‍ය සත්‍ය කාලය පරීක්ෂා කිරීම ද විචක්ෂණශීලී ය. කෙසේ වෙතත්, ඔබ ඇල්ගොරිතම මනින බවත් ඔබේ පරීක්ෂණ යටිතල ව්‍යුහයෙන් පුරාවස්තු ඇතුළත් නොවන බවත් ඔබ වඩාත් සැලකිලිමත් විය යුතුය.

int nCmp = 0;
System.Random rnd = new System.Random();

// measure the time required to sort a list of n integers
void DoTest(int n)
{
   List<int> lst = new List<int>(n);
   for( int i=0; i<n; i++ )
      lst[i] = rnd.Next(0,1000);

   // as we sort, keep track of the number of comparisons performed!
   nCmp = 0;
   lst.Sort( delegate( int a, int b ) { nCmp++; return (a<b)?-1:((a>b)?1:0)); }

   System.Console.Writeline( "{0},{1}", n, nCmp );
}


// Perform measurement for a variety of sample sizes.
// It would be prudent to check multiple random samples of each size, but this is OK for a quick sanity check
for( int n = 0; n<1000; n++ )
   DoTest(n);

5

යමෙකුට සීමිත මතක සම්පත් තිබේ නම් එය සැලකිලිමත් වීමට හේතුවක් විය හැකි අවකාශයේ සංකීර්ණතාවයන්ට ඉඩ දීමට අමතක නොකරන්න. උදාහරණයක් ලෙස ඇල්ගොරිතම විසින් ගන්නා ලද ඉඩ ප්‍රමාණය කේතය තුළ ඇති කිසිදු සාධකයක් මත රඳා නොපවතින බව පැවසීමට ක්‍රමයක් වන නියත අභ්‍යවකාශ ඇල්ගොරිතමයක් අවශ්‍ය කෙනෙකුට ඔබට ඇසෙනු ඇත.

සමහර විට සංකීර්ණත්වය පැමිණිය හැක්කේ යමක් කී වතාවක්ද, කොපමණ වාරයක් ලූපයක් ක්‍රියාත්මක කරන්නේද, මතකය කොපමණ වාරයක් වෙන් කර ඇත්ද යන්න සහ මෙම ප්‍රශ්නයට පිළිතුරු දීමට තවත් කොටසකි.

අවසාන වශයෙන්, ඇල්ගොරිතමයක් කෙතරම් නරකද යන්න විස්තර කිරීම සඳහා සාමාන්‍යයෙන් භාවිතා වන නරකම අවස්ථාව වන නරකම අවස්ථාව, හොඳම අවස්ථාව සහ ක්‍රමක්ෂය කිරීමේ අවස්ථා සඳහා විශාල O භාවිතා කළ හැකිය.


4

බොහෝ විට නොසලකා හරිනු ලබන්නේ ඔබේ ඇල්ගොරිතම වල අපේක්ෂිත හැසිරීමයි. එය ඔබගේ ඇල්ගොරිතමයේ බිග්-ඕ වෙනස් නොකරයි , නමුත් එය "නොමේරූ ප්‍රශස්තිකරණය" යන ප්‍රකාශයට සම්බන්ධ වේ.

ඔබගේ ඇල්ගොරිතමයේ අපේක්ෂිත හැසිරීම නම් - ඉතා ගොළුයි - ඔබ දැකීමට බොහෝ දුරට ඉඩ ඇති දත්ත මත ඔබේ ඇල්ගොරිතම කොතරම් වේගයෙන් ක්‍රියා කරයිදැයි අපේක්ෂා කළ හැකිය.

උදාහරණයක් ලෙස, ඔබ ලැයිස්තුවක වටිනාකමක් සොයන්නේ නම්, එය ඕ (එන්) ය, නමුත් ඔබ දකින බොහෝ ලැයිස්තු වල ඔබේ වටිනාකම ඉදිරියෙන් ඇති බව ඔබ දන්නේ නම්, ඔබේ ඇල්ගොරිතමයේ සාමාන්‍ය හැසිරීම වේගවත් වේ.

එය සැබවින්ම ඇණ ගැසීමට, ඔබේ "ආදාන අවකාශයේ" සම්භාවිතා ව්‍යාප්තිය විස්තර කිරීමට ඔබට අවශ්‍ය විය යුතුය (ඔබට ලැයිස්තුවක් වර්ග කිරීමට අවශ්‍ය නම්, එම ලැයිස්තුව දැනටමත් කොපමණ වාර ගණනක් වර්ග කර තිබේද? එය කොපමණ වාරයක් මුළුමනින්ම ආපසු හරවනු ලැබේද? බොහෝ විට එය බොහෝ දුරට වර්ග කර තිබේද?) ඔබ එය දැන සිටීම සැමවිටම කළ නොහැක්කකි, නමුත් සමහර විට ඔබ එසේ කරයි.


4

නියම ප්‍රශ්නයක්!

වියාචනය: මෙම පිළිතුරෙහි ව්‍යාජ ප්‍රකාශ අඩංගු වන අතර පහත දැක්වෙන අදහස් බලන්න.

ඔබ බිග් ඕ භාවිතා කරන්නේ නම්, ඔබ කතා කරන්නේ වඩාත් නරක අවස්ථාව ගැන ය (පසුව එයින් අදහස් කරන්නේ කුමක්ද යන්න ගැන වැඩි විස්තර). මීට අමතරව, සාමාන්‍ය නඩුව සඳහා ප්‍රාග්ධන තීටා සහ හොඳම අවස්ථාව සඳහා විශාල ඔමේගා ඇත.

බිග් ඕ හි සුන්දර විධිමත් අර්ථ දැක්වීමක් සඳහා මෙම වෙබ් අඩවිය බලන්න: https://xlinux.nist.gov/dads/HTML/bigOnotation.html

f (n) = O (g (n)) යන්නෙන් අදහස් කරන්නේ ධනාත්මක නියතයන් c සහ k ඇති බවයි, එනම් සියලු n ≥ k සඳහා 0 ≤ f (n) ≤ cg (n). F ශ්‍රිතය සඳහා c සහ k හි අගයන් සවි කළ යුතු අතර එය n මත රඳා නොපවතී.


හරි, ඉතින් දැන් අපි "හොඳම අවස්ථාව" සහ "නරකම" සංකීර්ණතා වලින් අදහස් කරන්නේ කුමක්ද?

මෙය බොහෝ විට පැහැදිලිව නිදර්ශන මගින් විදහා දක්වයි. නිදසුනක් ලෙස, අපි වර්ග කළ අරාවක අංකයක් සෙවීම සඳහා රේඛීය සෙවුමක් භාවිතා කරන්නේ නම්, නරකම අවස්ථාව වන්නේ අරාවේ අවසාන අංගය සෙවීමට අප තීරණය කළ විට මෙය අරාවෙහි අයිතම ඇති බැවින් පියවර ගණනාවක් ගතවනු ඇත. මෙම හොඳම නඩුව අපි සොයන විට වනු පළමු අංගය අපි පළමු චෙක්පත පසු සිදු කළ බැවින්.

මෙම සියලු නාම- කේස් සංකීර්ණතාවල කාරණය නම්, විශේෂිත විචල්‍යයන්ගේ ප්‍රමාණය අනුව උපකල්පිත වැඩසටහනක් සම්පූර්ණ වන තෙක් ප්‍රස්ථාර ගත කිරීමට අපි ක්‍රමයක් සොයමු. කෙසේ වෙතත් බොහෝ ඇල්ගොරිතම සඳහා ඔබට නිශ්චිත ප්‍රමාණයේ ආදානය සඳහා එක් කාලයක් නොමැති බව තර්ක කළ හැකිය. මෙය ශ්‍රිතයක මූලික අවශ්‍යතාවයට පටහැනි බව සලකන්න, ඕනෑම ආදානයකට එක් ප්‍රතිදානයකට වඩා තිබිය යුතු නැත. එබැවින් ඇල්ගොරිතමයේ සංකීර්ණත්වය විස්තර කිරීම සඳහා අපි විවිධ කාර්යයන් ඉදිරිපත් කරමු. දැන්, n ප්‍රමාණයේ ශ්‍රේණියක් සෙවීම සඳහා ඔබ අරාවෙහි සොයන දේ අනුව සහ n ට සමානුපාතිකව වෙනස්වන කාලයක් ගතවනු ඇතත්, අපට හොඳම අවස්ථාව, සාමාන්‍ය-නඩුව භාවිතා කරමින් ඇල්ගොරිතම පිළිබඳ තොරතුරු විස්තරයක් නිර්මාණය කළ හැකිය. , සහ නරකම පන්ති.

කණගාටුයි, මෙය එතරම් දුර්වල ලෙස ලියා ඇති අතර බොහෝ තාක්ෂණික තොරතුරු නොමැත. නමුත් එය කාල සංකීර්ණතා පන්ති ගැන සිතීම පහසු කරයි. ඔබ මේවා සමඟ සැපපහසු වූ පසු එය ඔබේ වැඩසටහන හරහා විග්‍රහ කිරීම සහ ඔබේ දත්ත ව්‍යුහයන් මත පදනම්ව අරාව ප්‍රමාණයන් සහ තර්කණය මත රඳා පවතින ලූප සඳහා දේවල් සෙවීම සරල කාරණයක් බවට පත්වේ. නරකම අවස්ථාවල.


1
මෙය වැරදිය. බිග් ඕ යන්නෙහි තේරුම “ඉහළ මායිම” නරකම අවස්ථාව නොවේ.
සැමී බෙන්චරිෆ්


1
මෙය නොමඟ යවන සුළුය. බිග්-ඕ යන්නෙන් අදහස් වන්නේ f (n) ශ්‍රිතයක් සඳහා ඉහළ මායිමකි. ඔමේගා යන්නෙන් අදහස් කරන්නේ f (n) ශ්‍රිතයක් සඳහා පහළ මායිමකි. එය කිසිසේත්ම හොඳම නඩුව හෝ නරකම අවස්ථාව හා සම්බන්ධ නොවේ.
තස්නීම් හයිඩර්

1
ඔබට බිග්-ඕ හොඳම හෝ නරකම අවස්ථාව සඳහා ඉහළ සීමාවක් ලෙස භාවිතා කළ හැකිය, නමුත් ඒ හැර, ඔව් සම්බන්ධයක් නැත.
සැමී බෙන්චරිෆ්

2

මෙය ක්‍රමලේඛිකව විසඳන්නේ කෙසේදැයි මම නොදනිමි, නමුත් මිනිසුන් කරන පළමු දෙය නම් සිදු කරන ලද මෙහෙයුම් ගණනෙහි ඇතැම් රටාවන් සඳහා අපි ඇල්ගොරිතම සාම්පල ගත කිරීමයි, 4n ^ 2 + 2n + 1 අපට නීති 2 ක් ඇති බව පවසන්න:

  1. අපට කොන්දේසි එකතුවක් තිබේ නම්, විශාලතම වර්ධන වේගය සහිත යෙදුම තබා ඇති අතර වෙනත් යෙදුම් මඟ හැරී ඇත.
  2. අපට සාධක කිහිපයක නිෂ්පාදනයක් තිබේ නම් නියත සාධක මඟ හැරේ.

අපි f (x) සරල කළහොත්, සිදු කරන ලද මෙහෙයුම් ගණන සඳහා සූත්‍රය f (x) වේ, (4n ^ 2 + 2n + 1 ඉහත විස්තර කර ඇත), අපි මෙහි විශාල O අගය ලබා ගනිමු [O (n ^ 2) නඩුව]. නමුත් මෙය ක්‍රියාත්මක කිරීම අසීරු විය හැකි වැඩසටහනේ ලැග්‍රැන්ජ් අන්තර් මැදිහත්වීම සඳහා හේතු විය යුතුය. සැබෑ ලොකු-ඕ අගය O (2 ^ n) නම්, අපට O (x ^ n) වැනි යමක් තිබිය හැක, එබැවින් මෙම ඇල්ගොරිතම ක්‍රමලේඛනය කළ නොහැකි වනු ඇත. නමුත් යමෙකු මා වැරදි බව ඔප්පු කළහොත් මට කේතය දෙන්න. . . .


2

A කේතය සඳහා, පිටත ලූපය n+1වාර ගණනක් ක්‍රියාත්මක කරනු ඇත, '1' කාලය යනු මා තවමත් අවශ්‍යතාවය සපුරාලන්නේද යන්න පරීක්ෂා කරන ක්‍රියාවලියයි. අභ්‍යන්තර පුඩුවක් nකාලය, n-2වේලාව ....0+2+..+(n-2)+n= (0+n)(n+1)/2= O(n²) .

B කේතය සඳහා, අභ්‍යන්තර ලූපය පියවරෙන් පියවර foo () ක්‍රියාත්මක නොකරනු ඇතත්, අභ්‍යන්තර ලූපය n වාරයක් ක්‍රියාත්මක කරනුයේ පිටත ලූප ක්‍රියාත්මක කිරීමේ වේලාව මතය, එය O (n) වේ.


1

බිග්-ඕ ටිකක් වෙනස් පැත්තකින් පැහැදිලි කිරීමට මම කැමතියි.

බිග්-ඕ යනු වැඩසටහන් වල සංකීර්ණතාව සංසන්දනය කිරීම පමණි, එයින් අදහස් කරන්නේ යෙදවුම් වැඩි වන විට ඒවා කෙතරම් වේගයෙන් වර්ධනය වනවාද යන්න මිස ක්‍රියාව කිරීමට වැය කරන නිශ්චිත කාලය නොවේ.

බිග්-ඕ සූත්‍රවල IMHO වඩා සංකීර්ණ සමීකරණ භාවිතා නොකිරීමට වඩා හොඳය (ඔබ පහත දැක්වෙන ප්‍රස්ථාරයේ ඇති ඒවාට ඇලී සිටිය හැකිය.) කෙසේ වෙතත් ඔබ තවමත් වෙනත් වඩාත් නිවැරදි සූත්‍ර භාවිතා කළ හැකිය (3 ^ n, n ^ 3, .. .) නමුත් ඊට වඩා සමහර විට නොමඟ යවන සුළු විය හැකිය! එබැවින් එය හැකි තරම් සරල ලෙස තබා ගැනීම වඩා හොඳය.

රූප විස්තරය මෙහි ඇතුළත් කරන්න

අපගේ ඇල්ගොරිතම සඳහා නිශ්චිත සූත්‍රයක් ලබා ගැනීමට මෙහි අපට අවශ්‍ය නැති බව නැවත වරක් අවධාරණය කිරීමට කැමැත්තෙමි. අපට අවශ්‍ය වන්නේ යෙදවුම් වර්ධනය වන විට එය වර්ධනය වන ආකාරය පෙන්වීමට සහ එම අර්ථයෙන් අනෙක් ඇල්ගොරිතම සමඟ සංසන්දනය කිරීමට පමණි. එසේ නොමැතිනම් ඔබ බංකුව සලකුණු කිරීම වැනි විවිධ ක්‍රම භාවිතා කිරීම වඩා හොඳය.

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.