O (log n) හරියටම අදහස් කරන්නේ කුමක්ද?


2149

මම බිග් ඕ අංකනය ක්‍රියාත්මක වන වේලාවන් සහ ක්‍රමක්ෂය කළ වේලාවන් ගැන ඉගෙන ගන්නෙමි. O (n) රේඛීය වේලාව යන සංකල්පය මට වැටහී ඇත , එයින් අදහස් වන්නේ ආදානයේ විශාලත්වය සමානුපාතිකව ඇල්ගොරිතමයේ වර්ධනයට බලපාන බවයි ... එසේම එය සමාන වේ, උදාහරණයක් ලෙස චතුරස්රාකාර කාලය O (n 2 ) යනාදිය. , සාධකයන් විසින් වර්ධනය වන O (n!) වාරයක් සහිත ප්‍රේරක උත්පාදක යන්ත්‍ර වැනි .

උදාහරණයක් ලෙස, පහත දැක්වෙන ශ්‍රිතය O (n) වන්නේ ඇල්ගොරිතම එහි ආදාන n ට සමානුපාතිකව වර්ධනය වන බැවිනි :

f(int n) {
  int i;
  for (i = 0; i < n; ++i)
    printf("%d", i);
}

ඒ හා සමානව, කැදැලි ලූපයක් තිබුනේ නම්, කාලය O (n 2 ) වේ.

නමුත් O (log n) යනු කුමක්ද? උදාහරණයක් ලෙස, සම්පූර්ණ ද්විමය ගසක උස O (log n) යැයි කීමෙන් අදහස් කරන්නේ කුමක්ද?

ල ar ු ගණකය යනු කුමක්දැයි මම දනිමි (සමහර විට එය සවිස්තරාත්මකව නොවේ): ලොග් 10 100 = 2, නමුත් ල ar ු ගණක වේලාවක් සහිත ශ්‍රිතයක් හඳුනා ගන්නේ කෙසේදැයි මට තේරුම් ගත නොහැක.


61
1-නෝඩ් ද්විමය ගසකට උස ලොග් 2 (1) +1 = 1, 2-නෝඩ් ගසකට උස ලොග් 2 (2) +1 = 2, 4-නෝඩ් ගසකට උස ලොග් 2 (4) +1 = 3, සහ එසේ ය. N-node ගසකට උස log2 (n) +1 ඇත, එබැවින් ගසට නෝඩ් එකතු කිරීමෙන් එහි සාමාන්‍ය උස ල ar ු ගණකමය ලෙස වර්ධනය වේ.
ඩේවිඩ් ආර් ට්‍රිබල්

36
බොහෝ පිළිතුරු වලින් මා දකින එක් දෙයක් නම්, ඔවුන් මූලිකවම "ඕ (යමක්)" විස්තර කරන අතර ඇල්ගොරිතමයේ ධාවන කාලය "යමක්" ට සමානුපාතිකව වර්ධනය වේ. ඔබ "ඕ (ලොග් එන්)" හි "නිශ්චිත අරුත" ඉල්ලා ඇති බැවින් එය සත්‍ය නොවේ. බිග්-ඕ නොව බිග්-තීටා අංකනය පිළිබඳ අවබෝධාත්මක විස්තරය එයයි. සාමාන්ය (n-සටහන) අවිවාදයෙන්ම පිළිගැනීමට ධාවන කාලය වර්ධනය වේ අදහස් වැඩිම : "ලොග් n" සමානුපාතික stackoverflow.com/questions/471199/...
Mehrdad Afshari

32
ඕ (ලොග් එන්) සඳහා උදාහරණය ලෙස බෙදීම සහ ජය ගැනීම මට සැමවිටම මතකයි
රිචඩ් ඕඩ්

14
එහි ලොග් පදනම 2 (පදනම් 10 නොවේ) බව වටහා ගැනීම වැදගත්ය. මෙයට හේතුව ඇල්ගොරිතමයේ සෑම පියවරකදීම ඔබ ඉතිරි තේරීම්වලින් අඩක් ඉවත් කිරීමයි. පරිගණක විද්‍යාවේදී අපි සෑම විටම පාහේ ලොග් බේස් 2 සමඟ ගනුදෙනු කරන්නේ අපට නියතයන් නොසලකා හැරිය හැකි බැවිනි. කෙසේ වෙතත් සමහර ව්‍යතිරේකයන් ඇත (එනම් ක්වාඩ් ගස ධාවනය වන වේලාවන් ලොග් 4 වේ)
ඊතන්

13
@ ඊතන්: පාදක පරිවර්තනය නියත ගුණ කිරීමක් පමණක් බැවින් ඔබ කුමන පදනමක සිටියත් කමක් නැත, සූත්‍රය log_b (x) = log_d (x) / log_d (b) වේ. Log_d (b) නියතයක් වනු ඇත.
mindvirus

Answers:


2719

ලොග් කාලය සමඟ ශ්‍රිතයක් හඳුනා ගන්නේ කෙසේදැයි මට තේරුම් ගත නොහැක.

ල ar ු ගණක ධාවන කාල ශ්‍රිතයේ වඩාත් පොදු ලක්ෂණ නම්:

  • යම් ක්‍රියාවක් කළ යුතු ඊළඟ මූලද්‍රව්‍යය තෝරා ගැනීම හැකියාවන් කිහිපයකින් එකකි, සහ
  • එකක් පමණක් තෝරා ගත යුතුය.

හෝ

  • ක්‍රියාව සිදු කරන මූලද්‍රව්‍යයන් n හි ඉලක්කම් වේ

නිදසුනක් වශයෙන්, දුරකථන පොතක පුද්ගලයින් බැලීම O (log n) වන්නේ මේ නිසා ය. නිවැරදි තැනැත්තා සොයා ගැනීමට දුරකථන පොතේ සිටින සෑම පුද්ගලයෙකුම පරීක්ෂා කිරීමට ඔබට අවශ්‍ය නැත ; ඒ වෙනුවට, ඔබට ඔවුන්ගේ නම අකාරාදී ලෙස පදනම් කරගෙන බැලීමෙන් සරලව බෙදීමට සහ ජය ගත හැකි අතර, සෑම අංශයකම ඔබට අවශ්‍ය වන්නේ ඔබ යමෙකුගේ දුරකථන අංකය සොයා ගැනීමට පෙර එක් එක් කොටසේ උප කුලකයක් ගවේෂණය කිරීමයි.

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


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

දුරකථන පොතේ අප වේගවත් හා මන්දගාමී දක්වා කළ හැකි සමහර මෙහෙයුම් වල ධාවන වේලාවන් මෙන්න:

  • O (1) (නරකම අවස්ථාවක): ව්‍යාපාරයක නමක් ඇති පිටුව සහ ව්‍යාපාර නාමය අනුව දුරකථන අංකය සොයා ගන්න.

  • O (1) (සාමාන්‍ය අවස්ථාවෙහිදී): පුද්ගලයෙකුගේ නමක් ඇති පිටුව සහ ඔවුන්ගේ නම අනුව, දුරකථන අංකය සොයා ගන්න.

  • O (log n): පුද්ගලයෙකුගේ නමක් ලබා දී, ඔබ තවමත් සෙවූ පොතේ කොටසෙන් අඩක් පමණ අහඹු ස්ථානයක් තෝරා ගැනීමෙන් දුරකථන අංකය සොයා ගන්න, ඉන්පසු එම පුද්ගලයාගේ නම එම ස්ථානයේ තිබේදැයි පරීක්ෂා කරන්න. පුද්ගලයාගේ නම පිහිටා ඇති පොතේ කොටසෙන් අඩක් පමණ ක්‍රියාවලිය නැවත කරන්න. (මෙය පුද්ගලයෙකුගේ නමක් සඳහා ද්විමය සෙවීමකි.)

  • O (n): "5" ඉලක්කම් අඩංගු සියලුම දුරකථන අංක සොයා ගන්න.

  • O (n): දුරකථන අංකයක් ලබා දී, එම අංකය ඇති පුද්ගලයා හෝ ව්‍යාපාරය සොයා ගන්න.

  • O (n log n): මුද්‍රණාලයේ කාර්යාලයේ මිශ්‍රණයක් ඇති අතර අපගේ දුරකථන පොතේ එහි සියලුම පිටු අහඹු ලෙස ඇතුළත් කර ඇත. සෑම පිටුවකම මුල් නම බැලීමෙන් පසුව එම පිටුව සුදුසු තැනක නව හිස් දුරකථන පොතක තැබීමෙන් ඇණවුම නිවැරදි කරන්න.

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

  • O (n log n): අපට දුරකථන පොත පුද්ගලීකරණය කිරීමට අවශ්‍යය, එබැවින් අපි එක් එක් පුද්ගලයාගේ හෝ ව්‍යාපාරයේ නම ඔවුන්ගේ නම් කරන ලද පිටපතෙහි සොයා ගැනීමට බලාපොරොත්තු වෙමු, ඉන්පසු ඔවුන්ගේ නම පොතේ රවුම් කර ඔවුන්ගේ අනුග්‍රහය සඳහා කෙටි ස්තූති සටහනක් ලියන්න. .

  • O (n 2 ): කාර්යාලයේ අත්වැරැද්දක් සිදුවී ඇති අතර, සෑම දුරකථන පොතකම සෑම ප්‍රවේශයකම දුරකථන අංකයේ අවසානයේ අතිරේක "0" ඇත. සුදු පැහැයක් ගෙන එක් එක් බිංදුව ඉවත් කරන්න.

  • O (n · n!): දුරකථන පොත් නැව් තටාකයට පැටවීමට අපි සූදානම්. අවාසනාවකට මෙන්, පොත් පැටවීමට නියමිත රොබෝවරයා පිදුරු ගසා ඇත: එය පොත් අහඹු ලෙස ට්‍රක් රථයට දමයි! ඊටත් වඩා භයානක දෙය නම්, එය සියලුම පොත් ට්‍රක් රථයට පටවන අතර පසුව ඒවා නිසි පිළිවෙලට තිබේදැයි පරීක්ෂා කර බලන අතර එසේ නොවේ නම් එය ඒවා මුදා හැර නැවත ආරම්භ වේ. (මෙය භයානක බොගෝ වර්ග කිරීමකි .)

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


81
@cletus: අහම්බෙන්, මම බිය වෙමි. මම එය තෝරාගත්තේ දුරකථන පොත් වල විශාල එන් ප්‍රමාණයක් ඇති නිසාත්, ඒවා මොනවාද සහ ඔවුන් කරන දේ මිනිසුන් තේරුම් ගෙන ඇති නිසාත්, එය උදාහරණයක් ලෙස බහුකාර්ය නිසාත් ය. මගේ පැහැදිලි කිරීම සඳහා මට රොබෝවරු භාවිතා කිරීමට සිදුවිය! සෑම තැනකම ජයග්‍රහණයක්. (එසේම, මම ආරම්භ කිරීමට ස්ටැක් ඕවර්ෆ්ලෝ හි සාමාජිකයෙකු වීමට පෙර ඔබේ පිළිතුර ලබා දුන් බවක් පෙනේ!)
ජෝන් ෆෙමිනෙලා

12
"කාර්යාලයේ අත්වැරැද්දක් සිදුවී ඇති අතර, සෑම දුරකථන පොතකම සෑම ප්‍රවේශයකම දුරකථන අංකයේ අවසානයේ අමතර" 0 "ඇත. සුදු පැහැයක් ගෙන එක් එක් ශුන්‍යය ඉවත් කරන්න." <- මෙය N වර්ගයට අනුපිළිවෙලක් නොවේ. N යනු ආදානයේ ප්‍රමාණය ලෙස අර්ථ දැක්වේ. ආදානයේ විශාලත්වය දුරකථන අංක ගණන වන අතර එය පොත් ගණනකට වඩා පොත් ගණනකට වඩා වැඩි ගණනකි. එය තවමත් රේඛීය කාල මෙහෙයුමකි.
බිලී ඔනේල්

21
Ill බිලී: මෙම උදාහරණයේ Nදී, එක් පොතක සිටින පුද්ගලයින් සංඛ්‍යාව වේ. දුරකථන පොතේ සිටින සෑම පුද්ගලයෙකුටම තමන්ගේම පොතේ පිටපතක් ලැබෙන නිසා, N සමාන දුරකථන පොත් තිබේ, එක් එක් Nපුද්ගලයින් එහි සිටින අතර එය O (N ^ 2) වේ.
ජෝන් ෆෙමිනෙලා

48
O (1) අමුතු ලෙස ඉස්මතු කර ඇති පරිදි නරකම අවස්ථාවකට වඩා හොඳම අවස්ථාව නොවේද?
ස්විප්

54
O (log n) අර්ථ දැක්වීමක් සොයා ගැනීමට මට O (long⅝n! N-55/2) කාලයක් ගත විය. +1
iAteABug_And_iLiked_it

616

O(log N)මූලික වශයෙන් අදහස් කරන්නේ කාලය on ාතීය ලෙස ඉහළ යන අතර කාලය රේඛීයව ඉහළ nයන බවයි. එබැවින් මූලද්‍රව්‍ය 1ගණනය කිරීමට තත්පරයක් ගත වුවහොත් 10, මූලද්‍රව්‍ය ගණනය කිරීමට 2තත්පර 100, මූලද්‍රව්‍ය ගණනය කිරීමට 3තත්පර 1000, සහ යනාදිය ගත වේ.

එය O(log n)අපි ගණිත ක්රමයක් උදා ද්විමය සෙවීම්, බෙදා ජයගන්න වර්ගය කරන විට. තවත් උදාහරණයක් වන්නේ ඉක්මන් වර්ග කිරීමකි, එහිදී අපි අරාව කොටස් දෙකකට බෙදන අතර සෑම අවස්ථාවකම O(N)හැරවුම් මූලද්‍රව්‍යයක් සොයා ගැනීමට කාලය ගතවේ . එබැවින් එය N O(log N)


111
අනෙක් සියලුම රචනා පිළිතුරු වලට පහර දෙන ප්‍ර wisdom ාවේ පේළි තුනක් ... :) යමෙකු එය මග හැරී ඇත්නම්, ක්‍රමලේඛන සන්දර්භය තුළ, ලොග් පදනම 2 (10 නොවේ), එබැවින් ඕ (ලොග් එන්) පරිමාණය තත්පර 1 ට 10 ට මූලද්‍රව්‍ය, 20 ට තත්පර 2, 40 සඳහා 3 යනාදිය
නවෆල්

3
එකඟ වූ, සංක්ෂිප්ත හා පැහැදිලි ය, OP හි අවසාන ප්‍රශ්නය වූයේ ල ar ු ගණක ශ්‍රිතයක් හඳුනා ගන්නේ කෙසේ ද යන්න මිස “එය කුමක්ද” යන්න නොවේ
ඇඩම්

4
ඔව්, ල ar ු ගණක ශ්‍රිතය එය on ාතීය ශ්‍රිතයට ප්‍රතිලෝම වේ. ((ලොග් x) පදනම a) ප්‍රතිලෝම වේ (බලය x). ප්‍රස්ථාර සමඟ මෙම කාර්යයන් ගුණාත්මකව විශ්ලේෂණය කිරීමෙන් වැඩි අවබෝධයක් ලැබෙනු ඇත.
overexchange

7
මෙය වැරදි නොවන බව වටහා ගැනීමට මට කියවීම් 3 ක් පමණ ගත විය. කාලය රේඛීයව ඉහළ යන අතර මූලද්‍රව්‍ය ගණන on ාතීය වේ. මෙයින් අදහස් කරන්නේ අඩු කාලයක් තුළ තවත් මූලද්‍රව්‍යයන් බවයි . logප්‍රස්ථාරයක හුරුපුරුදු ලොග් වක්‍රය ලෙස පෙනෙන අයට මෙය මානසිකව බදු අය කෙරේ .
ක්වික්ස් - මොනිකා

1
ද්විමය සෙවීම බෙදීමක් සහ ජයග්‍රාහී ඇල්ගොරිතමයක් යැයි පවසන කොටස හැර මෙය ඉතා හොඳ පිළිතුරක් යැයි මම සිතමි. එය එසේ නොවේ.
code_dredd

580

මෙම ප්‍රශ්නයට බොහෝ හොඳ පිළිතුරු දැනටමත් පළ කර ඇත, නමුත් මම විශ්වාස කරන්නේ අපට වැදගත් එකක් නැති වී ඇති බවයි - එනම් නිදර්ශන පිළිතුර.

සම්පූර්ණ ද්විමය ගසක උස O (log n) යැයි කීමෙන් අදහස් කරන්නේ කුමක්ද?

පහත දැක්වෙන චිත්‍රයෙන් ද්විමය ගසක් නිරූපණය කෙරේ. ඉහත මට්ටමට සාපේක්ෂව එක් එක් මට්ටම්වල නෝඩ් ගණන මෙන් දෙගුණයක් අඩංගු වන ආකාරය සැලකිල්ලට ගන්න (එබැවින් ද්විමය ):

ද්විමය ගස

ද්විමය සෙවීම සංකීර්ණත්වය සහිත උදාහරණයකි O(log n). රූපයේ 1 හි ඇති ගසෙහි පහළ මට්ටමේ ඇති නෝඩ් කිසියම් වර්ගීකරණ එකතුවක ඇති අයිතම නියෝජනය කරන බව කියමු. ද්විමය සෙවීම යනු බෙදීම් සහ ජය ගැනීමේ ඇල්ගොරිතමයක් වන අතර, මෙම අයිතම 16 දත්ත සමුදාය තුළ අප සොයන වාර්තාව සොයා ගැනීමට සැසඳීම් 4 ක් අවශ්‍ය වන්නේ කෙසේද යන්න චිත්‍රයෙන් පෙන්වයි.

අපට ඒ වෙනුවට මූලද්‍රව්‍ය 32 ක් සහිත දත්ත කට්ටලයක් ඇතැයි සිතමු. අප සොයන දේ සොයා ගැනීමට අපට දැන් සැසඳීම් 5 ක් අවශ්‍ය බව සොයා ගැනීමට ඉහත චිත්‍රය දිගටම කරගෙන යන්න, මන්ද අප දත්ත ප්‍රමාණය ගුණ කළ විට ගස එක් මට්ටමකට වඩා ගැඹුරට වර්ධනය වී ඇත. මෙහි ප්‍රති As ලයක් ලෙස ඇල්ගොරිතමයේ සංකීර්ණතාව ල ar ු ගණක අනුපිළිවෙලක් ලෙස හැඳින්විය හැකිය.

log(n)සරල කඩදාසි කැබැල්ලක කුමන්ත්‍රණය කිරීමෙන් ප්‍රස්ථාරයක් ලැබෙනු ඇත, එහිදී වක්‍රයේ නැගීම වැඩි වන විට පහත වැටේ n:

ඕ (ලොග් එන්)


60
"ඉහත මට්ටමට සාපේක්ෂව එක් එක් මට්ටම්වල ද්විත්ව නෝඩ් සංඛ්‍යාවක් අඩංගු වන ආකාරය සැලකිල්ලට ගන්න (එබැවින් ද්විමය)" මෙය වැරදිය. ඔබ විස්තර කරන්නේ සමබර ද්විමය ගසක්. ද්විමය ගසක් යනු සෑම නෝඩයකම ළමුන් දෙදෙනෙකු සිටින බවයි.
ඔෙනොට්‍රියා

8
ඇත්ත වශයෙන්ම, එය සම්පූර්ණ ද්විමය ගසක් ලෙස හැඳින්වෙන ඉතා සුවිශේෂී සමතුලිත ද්විමය ගසක් වේ. මම පිළිතුර සංස්කරණය කර ඇති නමුත් එය අනුමත කිරීමට යමෙකු අවශ්‍යය.
user21820

5
සම්පූර්ණ ද්විමය ගසක සම්පූර්ණ මට්ටම පිරවීම සඳහා අවසාන මට්ටම අවශ්‍ය නොවේ. 'සම්පූර්ණ ද්විමය ගසක්' වඩාත් සුදුසු යැයි මම කියමි.
ඒ.ජේ

ඔබගේ පිළිතුර OP හි මුල් ගැටළුවට වඩා සංක්ෂිප්තව ප්‍රතිචාර දැක්වීමට උත්සාහ කරයි, එබැවින් එය දැනට පිළිගත් පිළිතුරට (IMO) වඩා හොඳය, නමුත් එය තවමත් ඉතා අසම්පූර්ණයි: ඔබ අර්ධ උදාහරණයක් සහ රූප 2 ක් ලබා දෙයි ...
nbro

2
මෙම ගසෙහි අයිතම 31 ක් ඇත, 16 නොවේ. එය අයිතම 16 ක දත්ත කට්ටලයක් ලෙස හඳුන්වන්නේ ඇයි? එහි ඇති සෑම නෝඩයක්ම සංඛ්‍යාවක් නිරූපණය කරයි, එසේ නොවුවහොත් එය අකාර්යක්ෂම ද්විමය ගසක් වනු ඇත: පී
පෙරී මොන්ෂාවු

247

පහත දැක්වෙන පැහැදිලි කිරීම නම්, අපි ල ar ු ගණක කාල සංකීර්ණත්වය ලබා ගන්නේ කෙසේද යන්න තේරුම් ගැනීමට සම්පූර්ණ සමතුලිත ද්විමය ගසක් භාවිතා කිරීමයි .

ද්විමය ගස යනු 1 වන ප්‍රමාණයේ ගැටලුවකට අප ළඟා වන තුරු n ප්‍රමාණයේ ගැටළුවක් n / 2 ප්‍රමාණයේ උප ගැටළුවක් ලෙස බෙදී ඇති අවස්ථාවකි:

ද්විමය ගසක උස

විසඳුමක් ලබා ගැනීම සඳහා ඉහත ගසෙහි කළ යුතු වැඩ ප්‍රමාණය වන O (log n) ඔබට ලැබෙන්නේ එලෙසිනි.

O (log n) කාල සංකීර්ණතාවයෙන් යුත් පොදු ඇල්ගොරිතමයක් වන්නේ ද්විමය සෙවීමයි. එහි පුනරාවර්තන සම්බන්ධතාවය T (n / 2) + O (1) එනම් ගසෙහි සෑම පසුකාලීන මට්ටමකදීම ඔබ ගැටලුව අඩකට බෙදමින් නිරන්තරයෙන් අමතර වැඩ ප්‍රමාණයක් කරයි.


2
නවක මෙතන. ගසෙහි උස n = 1 ප්‍රමාණයට පුනරාවර්තනය වීමෙන් බෙදීමේ වේගය යැයි ඔබට පැවසිය හැකිද?
කෝඩි

Ody කෝඩි, ඔව් බොහෝ දුරට ඔබේ නිරීක්ෂණය නිවැරදි ය. මෙම උදාහරණය නිරූපණය කරයි / භාවිතා කරයි log_2. ඔබේ නිරීක්‍ෂණයෙන් ඔබ්බට වියදම් වන log_2අතර ඕනෑම log_xතැනකට එය නිවැරදි වනු ඇත x > 1. සෘජු බෙදීම හරියටම 1 ට හේතු නොවිය හැක, එබැවින් Ceiling()නවතම කොට් division ාශයේ 1 ට සමාන වන තෙක් පුනරාවර්තන අංශය හෝ ඊට සමාන දෙයක් පැවසීමට ඔබට අවශ්‍ය විය හැකිය .
ජේම්ස් ඔරවෙක්

200

දළ විශ්ලේෂණය

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

පළමුව, ඔබට https://en.wikipedia.org/wiki/Logarithm වෙතින් ලබා ගත හැකි Logarithm පිළිබඳ පොදු අදහසක් ලබා ගැනීමට ඔබට අවශ්‍ය වනු ඇත . ස්වාභාවික විද්‍යා භාවිතය eසහ ස්වාභාවික ලොගය. ඉංජිනේරු ගෝලයන් log_10 (ලොග් බේස් 10) භාවිතා කරන අතර පරිගණක විද්‍යා scientists යින් ලොග්_2 (ලොග් බේස් 2) බොහෝ දේ භාවිතා කරනු ඇත, මන්ද පරිගණක ද්විමය පදනම් වේ. සමහර විට ඔබ ස්වාභාවික ලොග් වල කෙටි යෙදුම් දකිනු ඇත ln(), ඉංජිනේරුවන් සාමාන්‍යයෙන් _10 අතහැර දමා භාවිතා log()කර log_2 ලෙස කෙටියෙන් දක්වනු ලැබේ lg(). සියලුම වර්ගවල ල ar ු ගණක සමාන ආකාරයකින් වර්ධනය වේ, එම නිසා ඒවා එකම කාණ්ඩයට අයත් වේ log(n).

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

O (1), O (n), O (logn) යනාදිය පන්ති හෝ වර්ධන කාණ්ඩ ලෙස ඔබට සිතිය හැකිය. සමහර කාණ්ඩ අනෙක් ඒවාට වඩා වැඩි කාලයක් ගතවනු ඇත. මෙම කාණ්ඩ අපට ඇල්ගොරිතම කාර්ය සාධනය ඇණවුම් කිරීමේ ක්‍රමයක් ලබා දේ. ආදාන n වැඩෙන විට සමහරක් වේගයෙන් වර්ධනය වේ. පහත වගුවේ දැක්වෙන්නේ සංඛ්‍යාත්මකව ඉහත සඳහන් කළ වර්ධනයයි. පහත වගුවේ ලොග් (n) ලොග්_2 හි සිවිලිම ලෙස සිතන්න.

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

විවිධ විශාල O කාණ්ඩවල සරල කේත උදාහරණ:

O (1) - නියත කාල උදාහරණ:

  • ඇල්ගොරිතම 1:

ඇල්ගොරිතම 1 වරක් හලෝ මුද්‍රණය කරන අතර එය n මත රඳා නොපවතින බැවින් එය සෑම විටම නියත වේලාවක ක්‍රියාත්මක වේ, එබැවින් එය එසේ වේ O(1).

print "hello";
  • ඇල්ගොරිතම 2:

ඇල්ගොරිතම 2 හලෝ 3 වතාවක් මුද්‍රණය කරයි, කෙසේ වෙතත් එය ආදාන ප්‍රමාණය මත රඳා නොපවතී. N වර්ධනය වන විට පවා, මෙම ඇල්ගොරිතම සෑම විටම හලෝ 3 වතාවක් පමණක් මුද්‍රණය කරයි. 3 යැයි පැවසීම නියතයක් බැවින් මෙම ඇල්ගොරිතම ද O(1)වේ.

print "hello";
print "hello";
print "hello";

O (ලොග් (n)) - ල ar ු ගණක උදාහරණ:

  • ඇල්ගොරිතම 3 - මෙය "ලොග්_2" ලෙස ක්‍රියා කරයි

ඇල්ගොරිතම 3 මඟින් log_2 (n) තුළ ක්‍රියාත්මක වන ඇල්ගොරිතමයක් පෙන්නුම් කරයි. ෆෝ ලූපයේ පශ්චාත් ක්‍රියාකාරිත්වය i හි වත්මන් අගය 2 කින් iගුණ කරන බැවින් 1 සිට 2 දක්වා 4 සිට 8 සිට 16 සිට 32 දක්වා ...

for(int i = 1; i <= n; i = i * 2)
  print "hello";
  • ඇල්ගොරිතම 4 - මෙය "ලොග්_3" ලෙස ක්‍රියා කරයි

ඇල්ගොරිතම 4 මඟින් log_3 නිරූපණය කරයි. දැන්වීම i1 සිට 3 දක්වා 9 සිට 27 දක්වා ...

for(int i = 1; i <= n; i = i * 3)
  print "hello";
  • ඇල්ගොරිතම 5 - මෙය "log_1.02" ලෙස ක්‍රියා කරයි

ඇල්ගොරිතම 5 වැදගත් වේ, එය සංඛ්‍යාව 1 ට වඩා වැඩි නම් සහ ප්‍රති result ලය නැවත නැවතත් තමාට එරෙහිව ගුණ කරන තාක් කල්, ඔබ ල ar ු ගණක ඇල්ගොරිතමයක් දෙස බලන බව පෙන්වීමට උපකාරී වේ.

for(double i = 1; i < n; i = i * 1.02)
  print "hello";

O (n) - රේඛීය කාල උදාහරණ:

  • ඇල්ගොරිතම 6

මෙම ඇල්ගොරිතම සරලයි, එය හෙලෝ n වාරයක් මුද්‍රණය කරයි.

for(int i = 0; i < n; i++)
  print "hello";
  • ඇල්ගොරිතම 7

මෙම ඇල්ගොරිතමය විචල්‍යතාවයක් පෙන්නුම් කරයි, එහිදී එය හෙලෝ n / 2 වතාවක් මුද්‍රණය කරයි. n / 2 = 1/2 * n. අපි 1/2 නියතය නොසලකා හැර මෙම ඇල්ගොරිතම O (n) බව දකිමු.

for(int i = 0; i < n; i = i + 2)
  print "hello";

O (n * log (n)) - nlog (n) උදාහරණ:

  • ඇල්ගොරිතම 8

මෙය O(log(n))සහ O(n). ලූප සඳහා කූඩු දැමීම අපට ලබා ගැනීමට උපකාරී වේO(n*log(n))

for(int i = 0; i < n; i++)
  for(int j = 1; j < n; j = j * 2)
    print "hello";
  • ඇල්ගොරිතම 9

ඇල්ගොරිතම 9 ඇල්ගොරිතම 8 ට සමාන ය, නමුත් සෑම ලූපයක්ම වෙනස්කම් වලට ඉඩ දී ඇත, එහි ප්‍රති result ලය තවමත් අවසාන ප්‍රති result ලය වේ O(n*log(n))

for(int i = 0; i < n; i = i + 2)
  for(int j = 1; j < n; j = j * 3)
    print "hello";

O (n ^ 2) - n වර්ග උදාහරණ:

  • ඇල්ගොරිතම 10

O(n^2) ලූප සඳහා කැදැලි ප්‍රමිතියෙන් පහසුවෙන් ලබා ගත හැකිය.

for(int i = 0; i < n; i++)
  for(int j = 0; j < n; j++)
    print "hello";
  • ඇල්ගොරිතම 11

ඇල්ගොරිතම 10 මෙන්, නමුත් සමහර වෙනස්කම් සහිතව.

for(int i = 0; i < n; i++)
  for(int j = 0; j < n; j = j + 2)
    print "hello";

O (n ^ 3) - n කියුබ් උදාහරණ:

  • ඇල්ගොරිතම 12

මෙය ඇල්ගොරිතම 10 වැනි ය, නමුත් 2 වෙනුවට ලූප 3 ක් ඇත.

for(int i = 0; i < n; i++)
  for(int j = 0; j < n; j++)
    for(int k = 0; k < n; k++)
      print "hello";
  • ඇල්ගොරිතම 13

ඇල්ගොරිතම 12 මෙන්, නමුත් තවමත් ලබා දෙන සමහර වෙනස්කම් සමඟ O(n^3).

for(int i = 0; i < n; i++)
  for(int j = 0; j < n + 5; j = j + 2)
    for(int k = 0; k < n; k = k + 3)
      print "hello";

සාරාංශය

ඉහත දැක්වෙන්නේ forward ජු ඉදිරි උදාහරණ කිහිපයක් වන අතර විශ්ලේෂණය සැබවින්ම වෙනස් නොකරන සියුම් වෙනස්කම් හඳුන්වා දිය හැකි ආකාරය නිරූපණය කිරීමට උපකාරී වේ. එය ඔබට ප්‍රමාණවත් අවබෝධයක් ලබා දෙනු ඇතැයි අපේක්‍ෂා කරමු.


17
නියමයි. මා දුටු හොඳම පැහැදිලි කිරීම. සහ එසේ O(n^2)සංයෝජනයක් ලෙස සටහන් කළ හොත් එය වඩාත් හොඳ වනු ඇත. මෙම සමීකරණයෙන් තොරව එය ටිකක් පැනීම මෙන් දැනේ. මෙය පූර්ව පැහැදිලි කිරීම පුනරාවර්තනයකි, නමුත් මෙම පුනරාවර්තනය පා readers කයන්ට අවබෝධය සඳහා වැඩි විශ්වාසයක් ලබා දිය හැකි යැයි මම සිතමි. O(n)O(n)O(n) * O(n) = O(n * n) = O(n^2)
ඉයෝනිල්

2
මෙය හුදෙක් හොඳම පැහැදිලි කිරීමයි.
එඩ්ගර් කිල්ජැක්

2
CeIceTea, ඔබේ ප්‍රශ්නයට තීක්ෂ්ණ බුද්ධිය / අවබෝධය ලබා දීමට. ඔබ nඑදිරිව ප්‍රස්ථාර n/2ගත කරන්නේ නම්, ඔවුන් දෙදෙනාම සරල රේඛාවක් සාදන බව ඔබට පෙනෙනු ඇත. මෙය සමාන වර්ධන අනුපාතයන් ඇති බැවින් ඔවුන් එකම පන්තියට ඇතුළත් කරයි (එය ප්‍රස්ථාරයේ හැඩය ලෙස සිතන්න). ඒ හා සමානව, ඔබ log_2එදිරිව ප්‍රස්ථාර log_3ගත කළහොත් ඔවුන් දෙදෙනාම “සමාන හැඩයන්” හෝ “සමාන වර්ධන අනුපාත” ලබා ගන්නා බව ඔබට පෙනෙනු ඇත.
ජේම්ස් ඔරවෙක්

1
@IceTea, ha ෂායි සහ ජේම්ස් විසින් දෙන ලද පැහැදිලි කිරීම වඩාත් නිවැරදියි, n/2 or 2n or n+2 or nප්‍රස්ථාරයේ වෙනස් වෙනස් රේඛා ඇති නමුත් ඒවාට සමාන වර්ධන වේගයක් ඇති අතර එයින් අදහස් වන්නේ ඒ සියල්ලම රේඛීය වර්ධනයක් අනුගමනය කරනු ඇති බවයි.
නරේෂ් ජෝෂි

2
අපට කැදැලි ලූප දෙකක් ඇති අවස්ථාව ගැන, නමුත් දෙවන අනුකාරකය පළමු එක මත රඳා පවතී, මෙම පරායත්තතාවය කාල සංකීර්ණතාවයට බලපාන්නේද?
Bionix1441

131

ඔබට අවශ්‍ය ශ්‍රිතයක් තිබේ නම්:

1 millisecond to complete if you have 2 elements.
2 milliseconds to complete if you have 4 elements.
3 milliseconds to complete if you have 8 elements.
4 milliseconds to complete if you have 16 elements.
...
n milliseconds to complete if you have 2^n elements.

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



ඔව්, මෙහි තවත් පිළිතුරක් සඳහා නව්ෆල්ගේ අදහස් බලන්න: (පිටපත් කිරීම) - ක්‍රමලේඛන සන්දර්භය තුළ, ලොග් පදනම 2 (10 නොවේ), එබැවින් O (ලොග් එන්) පරිමාණයන් මූලද්‍රව්‍ය 10 ක් සඳහා තත්පර 1 ක්, තත්පර 20 ක් සඳහා තත්පර 2 ක් වැනි ය. , 40 සඳහා 3 යනාදිය
ඇන්ඩ්‍රෙජ්

VenSvenvandenBoogaart, මෙම විසඳුමේ උදාහරණය පැහැදිලි කරයි log_2, එය පන්තියේ ය O(log(n)). එකම පන්තියේ තවත් බොහෝ අය ඉන්නවා O(log(n))එනම් log_xඑහිදීx > 1
ජේම්ස් Oravec

Nd ඇන්ඩ්‍රෙජ්ස්, ඔබේ අදහස so O(log n) scales like 1 sec for 10 elements, 2 sec for 20, 3 for 40 etcසාවද්‍ය ය. මෙම රටාව / පන්ති ගැලපෙන බව / සමඟ align O(n)නොවේ O(log(n)). යමෙකු උනන්දුවක් දක්වන්නේ log_10නම් ඊට සමාන උදාහරණයක් වනුයේ මූලද්‍රව්‍ය 10 ක් සඳහා තත්පර 1 ක්, තත්පර 100 ක් සඳහා තත්පර 2 ක්, 1000 ට 3 ක් යනාදියයි
ජේම්ස් ඔරවෙක්

99

කරන්නාට කාලය (ධාවන O(log n)) තේරුම ධාවන කාලය සමානුපාතිකව වර්ධනය බව ලඝුගණක ආදාන ප්රමාණයේ - නිදසුනක් ලෙස, භාණ්ඩ 10 වැඩිම ගනී නම් කාලය යම් මුදලක් xභාණ්ඩ 100, සහ බොහෝ විට, කිව්වොත්, ගනී 2x, සහ භාණ්ඩ 10,000 බොහෝ දුරට ගත වේ 4x, එවිට එය O(log n)කාලය සංකීර්ණ බවක් පෙනේ .


1
+1, නමුත් ඔබ සැබවින්ම පෙන්වා දිය යුත්තේ එය ලොග් 2 මිස ලොග් 10 නොවන බවයි.
ඇඩ්‍රියානෝ වරෝලි පියසා

62
log2 හෝ log10 අදාල නොවේ. ඒවා වෙනස් වන්නේ පරිමාණ සාධකයකින් පමණක් වන අතර එමඟින් ඒවා එකම අනුපිළිවෙලින් සාදයි, එනම් ඒවා තවමත් එකම අනුපාතයකින් වර්ධනය වේ.
නොල්ඩෝරින්

17
ල ar ු ගණකයේ ඇති විනෝදජනක දෙය නම් සාපේක්ෂ උස සංසන්දනය කිරීමේදී ඔබ භාවිතා කරන නිශ්චිත පදනම වැදගත් නොවේ. log 10,000 / log 1002 යනු ඔබ භාවිතා කරන පදනම කුමක් වුවත්.
ඇනොන්.

12
Nitpicky වීමට, O (lg n) යන්නෙන් අදහස් වන්නේ ධාවන කාලය බොහෝ දුරට lg n සමානුපාතික බවයි. ඔබ විස්තර කරන්නේ තේටා (lg n) ය.

1
grgrig: ඒක ඇත්ත. බිග්-ඕ හි ඉහළ මායිම් ස්වභාවය දැක්වීමට මම "බොහෝ විට" සංස්කරණය කර ඇත.
ඇනොන්.

96

ල ar ු ගණකය

හරි, ල ar ු ගණකය යනු කුමක්දැයි සම්පූර්ණයෙන් තේරුම් ගනිමු.

හිතන්න අපිට කඹයක් තියෙනවා, අපි එය අශ්වයෙකුට බැඳ තිබෙනවා. කඹය කෙලින්ම අශ්වයා සමඟ බැඳී තිබේ නම්, අශ්වයාට ඉවතට ඇද ගැනීමට අවශ්‍ය බලය (කියන්න, මිනිසෙකුගෙන්) කෙලින්ම 1 වේ.

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

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

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

සෑම ලූපයක් සඳහාම අගය 10 කින් වැඩි වන බව අපට පෙනේ. ඕනෑම සංඛ්‍යාවක් ලබා ගැනීමට අවශ්‍ය වාර ගණන අංකයේ ල ar ු ගණකය ලෙස හැඳින්වේ, එනම් ඔබේ ශක්තිය 1000 ගුණයකින් වැඩි කිරීමට අපට ලිපි 3 ක් අවශ්‍ය වේ, ඔබේ ශක්තිය ගුණ කිරීම සඳහා තනතුරු 6 ක් 1,000,000 කි.

3 යනු 1,000 ක ල ar ු ගණකය වන අතර 6 යනු 1,000,000 ක ල ar ු ගණකයයි (10 වන පදනම).

O (log n) ඇත්ත වශයෙන්ම අදහස් කරන්නේ කුමක්ද?

ඉහත අපගේ උදාහරණයේ දී, අපගේ 'වර්ධන වේගය' ඕ (ලොග් එන්) වේ. සෑම අමතර ලූපයක් සඳහාම, අපගේ කඹයට හැසිරවිය හැකි බලය 10 ගුණයක් වැඩිය:

Turns | Max Force
  0   |   1
  1   |   10
  2   |   100
  3   |   1000
  4   |   10000
  n   |   10^n

දැන් ඉහත උදාහරණය 10 වන පදනම භාවිතා කර ඇත, නමුත් වාසනාවකට මෙන් අපි ලොකු ඕ අංකනය ගැන කතා කරන විට ලොගයේ පදනම වැදගත් නොවේ.

දැන් අපි සිතමු ඔබ 1-100 අතර සංඛ්‍යාවක් අනුමාන කිරීමට උත්සාහ කරන බව.

Your Friend: Guess my number between 1-100! 
Your Guess: 50
Your Friend: Lower!
Your Guess: 25
Your Friend: Lower!
Your Guess: 13
Your Friend: Higher!
Your Guess: 19
Your Friend: Higher!
Your Friend: 22
Your Guess: Lower!
Your Guess: 20
Your Friend: Higher!
Your Guess: 21
Your Friend: YOU GOT IT!  

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

Guesses | Items
  1     |   2
  2     |   4
  3     |   8
  4     |   16
  5     |   32
  6     |   64
  7     |   128
  10    |   1024

ප්‍රස්ථාරය භාවිතා කරමින්, 1-100 අතර සංඛ්‍යාවක් අනුමාන කිරීමට ද්විමය සෙවුමක් භාවිතා කරන්නේ නම් එය උත්සාහයන් 7 ක් පමණ ගතවන බව අපට පෙනේ. අපට අංක 128 ක් තිබුනේ නම්, උත්සාහයන් 7 කින් අපට අනුමාන කළ හැකි නමුත් අංක 129 ක් උපරිම උත්සාහයන් 8 ක් ගෙන යනු ඇත (ල ar ු ගණක සම්බන්ධව, මෙහිදී අපට වටිනාකම් 128 ක් සඳහා අනුමාන 7 ක් අවශ්‍ය වේ, 1024 අගය පරාසයක් සඳහා අනුමාන 10 ක් අවශ්‍ය වේ. 7 යනු 128 හි ල ar ු ගණකය වන අතර 10 යනු 1024 හි ල ar ු ගණකයයි (පාදම 2).

මම 'බොහෝ දුරට' නිර්භීත වී ඇති බව සැලකිල්ලට ගන්න. බිග්-ඕ අංකනය සැමවිටම යොමු වන්නේ වඩාත් නරක අවස්ථාවකට ය. ඔබ වාසනාවන්ත නම්, ඔබට එක් උත්සාහයකින් අංකය අනුමාන කළ හැකි අතර හොඳම අවස්ථාව ඕ (1), නමුත් එය තවත් කතාවකි.

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

O (n log n) ගැන කුමක් කිව හැකිද?

ඔබට අවසානයේදී රේඛීය ගණිත කාල O (n ලොග් (n)) ඇල්ගොරිතමයක් හමුවනු ඇත. අතේ මාපට ඇඟිල්ල පාලනය නැවත ඉහත අදාළ වන අතර, නමුත් මෙම කාලය කරන්නාට කාර්යය ක්රියාත්මක කිරීමට ඇති n වතාවක් ලැයිස්තුවක් ප්රමාණය අඩු කිරීම උදා: n වාරයක් සඳහා mergesort වැනි ගණිත ක්රමයක් සිදුවන,.

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

වියාචනය: කඹ- ල ar ු ගණක උදාහරණය ඩබ්ලිව් . සෝයර් විසින් රචිත විශිෂ්ට ගණිත ian යාගේ ඩයිලයිට් පොතෙන් ලබා ගන්නා ලදි .


නැත In our example above, our 'growth rate' is O(log n). For every additional loop, the force our rope can handle is 10 times more, ප්‍රස්ථාරයකින් සහය දක්වයි, එය n == ලූප ගණන සහ our 'growth rate'=> 10 ^ n පෙන්වන අතර එය ලොග් නොවේ. නිදර්ශනය සෑදීමෙන් නිවැරදි කළ හැකි අතර n=# horses, එය වළක්වා ගැනීම සඳහා ලොග් එන් ලූප අවශ්‍ය වේ. දුර්වල අධ්‍යාපනික උදාහරණ මඟින් ඔවුන් තේරුම් ගනී යැයි විශ්වාස කරන සිසුන් බිහි කරයි.
psimpson

56

කාලය N හි ඉලක්කම් සංඛ්‍යාවට සමානුපාතික යැයි පවසමින් ඔබට O (ලොග් N) ගැන සිතා බැලිය හැකිය.

එක් මෙහෙයුමක එක් එක් ඉලක්කම් හෝ බිට් එකක නියත කාල වැඩක් සිදු කරන්නේ නම්, මුළු මෙහෙයුම ආදානයේ විශාලත්වය නොව ආදානයේ ඉලක්කම් හෝ බිටු ගණනට සමානුපාතික වේ. මේ අනුව, ඕ (එන්) ට වඩා ඕ (ලොග් එන්).

මෙහෙයුමක් නිරන්තර කාල තීරණ මාලාවක් ගතහොත්, ඒ සෑම එකක්ම අඩකින් (3, 4, 5 කින් අඩු කරයි ..) සලකා බැලිය යුතු ආදානයේ ප්‍රමාණය, සමස්තය ලොග් බේස් 2 (පදනම් 3) සඳහා සමානුපාතිකව කාලය ගත වේ. , පාදම 4, පාදම 5 ...) ආදානයේ N ප්‍රමාණයෙන් O (N) වීමට වඩා.

සහ යනාදි.


7
බොහෝ පැහැදිලි කිරීම් වලට වඩා නිරවද්‍ය හා පහසුවෙන් ග්‍රහණය කර ගත හැකි යැයි මම සිතමි.
ටී.

එය පැහැදිලි කිරීමක් log<sub>10</sub> Nනේද?
ලියුයාන් 刘 研

1
I ලියුයාන් 刘 digit ඉලක්කම් ගණන කොපමණ දැයි ඔවුන් කීවේ නැත. කෙසේ වෙතත්, log₂ (n) = log₁₀ (n) / log₁₀ (2) සහ 1 / log₁₀ (2) එබැවින් නියත ගුණකය වේ, අනෙක් සියලුම පදනම් වලට අදාළ වන එකම මූලධර්මය සමඟ. මෙය කරුණු දෙකක් පෙන්වයි. පළමුවෙන්ම එම මූන්ෂැඩෝ මූලධර්මය කුමන පදනමක් වුවද අදාළ වේ (පාදම පහළ වුවද, ඇස්තමේන්තුවේ “ජැග්ස්” අඩු) සහ ඕ (ලොග් එන්) ඕ (ලොග් එන්) යනු එම නිගමනයට ඔබව ගෙන ගිය ගණනය කිරීම කුමන පදනමක් වුවත් .
ජෝන් හැනා

"සමානුපාතික" ... "ඒ සෑම එකක්ම ආදානයේ ප්‍රමාණය අඩකින් අඩු කරයි" ??????
csguy

53

පළමුව මම ඔබට පහත පොත කියවීමට නිර්දේශ කරමි.

ඇල්ගොරිතම (4 වන සංස්කරණය)

මෙන්න සමහර කාර්යයන් සහ ඒවායේ අපේක්ෂිත සංකීර්ණතා. සංඛ්‍යා මඟින් ප්‍රකාශ ක්‍රියාත්මක කිරීමේ සංඛ්‍යාත දක්වයි.

මෙන්න සමහර කාර්යයන් සහ ඒවායේ අපේක්ෂිත සංකීර්ණතා

පහත සඳහන් බිග්-O සංකිර්ණභාවය සටහන ද ගෙන bigocheatsheet බිග්-ඕ සංකීර්ණතා සටහන

අවසාන වශයෙන් ඉතා සරල ප්‍රදර්ශනාගාරයක් එය ගණනය කරන ආකාරය පෙන්වයි;

වැඩසටහනක ප්‍රකාශ ක්‍රියාත්මක කිරීමේ සංඛ්‍යාතවල ව්‍යුහ විද්‍යාව.

වැඩසටහනක ධාවන කාලය විශ්ලේෂණය කිරීම (උදාහරණ).

වැඩසටහනක ධාවන කාලය විශ්ලේෂණය කිරීම


5
මම O (n log n) නරක කූඩයට දමන්නේ නැත . එය අයිති සාධාරණ එකක්.
ඇන්ඩ්‍රේ වර්ලන්ග්

බිග්-ඕ සංකීර්ණතා සටහන (ඉහළ) බලන විට ඔබට මතක තබා ගත යුත්තේ ඕ (එන්) සත්‍ය රේඛීය ලක්ෂ්‍යය මිස රෝස / තැඹිලි බෝඩරය නොවේ. AndAndre ඒ නිසා O (n log n) 'නරක' කාර්ය සාධන වරහනෙහි නිවැරදිව සලකුණු කර ඇත්තේ එබැවිනි, එය රේඛීයත්වයට වඩා නරක කාර්ය සාධනයකි.
ජාවාබීස්ට්

Ava ජාවාබීස්ට් නිවැරදියි, ඕ (එන් ලොග් එන්) හි ක්‍රියාකාරීත්වය ඕ (එන්) ට වඩා තාක්‍ෂණිකව නරක ය, ඉහත වගුව වෙත යොමු වන්න, එමඟින් ඒවා අතර හොඳ සංසන්දනයක් ඉදිරිපත් කරයි (මේ දෙකේ වර්ධනය බලන්න). otoh ප්‍රස්ථාරය, වෙනත් ප්‍රභවයකින් පරස්පර විරෝධී වන්නේ එය O (1) සහ O (log n) එකම හොඳ / විශිෂ්ට ලෙස තබන බැවිනි. ඒවායේ සාපේක්ෂ වර්ධන අනුපිළිවෙල O (n) සහ O (n log n) සමඟ සැසඳිය හැකිය. tl; dr; O (n log n) විශිෂ්ට නොවේ, නමුත් එය නරක දෙයකි.
ඇන්ඩ්‍රේ වර්ලන්ග්

1
මෙම පිළිතුර වැරදියි! එය උපකල්පනය කරන්නේ N = N * N. ඇත්ත වශයෙන්ම N = N! ඔබේ උදාහරණය ඇත්ත වශයෙන්ම එන් කැටය. ඔබේ ප්‍රස්ථාරයේද ඔබ එයම කරයි. ඔබේ O (n) ඇත්ත වශයෙන්ම භයානක හා නරක අතර බෙදීම විය යුතුය. ගණිතමය සාධනය: ඔබ කියන්නේ ලූපය O (1) සමඟ නියත බවයි. 1 යනු සැබවින්ම අදහස් කරන්නේ, එන් මත රඳා නොපවතින බවයි. නමුත් එය එන්. දෙවරක් එන් මත රඳා පවතින බැවින් එය විචල්‍ය වේ. එබැවින් එය අවලංගුය. එය එම පොතෙන් නම්, එය මිලදී නොගන්න! ඔබ පෙන්වා ඇති කේත ග්‍රැෆික් සැබෑ නොවේ, එය විහිළුවක්, බලන්න, “නියමයි”, එයින් අදහස් කරන්නේ පුද්ගලයන් තිදෙනෙකු එකවර ලිංගිකව හැසිරෙන බවයි! OMG
jgmjgm

1
O (n) විකර්ණයේ තිබිය යුතු නොවේද?
gyosifov

52

O (log n) හි ක්‍රියාත්මක වන ඇල්ගොරිතමයක් මානසිකව දෘශ්‍යමාන කිරීමට මට සැමවිටම ඇති හොඳම ක්‍රමය පහත පරිදි වේ:

ඔබ ගැටළු ප්‍රමාණය ගුණක ප්‍රමාණයකින් වැඩි කරන්නේ නම් (එනම් එහි ප්‍රමාණය 10 කින් ගුණ කරන්න), කාර්යය වැඩි වන්නේ ආකලන ප්‍රමාණයකින් පමණි.

ඔබේ ද්විමය ගස් ප්‍රශ්නයට මෙය යෙදීමෙන් ඔබට හොඳ යෙදුමක් ඇත: ඔබ ද්විමය ගසක ඇති නෝඩ් ගණන දෙගුණ කරන්නේ නම්, උස වැඩි වන්නේ 1 කින් පමණි (ආකලන ප්‍රමාණයක්). ඔබ එය නැවත දෙගුණ කළහොත්, එය තවමත් 1 කින් වැඩි විය. (නිසැකවම මම සිතන්නේ එය සමතුලිතව පවතින බවයි. ඒ ආකාරයෙන්, ගැටළු ප්‍රමාණය වැඩි වන විට ඔබේ කාර්යය දෙගුණ කිරීම වෙනුවට, ඔබ කරන්නේ තරමක් වැඩි වැඩකි. O (log n) ඇල්ගොරිතම නියමයි.


46

ලොග් b (n) යනු කුමක්ද?

1 වන ප්‍රමාණයට ලඟාවීමට පෙර දිග n ලොගයක් සමාන කොටස් වලට නැවත නැවත කපා ගත හැකි වාර ගණන එයයි.


විශිෂ්ට අදහස් දැක්වීම! එය සංක්ෂිප්ත හා හරියටම පිළිතුර මම පසුව ය.
ඩෙනිස්ල්

18

ඇල්ගොරිතම බෙදීම සහ යටත් කර ගැනීම සාමාන්‍යයෙන් lognධාවන වේලාවට සං component ටකයක් වේ. මෙය නැවත නැවතත් ආදානයේ අඩකින් අඩුවීමෙනි.

ද්විමය සෙවීමේදී, ඔබ නැවත නැවත කරන සෑම ආදානයක්ම ආදානයෙන් අඩක් ඉවත දමයි. බිග්-ඕ අංකනයෙහි ලොග් යනු ලොග් බේස් 2 බව සැලකිල්ලට ගත යුතුය.

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


2
එය ලොග් 2 පදනම් වන්නේ ඇයි? සසම්භාවී ක්වික්සෝර්ට් හි, එය පදනම් 2 යැයි මම නොසිතමි. මා දන්නා පරිදි, ලොග් පදනම a (n) = log2 (n) / log2 (a) ලෙස, පදනම වැදගත් නොවේ. නියතයකින් තවත් එකකට වඩා වෙනස් වන අතර නියතයන් විශාල-අංකනයෙන් නොසලකා හරිනු ලැබේ. ඇත්ත වශයෙන්ම, ඔබ නියතයක් ලියන බැවින්, ලොකු-අංකනයක ලොගයක පදනම ලිවීම මගේ මතයේ වැරැද්දකි.
IVlad

1
නැවත "ලොග් යනු ලොග් බේස් 2": stackoverflow.com/questions/1569702/is-big-ologn-log-base-e/…
user200783

එය ඕනෑම පදනමක් බවට පරිවර්තනය කළ හැකි බව ඇත්තකි, නමුත් එය ගැටළුවක් නොවේ, නමුත් ඔබ බිග්-ඕ කාර්ය සාධනය ව්‍යුත්පන්න කිරීමට උත්සාහ කරන්නේ නම් සහ නිරන්තරයෙන් අඩක් අඩුවීමක් ඔබ දකින්නේ නම්, එය කේතයේ පිළිබිඹු වන ලොග් බේස් 10 නොපෙනෙන බව තේරුම් ගැනීමට උපකාරී වේ.
ඩේවිඩ් කනරෙක්

පසෙකට: නෝඩ් 2 ට වඩා වැඩි විදුලි පංකා ප්‍රමාණයක් ඇති (එනම් ද්විමය ගසකට වඩා "පුළුල්"), ඔබ තවමත් ඕ (ලොග්) වර්ධනයක් දකිනු ඇත, මන්ද එය තවමත් බෙදී ඇති අතර -conquer, නමුත් ලොගයේ පදනම විදුලි පංකාවට සම්බන්ධ වේ.
රොජර් ලිප්ස්කොම්බ්

ලොග් 2 හි ඇති වෙනස ඇත්ත වශයෙන්ම බෙහෙවින් උපකාරී විය.
ඩෑන් රොසෙන්ස්ටාර්ක්

15

නමුත් O (log n) යනු කුමක්ද? උදාහරණයක් ලෙස, a> සම්පූර්ණ ද්විමය ගසක උස O (log n) යැයි කීමෙන් අදහස් කරන්නේ කුමක්ද?

'සම්පූර්ණ ද්විමය ගසක උස ලොග් එන්' ලෙස මම මෙය නැවත සඳහන් කරමි. ඔබ පියවරෙන් පියවර පහළට ගමන් කරන්නේ නම් සම්පූර්ණ ද්විමය ගසක උස ගණනය කිරීම O (log n) වේ.

ල ar ු ගණක කාලයක් සහිත ශ්‍රිතයක් හඳුනා ගන්නේ කෙසේදැයි මට තේරුම් ගත නොහැක.

ල ar ු ගණකය යනු on ාතීයකරණයේ ප්‍රතිලෝමයයි. එබැවින්, ඔබේ ශ්‍රිතයේ සෑම 'පියවරක්ම' මුල් අයිතම කට්ටලයෙන් මූලද්‍රව්‍ය සාධකයක් ඉවත් කරන්නේ නම්, එය ල ar ු ගණක කාල ඇල්ගොරිතමයකි.

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


3
"ල ar ු ගණකය යනු on ාතීයකරණයේ ප්‍රතිලෝමයයි" යනුවෙන් සඳහන් කිරීම සඳහා +1.
talonx

12

මෙම අවස්ථා 2 සඳහා O (log n) කාලය ගත වේ

case 1: f(int n) {
      int i;
      for (i = 1; i < n; i=i*2)
        printf("%d", i);
    }


 case 2  : f(int n) {
      int i;
      for (i = n; i>=1 ; i=i/2)
        printf("%d", i);
    }

මට විශ්වාසයි මට යමක් මග හැරී ඇති බව, නමුත් මම සෑම විටම ශුන්‍ය නොවන අතර 0 * 2 = 0 සහ 0/2 = 0 සිට එම අවස්ථා දෙකෙහිම ලූප සදහටම ක්‍රියාත්මක නොවේද?
dj_segfault

2
jdj_segfault, එය මගේ වැරැද්දයි. මම හිතන්නේ දැන් එය තේරුමක් ඇති බව .. :)
රවී බිස්ලා

Av රවිබිස්ලා වෙනත් පිළිතුරු වල දැක්වෙන්නේ 10 ක ආදානය සඳහා ලූප 10 ක් තරම් කාලයක් ගත වන බවත්, 100 ක ආදානය 1 ආදාන කාලය මෙන් 3 ගුණයක් ගත වන බවත්, එම උදාහරණ සම්බන්ධයෙන් එය නිශ්චිතවම නොවේ. stackoverflow.com/a/2307330/1667868
ස්වේන් වැන් ඩෙන් බූගාර්ට්

12

O (log n) ටිකක් නොමඟ යවන සුළුය, වඩාත් නිවැරදිව එය O (ලොග් 2 n), එනම් (පාදම 2 සමඟ ල ar ු ගණකය).

සමබර ද්විමය ගස උස O (ලොග් වන 2 සෑම node එකක් මතම ඊට අදාල දෙකක් (ලඝු-සටහන තුල ලෙස "දෙක" කරුණාවෙන් කර ඇති බැවින්, n) 2 n) ළමා ගැටිති. ඉතින්, n නෝඩ් සහිත ගසක ලොග් 2 n ක උසකින් යුක්ත වේ .

තවත් උදාහරණයක් වන්නේ ද්විමය සෙවීමයි, එය O (ලොග් 2 n) ධාවන කාලයක් ඇති බැවින් සෑම පියවරකදීම ඔබ සෙවුම් අවකාශය 2 න් බෙදයි.


4
O (log n) යනු O (ld n) හෝ O (LN n) හා සමාන අනුපිළිවෙලකි. ඒවා සමානුපාතික වේ. ඉගෙනීමේ අරමුණු සඳහා ld භාවිතා කිරීම පහසු බව මම තේරුම් ගතිමි.
හීලියස්

4
"වඩාත් නිවැරදිව එය O (ld n)" - නැත, එසේ නොවේ: සියලුම ල logs ු-සටහන් එකම අනුපිළිවෙලකි (සෑම එකක්ම අනෙක් ඒවාට වඩා වෙනස් වන්නේ කිසියම් නිරන්තර පරිමාණ සාධකයකින් පමණි, එය නොසලකා හරිනු ලැබේ / නොසලකා හරිනු ලැබේ).
ක්‍රිස්ඩබ්

1
ඔයා හරි ක්‍රිස්, හරිම නරක වචන. හීලියෝස් කළාක් මෙන් එය පැවසිය යුතුය. එය ඉගෙනීමට / අවබෝධ කර ගැනීමට උපකාරී වන නමුත් අවසානයේ සියලුම ල logs ු-සටහන් එකම අනුපිළිවෙලකි.
stmax

10

O(log n) ල ar ු ගණකයට සමානුපාතිකව කාල පරාසයක් තුළ ක්‍රියා කරන ශ්‍රිතයක් (හෝ ඇල්ගොරිතම හෝ ඇල්ගොරිතමයේ පියවරක්) (සාමාන්‍යයෙන් බොහෝ අවස්ථාවන්හි 2 වන පදනම, නමුත් සෑම විටම නොවේ, සහ ඕනෑම අවස්ථාවක මෙය විශාල-ඕ අංකනයෙන් වැදගත් නොවේ *) ආදානයේ ප්‍රමාණයෙන්.

ල ar ු ගණක ශ්‍රිතය යනු on ාතීය ශ්‍රිතයේ ප්‍රතිලෝම වේ. ඔබේ ආදානය on ාතීය ලෙස වර්ධනය වන්නේ නම් (ඔබ සාමාන්‍යයෙන් සලකන ආකාරයට රේඛීයව නොව), ඔබේ ක්‍රියාකාරිත්වය රේඛීයව වර්ධනය වේ.

O(log n)ඕනෑම ආකාරයක බෙදීම් සහ යටත් කර ගැනීමේ යෙදුමක ධාවන වේලාවන් ඉතා සුලභ ය, මන්ද ඔබ සෑම විටම වැඩ අඩකින් කපා හරින බැවිනි. එක් එක් කොට් in ාශයේ හෝ ජය ගැනීමේ පියවරේදී, ඔබ කරන්නේ නිරන්තර කාල වැඩ (හෝ නියත-කාලීන නොවන, නමුත් කාලය වඩා සෙමින් වැඩෙන කාලය සමඟ O(log n)) නම්, එවිට ඔබේ සම්පූර්ණ කාර්යය වේ O(log n). සෑම පියවරකටම ආදානය සඳහා රේඛීය කාලය අවශ්‍ය වීම සාමාන්‍ය දෙයකි; මෙය මුළු කාල සංකීර්ණතාවයට සමාන O(n log n)වේ.

ද්විමය සෙවුමේ ධාවන කාල සංකීර්ණතාව ඊට නිදසුනකි O(log n). මෙයට හේතුව ද්විමය සෙවීමේදී, ඔබ සෑම විටම පසුකාලීන පියවරේදී ඔබේ ආදානයෙන් අඩක් නොසලකා හරිමින් අරාව අඩකින් බෙදමින් එක් එක් පියවර සමඟ එක් අඩක් කෙරෙහි පමණක් අවධානය යොමු කිරීමයි. සෑම පියවරක්ම නියත-වේලාවකි, මන්ද ද්විමය සෙවුමේදී ඔබට අවශ්‍ය වන්නේ එක් අංගයක් ඔබේ යතුර සමඟ සංසන්දනය කිරීම පමණි. එබැවින් ඔබ දළ වශයෙන් ලොග් (n) / ලොග් (2) පියවරයන් කරයි.

ඒකාබද්ධ කිරීමේ වර්ග කිරීමේ ධාවන කාල සංකීර්ණතාව ඊට නිදසුනකි O(n log n). මෙයට හේතුව ඔබ එක් එක් පියවර සමඟ අරාව අඩකින් බෙදීමයි, එහි ප්‍රති ing ලයක් වශයෙන් දළ වශයෙන් ලොග් (එන්) / ලොග් (2) පියවරයන් ලැබේ. කෙසේ වෙතත්, සෑම පියවරකදීම ඔබ සියලු මූලද්‍රව්‍යයන් මත ඒකාබද්ධ කිරීමේ මෙහෙයුම් සිදු කළ යුතුය (එය n / 2 මූලද්‍රව්‍යවල උප ලැයිස්තු දෙකක් මත එක් කිරීමේ මෙහෙයුමක් වේවා, හෝ n / 4 මූලද්‍රව්‍යවල උප ලැයිස්තු හතරක් මත ඒකාබද්ධ කිරීමේ මෙහෙයුම් දෙකක් වේවා, එය අදාල නොවේ. සෑම පියවරකදීම මූලද්‍රව්‍ය n සඳහා මෙය කරන්න). මේ අනුව, සම්පූර්ණ සංකීර්ණතාව වේ O(n log n).

බිග්-ඕ අංකනය අර්ථ දැක්වීම අනුව නියතයන් වැදගත් නොවන බව මතක තබා ගන්න . ද විසින් පදනම පාලනය වෙනස් ලඝු ගණක සඳහා, විවිධ කඳවුරු ලඝු ගණක අතර එකම වෙනස නියත සාධකයක් වේ.


අවසාන * සටහන ල ar ු ගණක 2 හෝ 10 මත පදනම් වීම පිළිබඳ මගේ ව්‍යාකූලත්වය විසඳීය :) බොහෝම ස්තූතියි.
යායා

9

සරලවම අදහස් කරන්නේ මෙම කාර්යය සඳහා අවශ්‍ය කාලය ලොග් (n) සමඟ වර්ධනය වන බවයි (උදාහරණ: n = 10 සඳහා 2s, n = 100 සඳහා 4s, ...). වැඩි නිරවද්‍යතාවයක් සඳහා ද්විමය සෙවුම් ඇල්ගොරිතම සහ බිග් ඕ අංකනය පිළිබඳ විකිපීඩියා ලිපි කියවන්න .


9

සරලව කිවහොත්: ඔබේ ඇල්ගොරිතමයේ සෑම පියවරකදීම ඔබට කාර්යය අඩකින් කපා ගත හැකිය. (අසමමිතික ලෙස තුන්වන, හතරවන, ...) ට සමාන වේ


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

8

ඔබ චිත්‍රක කැල්කියුලේටරයක් ​​හෝ ඊට සමාන දෙයක් මත ල ar ු ගණක ශ්‍රිතයක් සැලසුම් කරන්නේ නම්, එය සැබවින්ම සෙමින් ඉහළ යන බව ඔබට පෙනෙනු ඇත - රේඛීය ශ්‍රිතයකට වඩා සෙමින්.

ල ar ු ගණක කාල සංකීර්ණත්වයක් සහිත ඇල්ගොරිතම ඉහළ ඉල්ලුමක් ඇත්තේ මේ නිසාය: සැබවින්ම විශාල n සඳහා වුවද (උදාහරණයක් ලෙස n = 10 ^ 8 යැයි කියමු), ඒවා පිළිගත හැකි ප්‍රමාණයට වඩා ක්‍රියා කරයි.


7

නමුත් හරියටම O (log n) යනු කුමක්ද?

එහි අර්ථය කුමක් ද හරියටම "ලෙස වේ nදෙසට යොමු විය infinity, එම timeදෙසට යොමු විය a*log(n)එහිදී aනියත නීර්ණය කිරීමද සාධකයක්".

හෝ ඇත්ත වශයෙන්ම, එය එතරම් අර්ථවත් නොවේ; වැඩි වීමට ඉඩ ඇත්තේ එය "වැනි දෙයක් අදහස් timeබෙදීම a*log(n)දෙසට යොමු විය 1."

"සෞඛ්යයට දෙසට" 'විශ්ලේෂණය' සිට සුපුරුදු ගණිතමය අර්ථයක් ඇත: "ඔබ තෝරාගන්න නම්, උදාහරණයක් ලෙස ඕනෑම අත්තනෝමතික කුඩා නොවන ශුන්ය නිරන්තර k, එවිට මම අනුරූප අගය සොයා ගත හැකි Xබව එම ((time/(a*log(n))) - 1)කට වඩා අඩු kසියලු වටිනාකම් සඳහා nවඩා වැඩි X."


ගිහි අර්ථයෙන් ගත් කල, එයින් අදහස් වන්නේ කාලය සඳහා සමීකරණයට වෙනත් සංරචක තිබිය හැකි බවයි: උදා: එයට නියත ආරම්භක වේලාවක් තිබිය හැකිය; නමුත් මෙම අනෙකුත් සංරචක n හි විශාල අගයන් සඳහා නොවැදගත් දෙසට සුදුමැලි වන අතර * n (n) යනු විශාල n සඳහා ප්‍රමුඛතම යෙදුමයි.

සමීකරණය නම්, උදාහරණයක් ලෙස ...

time (n) = a + b log (n) + c n + d n n

... එවිට මෙය O (n වර්ග) වනු ඇත, මන්ද, a, b, c, සහ ශුන්‍ය නොවන d යන නියතයන්ගේ අගයන් කුමක් වුවත්, මෙම d*n*nපදය සෑම විටම n හි ප්‍රමාණවත් තරම් විශාල අගයක් සඳහා අනෙක් ඒවාට වඩා ආධිපත්‍යය දරයි.

බිට් ඕ අංකනය යනු එයයි: එහි තේරුම “ප්‍රමාණවත් තරම් විශාල n සඳහා ආධිපත්‍ය පදයෙහි අනුපිළිවෙල කුමක්ද” යන්නයි.



7

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

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

මම පෙන්වා දිය යුත්තේ, අප මෙහි කතා කරන්නේ සාපේක්ෂ භාග සීමාවක් ගැන මිස නිරපේක්ෂ නොවන බවයි. ද්විමය සෙවීම සම්භාව්‍ය නිදසුනකි. සෑම පියවරකදීම අපි ගැටළු සහිත අවකාශයෙන් 1/2 ක් ඉවත දමමු. නමුත් ද්විමය සෙවීම පමණක් එවැනි උදාහරණයක් නොවේ. ඔබ කෙසේ හෝ ඔප්පු කළා යැයි සිතමු, සෑම පියවරකදීම ඔබ අවම වශයෙන් 1/128 ක්වත් ගැටළු සහිත ඉඩ ඉවත දමයි. එයින් අදහස් වන්නේ ද්විමය සෙවුමට වඩා සැලකිය යුතු ලෙස මන්දගාමී වුවද ඔබේ වැඩසටහන තවමත් O (logN) වේලාවේ ක්‍රියාත්මක වන බවයි. පුනරාවර්තන ඇල්ගොරිතම විශ්ලේෂණය කිරීමේදී මෙය ඉතා හොඳ ඉඟියක් වේ. සෑම පියවරකදීම පුනරාවර්තනය ප්‍රභේද කිහිපයක් භාවිතා නොකරන බව බොහෝ විට ඔප්පු කළ හැකි අතර, මෙය ගැටළු සහිත අවකාශයේ යම් භාගයක් කපා හැරීමට තුඩු දෙයි.


6

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

ඒ කියන්නේ පුඩුවේ පියවර on ාතීය ලෙස වර්ධනය වන බවයි. උදා

for (i=1; i<=n; i=i*2) {;}

මෙම වැඩසටහනේ O- අංකනයේ සංකීර්ණතාව O (ලොග් (n)) වේ. අපි අතින් එය හරහා ලූප් කිරීමට උත්සාහ කරමු (n 512 ත් 1023 ත් අතර කොහේ හරි සිටීම (1024 හැර):

step: 1   2   3   4   5    6    7    8     9     10
   i: 1   2   4   8   16   32   64   128   256   512

N 512 ත් 1023 ත් අතර කොතැනක හෝ පැවතුනද, නැවත සිදු වන්නේ 10 ක් පමණි. මෙයට හේතුව, ලූපයේ පියවර on ාතීය ලෙස වර්ධනය වන අතර එමඟින් අවසානය කරා ළඟා වීමට ගත වන්නේ පුනරාවර්තන 10 ක් පමණි.

X හි ල ar ු ගණකය (a හි පාදයට) යනු ^ x හි ප්‍රතිලෝම ශ්‍රිතයයි.

ල ar ු ගණකය යනු on ාතීයයේ ප්‍රතිලෝම බව පැවසීම වැනිය.

දැන් එය ඒ ආකාරයෙන් බැලීමට උත්සාහ කරන්න, on ාතීය වේගයෙන් වර්ධනය වුවහොත් ල ar ු ගණකය ඉතා සෙමින් වර්ධනය වේ (ප්‍රතිලෝමව).

O (n) සහ O (ලොග් (n)) අතර වෙනස අති විශාලය, O (n) සහ O (a ^ n) (නියතයක් වීම) අතර වෙනස හා සමාන වේ.


6

ඇත්ත වශයෙන්ම, ඔබට මූලද්‍රව්‍ය n ලැයිස්තුවක් තිබේ නම් සහ එම ලැයිස්තුවෙන් ද්විමය ගසක් සාදන්න (බෙදීම හා යටත් කර ගැනීමේ ඇල්ගොරිතම වැනි), ඔබ 1 ප්‍රමාණයේ (කොළ) ලැයිස්තුවට ළඟා වන තෙක් 2 න් බෙදනු ඇත.

පළමු පියවරේදී, ඔබ 2 න් බෙදයි. එවිට ඔබට ලැයිස්තු 2 ක් ඇත (2 ^ 1), ඔබ එක් එක් 2 න් බෙදයි, එබැවින් ඔබට ලැයිස්තු 4 ක් ඇත (2 ^ 2), ඔබ නැවත බෙදන්න, ඔබට ලැයිස්තු 8 ක් ඇත (2 ^ 3) ) සහ ඔබේ ලැයිස්තු ප්‍රමාණය 1 වන තෙක් එසේ කරන්න

එය ඔබට සමීකරණය ලබා දෙයි:

n/(2^steps)=1 <=> n=2^steps <=> lg(n)=steps

(ඔබ එක් එක් පැත්තේ lg ගන්න, lg ලොග් පදනම 2 වේ)


2
සමහර අනිෂ්ට මෘදුකාංග කොළ නෝඩ් වලට පෙර මට්ටම් දෙකකින් x දිග සහිත නව ලැයිස්තුවක් ඇතුළත් කිරීමට පටන් ගන්නා තුරු. එවිට එය අසීමිත පුඩුවක් ලෙස පෙනෙනු ඇත ...
ෆ්‍රැන්සිස් කූග්ලර්

1
මට ඔබේ අදහස ලැබුනේ නැත. මගේ පැහැදිලි කිරීම වැරදිද?
ඩිනයිස්

1
මම කළේ උපකල්පිත විහිළුවක් පමණි. මම එයින් කිසිම දෙයක් අදහස් කළේ නැහැ.
ෆ්‍රැන්සිස් කූග්ලර්

6

අපි ඇල්ගොරිතමයක් හෝ කේතයක් ලියන සෑම අවස්ථාවකම එහි අසමමිතික සංකීර්ණතාව විශ්ලේෂණය කිරීමට උත්සාහ කරමු. එය එහි කාල සංකීර්ණත්වයට වඩා වෙනස් ය .

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

කාලය සංකීර්ණත්වය විවිධ පරාමිතීන් මත රඳා පවතින බැවිනි.
1. භෞතික පද්ධතිය
2. ක්‍රමලේඛන භාෂාව
3. කේතකරණ විලාසය
4. සහ තවත් බොහෝ දේ ......

සත්‍ය ක්‍රියාත්මක කිරීමේ කාලය විශ්ලේෂණය සඳහා හොඳ මිනුමක් නොවේ.


කේතය කුමක් වුවත් ආදානය සමාන බැවින් අපි ආදාන ප්‍රමාණය පරාමිතිය ලෙස ගනිමු. එබැවින් ක්‍රියාත්මක කිරීමේ කාලය ආදාන ප්‍රමාණයේ ශ්‍රිතයකි.

පහත දැක්වෙන්නේ රේඛීය කාල ඇල්ගොරිතමයේ උදාහරණයකි


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

එය සෙවීම පමණක් නොව, කාර්යය කුමක් වුවත් (වර්ධක, සංසන්දනය හෝ ඕනෑම මෙහෙයුමක්) එහි ආදාන ප්‍රමාණයේ ශ්‍රිතයකි.

එබැවින් ඔබ ඕනෑම ඇල්ගොරිතමයක් O (log n) යැයි පැවසූ විට එයින් අදහස් වන්නේ ක්‍රියාත්මක කිරීමේ කාලය ආදාන ප්‍රමාණය n ට වඩා ලොග් වාරයක් බවයි.

ආදාන ප්‍රමාණය වැඩි වන විට සිදු කරන ලද වැඩ වැඩි වේ (මෙහි ක්‍රියාත්මක කිරීමේ කාලය) වැඩි වේ (එබැවින් සමානුපාතිකතාව)

      n      Work
      2     1 units of work
      4     2 units of work
      8     3 units of work

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


5

ගස

log x to base b = y යනු ප්‍රතිලෝම වේ b^y = x

ඔබට ගැඹුර d හා ප්‍රමාණයේ m- ඇරි ගසක් තිබේ නම්, එසේ නම්:

  • මුළු ගස හරහා ගමන් කිරීම ~ O (M ^ d) = O (n)

  • ගසෙහි තනි මාවතක ගමන් කිරීම ~ O (d) = O (ලොග් n සිට පාදම M දක්වා)


5

තොරතුරු තාක්ෂණයේ එය අදහස් කරන්නේ:

  f(n)=O(g(n)) If there is suitable constant C and N0 independent on N, 
  such that
  for all N>N0  "C*g(n) > f(n) > 0" is true.

කුහුඹුවා මෙම අංකනය බොහෝ දුරට ගණිතයෙන් ගත් බව පෙනේ.

මෙම ලිපියේ උපුටා දැක්වීමක් ඇත: ඩී නුත්, "බිග් ඔමිකොන් සහ බිග් ඔමේගා සහ බිග් තීටා", 1976 :

මෙහි සාකච්ඡා කර ඇති කරුණු පදනම් කරගෙන, SIGACT හි සාමාජිකයින් සහ පරිගණක විද්‍යා හා ගණිත සඟරාවල සංස්කාරකවරුන් ඉහත අර්ථ දක්වා ඇති පරිදි අංක භාවිතා කළ යුතු යැයි මම යෝජනා කරමි .

අද 2016, නමුත් අපි අදටත් එය භාවිතා කරමු.


ගණිතමය විශ්ලේෂණයේ දී එයින් අදහස් වන්නේ:

  lim (f(n)/g(n))=Constant; where n goes to +infinity

නමුත් ගණිතමය විශ්ලේෂණයේ දී පවා මෙම සංකේතය "C * g (n)> f (n)> 0" යන අර්ථයෙන් භාවිතා කර ඇත.

විශ්ව විද්‍යාලයෙන් මා දන්නා පරිදි මෙම සංකේතය ජර්මානු ගණිත ian ලන්ඩෝ (1877-1938) විසින් හඳුන්වා දෙන ලදී.


4

සම්පූර්ණ ද්විමය උදාහරණය O (ln n) නිසා සෙවීම මේ ආකාරයට පෙනේ:

1 2 3 4 5 6 7 8 9 10 11 12

4 ක් සෙවීමෙන් පහර 3 ක්: 6, 3 සහ 4. සහ ලොග් 2 12 = 3, අවශ්‍ය අවස්ථාවන්හිදී පහර කීයක් තිබේද යන්නට හොඳ තක්සේරුවකි.


උදාහරණයක් ලෙස ස්තූතියි. අපගේ ඇල්ගොරිතමයට ල ar ු ගණක කාලය බෙදීම් සහ ජය ගැනීමේ ක්‍රමයේදී භාවිතා කළ හැකි ආකාරය එය පැහැදිලිව පවසයි.
Abc

ඉතින් එහි n / 2 පුඩුවක් නම් එය සැමවිටම ලොග් (n) ද?
ගිල් බෙයිරුත්

3

ඔබ ප්‍රතිභානය පදනම් කරගත් පිළිතුරක් සොයන්නේ නම් මම ඔබ වෙනුවෙන් අර්ථකථන දෙකක් ඉදිරිපත් කිරීමට කැමැත්තෙමි.

  1. ඉතා පුළුල් කඳවුරක් සහිත ඉතා උස් කන්දක් ගැන සිතන්න. කඳු මුදුනට ලඟාවීමට ක්‍රම දෙකක් තිබේ: එකක් කඳු මුදුන වටා සර්පිලාකාරව ගමන් කරන විශේෂිත මාවතකි, අනෙක: පඩිපෙළක් සැපයීම සඳහා කැපූ කැටයම් වැනි කුඩා ටෙරස්. දැන් පළමු මාර්ගය රේඛීය වේලාවට O (n) කරා ළඟා වන්නේ නම්, දෙවැන්න O (log n) වේ.

  2. ඇල්ගොරිතමයක් සිතන්න, එය nආදාන ලෙස පිළිගෙන කාලයට සමානුපාතිකව nඑය O (n) හෝ තීටා (n) වේ. නමුත් එය කාලානුරූපව ක්‍රියාත්මක වන්නේ number of digits or the number of bits in the binary representation on numberනම් ඇල්ගොරිතම O (log n) හෝ theta හි ක්‍රියාත්මක වේ. (ලොග් n) කාලය.


කරුණාකර සංස්කරණය කරන්න. මෙම අවස්ථා දෙකෙහිම "ඕ (එන්) හෝ තීටා (එන්)" තිබේද ...? එසේම, මම මෙය බොහෝ දේ අසා ඇත්තෙමි, ප්‍රමාණයට එදිරිව # ඉලක්කම්. අපි කියන්නේ n = 10000000 සඳහා ප්‍රමාණය === 128 සහ ඉලක්කම් === 8 n = 10000000 සඳහාද? කරුණාකර පැහැදිලි කරන්න.
කෝඩි

2

බෙදීම් සහ ජය ගැනීමේ පරමාදර්ශයේ ඇල්ගොරිතම සංකීර්ණ O (ලොග්) වේ. මෙහි එක් උදාහරණයක්, ඔබේ බල ක්‍රියාකාරිත්වය ගණනය කරන්න,

int power(int x, unsigned int y)
{
    int temp;
    if( y == 0)
        return 1;
    temp = power(x, y/2);
    if (y%2 == 0)
        return temp*temp;
    else
        return x*temp*temp;
}

http://www.geeksforgeeks.org/write-ac-program-to-calulate-powxn/ වෙතින්

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.