මම කැමතියි හැකි තරම් විධිමත් අර්ථ දැක්වීමක් සහ සරල ගණිතයකට.
මම කැමතියි හැකි තරම් විධිමත් අර්ථ දැක්වීමක් සහ සරල ගණිතයකට.
Answers:
ඉක්මන් සටහන, මෙය නිසැකවම පාහේ බීටා ඕ අංකනය (එය ඉහළ මායිමකි) තීටා අංකනය "Θ" (එය දෙපැත්තකින් බැඳී ඇත) සමඟ ව්යාකූල කරයි. මගේ අත්දැකීම් අනුව, මෙය ඇත්ත වශයෙන්ම ශාස්ත්රීය නොවන සැකසුම් වල සාකච්ඡා වලට සමානය. කිසියම් ව්යාකූලතාවයක් සඳහා සමාව අයදිමි.
මෙම ප්රස්ථාරය සමඟ බිග් ඕ සංකීර්ණතාව දෘශ්යමාන කළ හැකිය:
බිග්-ඕ අංකනය සඳහා මට දිය හැකි සරලම අර්ථ දැක්වීම මෙයයි:
බිග්-ඕ අංකනය යනු ඇල්ගොරිතමයක සංකීර්ණතාවයේ සාපේක්ෂ නිරූපණයකි.
එම වාක්යයේ වැදගත් සහ හිතාමතාම තෝරාගත් වචන කිහිපයක් තිබේ:
- සාපේක්ෂ: ඔබට ඇපල් හා සැසඳිය හැක්කේ ඇපල් සමඟ පමණි. අංක ගණිත ගුණ කිරීම සඳහා ඔබට ඇල්ගොරිතමයක් සංසන්දනය කළ නොහැක. නමුත් ගණිතමය මෙහෙයුම් සිදු කිරීම සඳහා ඇල්ගොරිතම දෙකක් සංසන්දනය කිරීමෙන් (එක් ගුණ කිරීම, එක් එකතු කිරීමක්) ඔබට අර්ථවත් යමක් කියනු ඇත;
- නිරූපණය: බිග්-ඕ (එහි සරලම ස්වරූපයෙන්) ඇල්ගොරිතම අතර සංසන්දනය තනි විචල්යයකට අඩු කරයි. නිරීක්ෂණ හෝ උපකල්පන මත පදනම්ව එම විචල්යය තෝරා ගනු ලැබේ. උදාහරණයක් ලෙස, වර්ග කිරීමේ ඇල්ගොරිතම සංසන්දනය කිරීමේ මෙහෙයුම් මත පදනම්ව සැසඳේ (ඒවායේ සාපේක්ෂ අනුපිළිවෙල තීරණය කිරීම සඳහා නෝඩ් දෙකක් සංසන්දනය කිරීම). සංසන්දනය මිල අධික යැයි මෙය උපකල්පනය කරයි. නමුත් සංසන්දනය ලාභදායී නමුත් හුවමාරු කිරීම මිල අධික නම් කුමක් කළ යුතුද? එය සංසන්දනය වෙනස් කරයි; හා
- සංකීර්ණතාව: මූලද්රව්ය 10,000 ක් වර්ග කිරීමට මට තත්පරයක් ගත වුවහොත්, මිලියනයක් වර්ග කිරීමට මට කොපමණ කාලයක් ගතවේද? මෙම අවස්ථාවෙහි ඇති සංකීර්ණතාව වෙනත් දෙයකට සාපේක්ෂ මිනුමකි.
ඔබ නැවත කියවා ඉතිරි දේ කියවූ පසු නැවත කියවන්න.
මට සිතිය හැකි බිග්-ඕ සඳහා හොඳම උදාහරණය ගණිතය කිරීමයි. අංක දෙකක් ගන්න (123456 සහ 789012). පාසැලේදී අප ඉගෙන ගත් මූලික ගණිතමය මෙහෙයුම්:
- ඊට අමතරව;
- අඩු කිරීම;
- ගුණ කිරීම; හා
- අංශයේ.
මේ සෑම දෙයක්ම මෙහෙයුමක් හෝ ගැටළුවක්. මේවා විසඳීමේ ක්රමයක් ඇල්ගොරිතම ලෙස හැඳින්වේ .
එකතු කිරීම සරලම වේ. ඔබ සංඛ්යා රේඛා කරන්න (දකුණට) සහ තීරුවේ ඉලක්කම් එකතු කරන්න. එම සංඛ්යාවේ 'දස දහස්' කොටස ඊළඟ තීරුවට ගෙන යනු ලැබේ.
මෙම සංඛ්යා එකතු කිරීම මෙම ඇල්ගොරිතමයේ වඩාත්ම මිල අධික මෙහෙයුම යැයි උපකල්පනය කරමු. මෙම සංඛ්යා දෙක එකට එකතු කිරීම සඳහා අපට ඉලක්කම් 6 ක් එකතු කළ යුතුය (සහ සමහර විට 7 වන කොටස රැගෙන යා හැකිය). අපි ඉලක්කම් 100 ක් එකට එකතු කළහොත් එකතු කිරීම් 100 ක් කළ යුතුයි. අපි එකතු නම් දෙකක් 10,000 දෙකේ සංඛ්යා අපි එකතු 10,000 කරන්න වෙනව.
රටාව බලන්න? මෙම සංකීර්ණ (මෙහෙයුම් සංඛ්යාව වීම) ඉලක්කම් සංඛ්යාව අනුලෝම ව සමානුපාතික වේ n විශාල සංඛ්යාව. අපි මෙය O (n) හෝ රේඛීය සංකීර්ණතාව ලෙස හඳුන්වමු .
අඩු කිරීම සමාන වේ (රැගෙන යාම වෙනුවට ඔබට ණය ගැනීමට අවශ්ය විය හැකිය හැර).
ගුණ කිරීම වෙනස් වේ. ඔබ ඉලක්කම් පෙළගස්වන්න, පහළ අංකයේ පළමු ඉලක්කම් ගෙන ඉහළ අංකයේ එක් එක් ඉලක්කම් වලට සාපේක්ෂව එය ගුණ කරන්න. එබැවින් අපගේ ඉලක්කම් 6 න් ගුණ කිරීම සඳහා අපි ගුණ කිරීම් 36 ක් කළ යුතුය. අවසාන ප්රති result ලය ලබා ගැනීම සඳහා තීරු 10 ක් හෝ 11 ක් එකතු කිරීමට අපට අවශ්ය විය හැකිය.
අපට ඉලක්කම් 100 ක අංක දෙකක් තිබේ නම්, අපි ගුණ කිරීම් 10,000 ක් සහ එකතු කිරීම් 200 ක් කළ යුතුය. ඉලක්කම් මිලියනයක සංඛ්යා දෙකක් සඳහා අප කළ යුත්තේ ට්රිලියන 1 (10 12 ) ගුණ කිරීම සහ මිලියන දෙකක් එකතු කිරීමයි.
ඇල්ගොරිතම n- වර්ග සහිත පරිමාණයන් ලෙස , මෙය O (n 2 ) හෝ චතුරස්රාකාර සංකීර්ණතාවයකි . තවත් වැදගත් සංකල්පයක් හඳුන්වා දීමට මෙය හොඳ කාලයකි:
අපි සැලකිලිමත් වන්නේ සංකීර්ණතාවයේ වඩාත්ම වැදගත් කොටස ගැන පමණි.
මෙහෙයුම් ගණන අපට ප්රකාශ කළ හැකි බව නුවණැත්තෝ තේරුම් ගෙන ඇත: n 2 + 2n. නමුත් අපගේ උදාහරණයෙන් ඔබ ඉලක්කම් මිලියනයක ඉලක්කම් දෙකකින් දුටු පරිදි, දෙවන පදය (2n) වැදගත් නොවේ (එම අදියර අනුව සමස්ත මෙහෙයුම් වලින් 0.0002% ක් පමණ වේ).
අප මෙහි ඇති නරකම අවස්ථාව උපකල්පනය කර ඇති බව කෙනෙකුට පෙනේ. ඉලක්කම් 6 න් ගුණ කරන අතර, ඒවායින් එකකට ඉලක්කම් 4 ක් සහ අනෙකට ඉලක්කම් 6 ක් තිබේ නම්, අපට ඇත්තේ ගුණ කිරීම් 24 ක් පමණි. කෙසේ වෙතත්, අපි ගණනය කරන්නේ එම 'n' සඳහා වන නරකම අවස්ථාව, එනම් දෙකම ඉලක්කම් 6 ක් වන විට ය. එබැවින් බිග්-ඕ අංකනය යනු ඇල්ගොරිතමයක නරකම අවස්ථාවයි.
මට සිතිය හැකි ඊළඟ හොඳම උදාහරණය සාමාන්යයෙන් ධවල පිටු හෝ ඊට සමාන දුරකථන පොතක් වන නමුත් එය රටින් රටට වෙනස් වේ. නමුත් මම කතා කරන්නේ වාසගම සහ පසුව මුලකුරු හෝ මුල් නම, සමහරවිට ලිපිනය සහ දුරකථන අංක අනුව මිනිසුන් ලැයිස්තුගත කරන එක ගැන ය.
දැන් ඔබ 1,000,000 ක් අඩංගු දුරකථන පොතක "ජෝන් ස්මිත්" සඳහා දුරකථන අංකය සොයා බැලීමට පරිගණකයකට උපදෙස් දුන්නේ නම්, ඔබ කරන්නේ කුමක්ද? එස් ආරම්භයේදී ඔබට කොපමණ දුරක් අනුමාන කළ හැකිද යන කාරණය නොසලකා හැරීම (ඔබට නොහැකි යැයි උපකල්පනය කරමු), ඔබ කරන්නේ කුමක්ද?
වූ සාමාන්ය ක්රියාත්මක කිරීම, මැද දක්වා විවෘත වූ 500,000 ගත විය හැකි වන අතර "ස්මිත්" එය සංසන්දනය කරන්න. එය "ස්මිත්, ජෝන්" බවට පත්වුවහොත්, අපි ඇත්තටම වාසනාවන්තයි. බොහෝ දුරට ඉඩ ඇත්තේ "ජෝන් ස්මිත්" එම නමට පෙර හෝ පසුව වීමයි. එය අප පසුව නම් දුරකථන පොතේ අවසාන භාගය අඩකින් බෙදන්න. එය ඊට පෙර නම් අපි දුරකථන පොතේ පළමු භාගය අඩකින් බෙදා නැවත කියමු. සහ යනාදි.
මෙය ද්විමය සෙවුමක් ලෙස හැඳින්වෙන අතර ඔබ එය වටහා ගත්තත් නැතත් වැඩසටහන්කරණයේ සෑම දිනකම භාවිතා වේ.
එබැවින් ඔබට මිලියනයක දුරකථන පොතක නමක් සොයා ගැනීමට අවශ්ය නම් මෙය ඇත්ත වශයෙන්ම 20 වතාවක් කිරීමෙන් ඔබට ඕනෑම නමක් සොයාගත හැකිය. සෙවුම් ඇල්ගොරිතම සංසන්දනය කිරීමේදී මෙම සංසන්දනය අපගේ 'n' බව අපි තීරණය කරමු.
- නම් 3 කින් යුත් දුරකථන පොතක් සඳහා සැසඳීම් 2 ක් අවශ්ය වේ (බොහෝ දුරට).
- 7 සඳහා එය උපරිම 3 ක් ගනී.
- 15 සඳහා එය 4 ක් ගනී.
- …
- 1,000,000 සඳහා 20 ක් ගතවේ.
එය පුදුම සහගතය, එසේ නොවේ ද?
බිග්-ඕ අර්ථයෙන් මෙය ඕ (ලොග් එන්) හෝ ල ar ු ගණක සංකීර්ණතාවයි . දැන් ඇති ල ar ු ගණකය ln (base e), log 10 , log 2 හෝ වෙනත් පදනමක් විය හැකිය. O (2n 2 ) සහ O (100n 2 ) යන දෙකම තවමත් O (n 2 ) මෙන් එය තවමත් O (log n ) වේ.
ඇල්ගොරිතමයක් සමඟ අවස්ථා තුනක් තීරණය කිරීම සඳහා බිග් ඕ භාවිතා කළ හැකි බව පැහැදිලි කිරීම මේ අවස්ථාවේ දී වටී:
- හොඳම අවස්ථාව: දුරකථන පොත් සෙවීමේදී හොඳම අවස්ථාව නම් එක් සංසන්දනයකින් නම සොයා ගැනීමයි. මෙය O (1) හෝ නියත සංකීර්ණතාවයි ;
- අපේක්ෂිත නඩුව: ඉහත සාකච්ඡා කළ පරිදි ඕ (ලොග් එන්); හා
- නරකම අවස්ථාව: මෙයද O (log n) වේ.
සාමාන්යයෙන් අපි හොඳම අවස්ථාව ගැන තැකීමක් නොකරමු. අපේක්ෂිත හා නරකම අවස්ථාව ගැන අපි උනන්දු වෙමු. සමහර විට මේවායින් එකක් හෝ වෙනත් එකක් වඩා වැදගත් වනු ඇත.
දුරකථන පොත වෙත ආපසු යන්න.
ඔබට දුරකථන අංකයක් තිබේ නම් සහ නමක් සොයා ගැනීමට අවශ්ය නම් කුමක් කළ යුතුද? පොලිසියට ප්රතිලෝම දුරකථන පොතක් ඇති නමුත් එවැනි සොයා බැලීම් සාමාන්ය ජනතාවට ප්රතික්ෂේප කරනු ලැබේ. නැත්නම් ඒවාද? තාක්ෂණික වශයෙන් ඔබට සාමාන්ය දුරකථන පොතක අංකයක් ආපසු හැරවිය හැකිය. කොහොමද?
ඔබ පළමු නමෙන් ආරම්භ කර අංකය සංසන්දනය කරන්න. එය තරඟයක් නම්, නියමයි, එසේ නොවේ නම්, ඔබ ඊළඟට යන්න. දුරකථන පොත ඇණවුම් කර නොමැති නිසා (කෙසේ වෙතත් දුරකථන අංකයෙන්) ඔබ එය එසේ කළ යුතුය.
එබැවින් දුරකථන අංකය ලබා දී ඇති නමක් සොයා ගැනීමට (ආපසු හැරවීම):
- හොඳම නඩුව: ඕ (1);
- අපේක්ෂිත නඩුව: ඕ (එන්) (500,000 සඳහා); හා
- නරකම අවස්ථාව: ඕ (එන්) (1,000,000 සඳහා).
මෙය පරිගණක විද්යාවේ තරමක් ප්රසිද්ධ ගැටළුවක් වන අතර එය සඳහන් කිරීම සුදුසුය. මෙම ගැටලුවේදී ඔබට නගර තිබේ. එම සෑම නගරයක්ම වෙනත් නගර 1 ක් හෝ වැඩි ගණනකට නිශ්චිත දුරක් මාර්ගයකින් සම්බන්ධ කර ඇත. සංචාරක විකුණුම්කරුගේ ගැටළුව වන්නේ සෑම නගරයකටම යන කෙටිම සංචාරය සොයා ගැනීමයි.
සරලයි වගේද? නැවත සිතන්න.
ඔබට සියලු යුගල අතර මාර්ග සහිත A, B, C නගර 3 ක් තිබේ නම් ඔබට යා හැකිය:
- A → B → C.
- A → C B.
- බී → සී → ඒ
- බී → ඒ → සී
- සී → ඒ → බී
- සී → බී → ඒ
හොඳයි, ඇත්ත වශයෙන්ම ඊට වඩා අඩුවෙන් ඇත්තේ මේවායින් සමහරක් සමාන නිසා (A → B → C සහ C → B → A සමාන වේ, නිදසුනක් ලෙස, ඔවුන් එකම මාර්ග භාවිතා කරන නිසා, ප්රතිලෝමව).
යථාර්ථයේ දී, හැකියාවන් 3 ක් ඇත.
- මෙය නගර 4 ක් වෙත ගෙන යන්න, ඔබට (iirc) හැකියාවන් 12 ක් ඇත.
- 5 සමඟ එය 60 කි.
- 6 360 බවට පත්වේ.
මෙය ගණිතමය මෙහෙයුමක සාධකයක් ලෙස හැඳින්වේ . මූලික වශයෙන්:
- 5! = 5 × 4 × 3 × 2 × 1 = 120
- 6! = 6 × 5 × 4 × 3 × 2 × 1 = 720
- 7! = 7 × 6 × 5 × 4 × 3 × 2 × 1 = 5040
- …
- 25! = 25 × 24 ×… × 2 × 1 = 15,511,210,043,330,985,984,000,000
- …
- 50! = 50 × 49 ×… × 2 × 1 = 3.04140932 × 10 64
එබැවින් සංචාරක විකුණුම්කරුගේ ගැටලුවේ ලොකු-ඕ යනු ඕ (එන්!) හෝ සාධකීය හෝ සංයුක්ත සංකීර්ණතාවයි .
ඔබ නගර 200 ක් වෙත ළඟා වන විට සාම්ප්රදායික පරිගණකවල ඇති ගැටළුව විසඳීමට විශ්වයේ ප්රමාණවත් කාලයක් නොමැත.
හිතන්න දෙයක්.
මට ඉක්මණින් සඳහන් කිරීමට අවශ්ය තවත් කරුණක් නම්, O (n a ) හි සංකීර්ණතාවයක් ඇති ඕනෑම ඇල්ගොරිතමයක් බහුපද සංකීර්ණතාවයක් ඇති බව හෝ බහුපද කාලවලදී විසඳිය හැකි බව කියනු ලැබේ .
O (n), O (n 2 ) යනාදිය බහුපද කාලයයි. සමහර ගැටලු බහුපද කාලවලදී විසඳිය නොහැක. මේ නිසා ලෝකයේ සමහර දේවල් භාවිතා වේ. පොදු යතුරු ගුප්ත ලේඛනකරණය ඊට හොඳම උදාහරණයකි. ඉතා විශාල සංඛ්යාවක ප්රධාන සාධක දෙකක් සොයා ගැනීම පරිගණකමය වශයෙන් දුෂ්කර ය. එය එසේ නොවේ නම්, අප භාවිතා කරන පොදු යතුරු පද්ධති භාවිතා කළ නොහැක.
කෙසේ වෙතත්, බිග් ඕ (සංශෝධිත) පිළිබඳ මගේ (බලාපොරොත්තුවෙන් සරල ඉංග්රීසි) පැහැදිලි කිරීම සඳහා එය එයයි.
ආදාන ප්රමාණය මත පදනම්ව ඇල්ගොරිතම පරිමාණය කරන ආකාරය එය පෙන්වයි.
O (n 2 ) : චතුරස්රාකාර සංකීර්ණතාව ලෙස හැඳින්වේ
අයිතම ගණන 10 කින් වැඩි වන බව සලකන්න, නමුත් කාලය 10 2 කින් වැඩි වේ. මූලික වශයෙන්, n = 10 සහ O (n 2 ) අපට පරිමාණ සාධකය n 2 ලබා දෙයි, එය 10 2 වේ.
O (n) : රේඛීය සංකීර්ණතාව ලෙස හැඳින්වේ
මෙවර අයිතම ගණන 10 කින් වැඩි වන අතර කාලයද එසේමය. n = 10 සහ O (n) හි පරිමාණ සාධකය 10 වේ.
O (1) : නිරන්තර සංකීර්ණතාව ලෙස හැඳින්වේ
අයිතම ගණන තවමත් 10 කින් වැඩි වේ, නමුත් O (1) හි පරිමාණ සාධකය සෑම විටම 1 වේ.
O (log n) : ල ar ු ගණක සංකීර්ණතාව ලෙස හැඳින්වේ
ගණනය කිරීම් ගණන වැඩි වන්නේ ආදාන අගයේ ලොගයකින් පමණි. එබැවින් මෙම අවස්ථාවේ දී, එක් එක් ගණනය කිරීම තත්පර 1 ක් ගතවේ යැයි උපකල්පනය කළහොත්, ආදානයේ ලොගය n
අවශ්ය කාලය වේ, එබැවින්log n
.
එහි සාරාංශය එයයි. ඔවුන් ගණිතය අඩු කරයි, එය හරියටම n 2 හෝ ඔවුන් පවසන ඕනෑම දෙයක් නොවිය හැක , නමුත් එය පරිමාණයේ ප්රමුඛ සාධකය වනු ඇත.
බිග්-ඕ අංකනය ("අසමමිතික වර්ධන" අංකනය ලෙසද හැඳින්වේ) ඔබ සම්භවය ආසන්නයේ නිරන්තර සාධක සහ දේවල් නොසලකා හරින විට "පෙනෙන්නේ" යන්නයි . අපි එය භාවිතා කරන්නේ දේවල් පරිමාණය ගැන කතා කිරීමට ය .
මූලික කරුණු
"ප්රමාණවත්" විශාල යෙදවුම් සඳහා ...
f(x) ∈ O(upperbound)
එහි තේරුම f
"වඩා වේගයෙන් වර්ධනය නොවේ"upperbound
f(x) ∈ Ɵ(justlikethis)
මධ්යන්ය f
"හරියටම සමාන ලෙස වර්ධනය වේ"justlikethis
f(x) ∈ Ω(lowerbound)
එහි තේරුම f
"වඩා සෙමින් වර්ධනය නොවේ"lowerbound
big-O අංකනය නියත සාධක ගැන තැකීමක් නොකරයි: ශ්රිතය 9x²
“හරියටම සමාන ලෙස වර්ධනය වේ” යැයි කියනු ලැබේ 10x²
. විශාල-ඕ අසමමිතික අංකනය අසමමිතික නොවන දේවල් ("මූලාරම්භයට ආසන්නයේ ඇති දේවල්" හෝ "ගැටළු ප්රමාණය කුඩා වූ විට කුමක් සිදුවේද") ගැන සැලකිලිමත් වන්නේ නැත : ශ්රිතය 10x²
"හරියටම සමාන ලෙස වර්ධනය වේ" යැයි කියනු ලැබේ 10x² - x + 2
.
සමීකරණයේ කුඩා කොටස් නොසලකා හැරීමට ඔබට අවශ්ය ඇයි? ඔබ විශාල හා විශාල පරිමාණයන් ලෙස සලකන විට සමීකරණයේ විශාල කොටස් වලින් ඒවා සම්පූර්ණයෙන්ම වාමන බවට පත්වේ; ඔවුන්ගේ දායකත්වය වාමන හා අදාළ නොවේ. (උදාහරණ කොටස බලන්න.)
වෙනත් ක්රමයක් තබන්න, ඔබ අනන්තය කරා යන විට ඒ සියල්ලම අනුපාතය වේ. ඔබ විසින් ගත කරන සත්ය කාලය O(...)
බෙදුවහොත්, විශාල යෙදවුම්වල සීමාවට නියත සාධකයක් ඔබට ලැබෙනු ඇත. බුද්ධිමත්ව මෙය අර්ථවත් කරයි: අනෙකා ලබා ගැනීම සඳහා ඔබට ගුණ කළ හැකි නම් කාර්යයන් එකිනෙක මෙන් පරිමාණය කරයි. අපි කියන්නේ එවිටයි ...
actualAlgorithmTime(N) ∈ O(bound(N))
e.g. "time to mergesort N elements
is O(N log(N))"
... මෙයින් අදහස් කරන්නේ "ප්රමාණවත් තරම්" ගැටළු ප්රමාණ N සඳහා (අපි සම්භවය ආසන්නයේ ඇති දේවල් නොසලකා හැරියහොත්), යම් නියතයක් (උදා. 2.5, සම්පුර්ණයෙන්ම සෑදී ඇති) පවතින බවයි:
actualAlgorithmTime(N) e.g. "mergesort_duration(N) "
────────────────────── < constant ───────────────────── < 2.5
bound(N) N log(N)
නියත තේරීම් බොහොමයක් තිබේ; බොහෝ විට "හොඳම" තේරීම ඇල්ගොරිතමයේ "නියත සාධකය" ලෙස හැඳින්වේ ... නමුත් විශාලතම නොවන යෙදුම් නොසලකා හැරීම මෙන් අපි බොහෝ විට එය නොසලකා හරිමු (ඒවා සාමාන්යයෙන් වැදගත් නොවන්නේ මන්දැයි නිරන්තර සාධක අංශය බලන්න). ඉහත සමීකරණය මායිමක් ලෙස ඔබට සිතිය හැකිය, " නරකම අවස්ථාවෙහිදී, ගතවන කාලය දළ වශයෙන් N*log(N)
2.5 ට වඩා නරක නොවනු ඇත , 2.5 සාධකය තුළ (අපි එතරම් සැලකිල්ලක් නොදක්වන නියත සාධකය) " .
පොදුවේ ගත් කල, O(...)
වඩාත්ම ප්රයෝජනවත් වන්නේ අප බොහෝ විට නරකම හැසිරීම් ගැන සැලකිලිමත් වන බැවිනි. f(x)
ප්රොසෙසරය හෝ මතක භාවිතය වැනි "නරක" යමක් නියෝජනය කරන්නේ නම් , " f(x) ∈ O(upperbound)
" යන්නෙන් අදහස් කරන්නේ " upperbound
ප්රොසෙසරය / මතක භාවිතය පිළිබඳ නරකම අවස්ථාවයි".
අයදුම්පත්
තනිකරම ගණිතමය ව්යුහයක් ලෙස, ලොකු-ඕ අංකනය සැකසීමේ කාලය සහ මතකය ගැන කතා කිරීමට පමණක් සීමා නොවේ. පරිමාණය අර්ථවත් වන ඕනෑම දෙයක අසමමිතික කරුණු සාකච්ඡා කිරීමට ඔබට එය භාවිතා කළ හැකිය:
N
සාදයකදී මිනිසුන් අතර සිදුවිය හැකි අත් කම්පන ගණන ( Ɵ(N²)
, විශේෂයෙන් N(N-1)/2
, නමුත් වැදගත් වන්නේ එය “පරිමාණයට සමාන වීම” N²
)උදාහරණයක්
ඉහත ඇති අත් සේදීමේ උදාහරණය සඳහා, කාමරයක සිටින සෑම කෙනෙකුම අනෙක් අයගේ අත සොලවයි. එම උදාහරණයේ , #handshakes ∈ Ɵ(N²)
. මන්ද?
ටිකක් උපස්ථ කරන්න: අත් සේදීමේ සංඛ්යාව හරියටම n-select-2 හෝ N*(N-1)/2
(සෑම N පුද්ගලයෙක්ම N-1 වෙනත් පුද්ගලයින්ගේ දෑත් සොලවා ඇත, නමුත් මෙම ද්විත්ව ගණනය කිරීම් අත් සේදීම් 2 න් බෙදන්න):
කෙසේ වෙතත්, ඉතා විශාල පිරිසකට, රේඛීය පදය N
වාමනය වී ඇති අතර 0 අනුපාතයට 0 ලදායී ලෙස දායක වේ (ප්රස්ථාරයේ: මුළු පෙට්ටිවලට වඩා විකර්ණයේ ඇති හිස් පෙට්ටිවල කොටස කුඩා වන විට සහභාගිවන්නන්ගේ සංඛ්යාව විශාල වන විට). එම නිසා පරිමාණයේ හැසිරීම order N²
, හෝ අත් සේදීමේ සංඛ්යාව "N like මෙන් වර්ධනය වේ".
#handshakes(N)
────────────── ≈ 1/2
N²
එය ප්රස්ථාරයේ විකර්ණයේ ඇති හිස් පෙට්ටි (N * (N-1) / 2 පිරික්සුම් සලකුණු) පවා එහි නොමැති බව පෙනේ (N 2 පිරික්සුම් අසමමිතිකව).
( "සරල ඉංග්රීසි" සිට තාවකාලික අතුරු කතාව :) ඔබ මේ ඔප්පු කිරීමට අවශ්ය නම්, ඔබ බහු පද බවට එය බෙදී අනුපාතය මත යම් සරල වීජ ගණිතය ඉටු කළ හැකි ( lim
ඔබ නම් "සීමාව සලකා" යනු, එය නොසලකා හරින්න එය දැක නැත, එය "සහ N ඇත්තෙන්ම විශාලයි" සඳහා අංකනයකි):
N²/2 - N/2 (N²)/2 N/2 1/2
lim ────────── = lim ( ────── - ─── ) = lim ─── = 1/2
N→∞ N² N→∞ N² N² N→∞ 1
┕━━━┙
this is 0 in the limit of N→∞:
graph it, or plug in a really large number for N
tl; dr: හෑන්ඩ් ෂේක් ගණන විශාල අගයන් සඳහා 'x like' ලෙස පෙනේ, අප # හෑන්ඩ් ෂේක් / x² අනුපාතය ලිවීමට නම්, අපට හරියටම x² හෑන්ඩ් ෂේක් අවශ්ය නොවන බව පෙන්නුම් කරයි. අත්තනෝමතික ලෙස විශාල කාලයක් සඳහා දශමයේදී.
උදා: x = 1million, අනුපාතය # හෑන්ඩ් ෂේක් / x²: 0.499999 ...
ගොඩනැගීමේ බුද්ධිය
මෙය අපට වැනි ප්රකාශ කිරීමට ඉඩ දෙයි ...
"ප්රමාණවත් තරම් විශාල ආදාන සඳහා = නියත සාධකය කුමක් වුවත්, මම ආදාන ප්රමාණය මෙන් දෙගුණයක් නම් ...
N (2N) = 2 ( N )
N² (2N) ² = 4 ( N² )
cN³ → c (2N) ³ = 8 ( cN³ )
c log (N) log c log (2N) = (c log (2)) + ( c log (N) ) = (ස්ථාවර මුදල) + ( c log (N) )
ඇ * 1 → ඇ * 1
එය O (N 1.000001 ) ට වඩා අඩුය , එය ඔබ මූලික වශයෙන් රේඛීය ලෙස හැඳින්වීමට කැමති විය හැකිය
2 N → 2 2N = (4 N ) ............ වෙනත් ක්රමයක් තබන්න ...... 2 N → 2 N + 1 = 2 N 2 1 = 2 2 N.
[ගණිතමය වශයෙන් නැඹුරුවීම සඳහා, ඔබට සුළු පැති සඳහා ස්පොයිලර් හරහා මූසිකය තැබිය හැකිය]
(ණය සමග https://stackoverflow.com/a/487292/711085 )
(තාක්ෂණිකව නියත සාධකය තවත් සමහර නිදර්ශන උදාහරණවල වැදගත් විය හැකිය, නමුත් මම ඉහත සඳහන් දේ (උදා: ලොග් (එන්)) එය එසේ නොවේ)
ක්රමලේඛකයින් සහ ව්යවහාරික පරිගණක විද්යා scientists යින් යොමු ලක්ෂ්ය ලෙස භාවිතා කරන වර්ධන පාන් සහ බටර් ඇණවුම් මේවාය. ඔවුන් මේවා නිතරම දකිනවා. (එබැවින් ඔබට ආදානය දෙගුණ කිරීමෙන් O () N) ඇල්ගොරිතමයක් 1.414 ගුණයකින් මන්දගාමී වේ යැයි ඔබට සිතිය හැකි අතර, “මෙය ල ar ු ගණකයට වඩා නරක නමුත් රේඛීයව වඩා හොඳය” යනුවෙන් සිතීම වඩා හොඳය.)
නිරන්තර සාධක
සාමාන්යයෙන්, නිශ්චිත නියත සාධක මොනවාදැයි අපට ප්රශ්නයක් නැත, මන්ද ඒවා ක්රියාකාරීත්වය වර්ධනය වන ආකාරයට බලපාන්නේ නැත. උදාහරණයක් ලෙස, ඇල්ගොරිතම දෙකක් O(N)
සම්පූර්ණ කිරීමට කාලය ගතවනු ඇත, නමුත් එකක් අනෙකට වඩා දෙගුණයක් මන්දගාමී විය හැකිය. ප්රශස්තිකරණය උපක්රමශීලී ව්යාපාරයක් බැවින් සාධකය ඉතා විශාල නම් මිස අපි සාමාන්යයෙන් එතරම් තැකීමක් නොකරමු ( ප්රශස්තිකරණය නොමේරූ වන්නේ කවදාද? . වඩා හොඳ ලොකු ඕ සමඟ ඇල්ගොරිතමයක් තෝරා ගැනීමේ හුදු ක්රියාව බොහෝ විට විශාලත්වයේ අනුපිළිවෙලින් කාර්ය සාධනය වැඩි දියුණු කරයි.
සමහර අසමමිතිකව උසස් ඇල්ගොරිතම (උදා: සැසඳිය නොහැකි O(N log(log(N)))
වර්ග කිරීමකට) එතරම් විශාල නියත සාධකයක් (උදා 100000*N log(log(N))
), හෝ O(N log(log(N)))
සැඟවුණු + 100*N
හා සමානව සාපේක්ෂව විශාල වන අතර ඒවා “විශාල දත්ත” වල පවා භාවිතා කිරීම කලාතුරකින් වටී.
O (N) සමහර විට ඔබට කළ හැකි හොඳම දේ වන්නේ ඇයි, එනම් අපට දත්ත ව්යුහයන් අවශ්ය වන්නේ ඇයි
O(N)
ඔබේ සියලු දත්ත කියවීමට අවශ්ය නම් ඇල්ගොරිතම යම් ආකාරයකින් “හොඳම” ඇල්ගොරිතම වේ. මෙම කියවීම ඉතා පනත දත්ත පොකුරක් යනු O(N)
මෙහෙයුම. එය මතකයට පූරණය කිරීම සාමාන්යයෙන් O(N)
(හෝ ඔබට දෘඩාංග සහය තිබේ නම් වේගවත් වේ, නැතහොත් ඔබ දැනටමත් දත්ත කියවා ඇත්නම් කිසිසේත් නැත). කෙසේ වෙතත්, ඔබ සෑම දත්ත කැබැල්ලක්ම (හෝ වෙනත් සෑම දත්ත කැබැල්ලක්ම) ස්පර්ශ කළහොත් හෝ බැලුවහොත් , ඔබේ ඇල්ගොරිතම O(N)
මෙම පෙනුම සිදු කිරීමට කාලය ගතවනු ඇත . ඔබගේ සත්ය ඇල්ගොරිතමයට කොපමණ කාලයක් ගත වුවද, එය අවම වශයෙන් O(N)
එය සියලු දත්ත දෙස එම කාලය ගත කළ නිසාය.
ලිවීමේ ක්රියාව සඳහා ද එයම කිව හැකිය . N දේවල් මුද්රණය කරන සියලුම ඇල්ගොරිතම සඳහා N කාලය ගතවනු ඇත, මන්ද ප්රතිදානය අවම වශයෙන් දිගු වේ (උදා: සියලු ප්රේරණයන් මුද්රණය කිරීම (නැවත සකස් කිරීමේ ක්රම) N ක්රීඩා කාඩ්පත් කට්ටලයක් සාධකීය වේ :) O(N!)
.
මෙම දිරිමත් භාවිතය දත්ත ව්යුහ : දත්ත ව්යුහය දත්ත කියවීම පමණක් (සාමාන්යයෙන් වරක් අවශ්ය O(N)
(උදා: කාලය), එකතු preprocessing සමහර අත්තනෝමතික ප්රමාණය O(N)
හෝ O(N log(N))
හෝ O(N²)
) අප කුඩා තබා ගැනීමට උත්සාහ කරන. ඉන් අනතුරුව, දත්ත ව්යූහයක් (insertions / මකාදැමීම් / ආදිය) වෙනස් කිරීම සහ දත්ත මත විමසුම් ඉතා සුළු කාලයක් ගත, එවැනි ලෙස O(1)
හෝO(log(N))
. ඉන්පසු ඔබ විමසුම් විශාල සංඛ්යාවක් කිරීමට ඉදිරියට යයි! පොදුවේ ගත් කල, ඔබ කලින් වැඩ කිරීමට කැමති වැඩ වැඩි වන තරමට ඔබට පසුව කළ යුතු වැඩ අඩු වේ.
නිදසුනක් ලෙස, ඔබට මාර්ග අංශ මිලියන ගණනක අක්ෂාංශ හා දේශාංශ ඛණ්ඩාංක ඇති බවත් සියලු වීදි මංසන්ධි සොයා ගැනීමට අවශ්ය බවත් පවසන්න.
O(N)
නම්, එක් වරක් පමණක් බොළඳ වැඩ කිරීමේ ක්රමය ගැටළුවක් නොවනු ඇත , නමුත් ඔබට එය බොහෝ වාරයක් කිරීමට අවශ්ය නම් (මේ අවස්ථාවේ දී N
, එක් එක් කොටස සඳහා එක් වරක්), අපි මට O(N²)
වැඩ කළ යුතුයි, නැතහොත් 1000000² = 1000000000000 මෙහෙයුම්. හොඳ නැත (නවීන පරිගණකයකට තත්පරයට මෙහෙයුම් බිලියනයක් පමණ කළ හැකිය).O(N)
වේලාවට පෙර සැකසීමෙන් අපි සුළු පිරිවැයක් ගෙවන්නෙමු . ඉන්පසුව, එහි යතුරෙන් යමක් බැලීමට සාමාන්යයෙන් නියත කාලයක් ගතවේ (මේ අවස්ථාවේ දී, අපගේ යතුර වන්නේ අක්ෂාංශ හා දේශාංශ ඛණ්ඩාංක, ජාලකයකට වටකුරු ය; අපි යාබද ග්රිඩ් අවකාශයන් සොයන්නේ 9 ක් පමණක් වන අතර එය a නියත).O(N²)
සිට කළමණාකරනය කළ හැකි දෙයක් O(N)
දක්වා වූ අතර අපට කළ යුතුව තිබුණේ හැෂ් මේසයක් සෑදීම සඳහා සුළු පිරිවැයක් ගෙවීම පමණි.කතාවේ සදාචාරය: දත්ත ව්යුහයක් මඟින් මෙහෙයුම් වේගවත් කිරීමට අපට ඉඩ සලසයි. ඊටත් වඩා, දියුණු දත්ත ව්යුහයන් මඟින් ඇදහිය නොහැකි තරම් දක්ෂ ආකාරයකින් මෙහෙයුම් ඒකාබද්ධ කිරීමට, ප්රමාද කිරීමට හෝ නොසලකා හැරීමට ඔබට ඉඩ සලසයි. විවිධ ගැටළු වලට විවිධ ප්රතිසමයන් ඇත, නමුත් ඒවා සියල්ලම දත්ත ගැන අපි සැලකිලිමත් වන යම් ව්යුහයක් ගසාකන අයුරින් සංවිධානය කිරීම හෝ පොත් තැබීම සඳහා කෘතිමව අප විසින් පනවා ඇත. අපි වේලාවට පෙර වැඩ කරන්නෙමු (මූලික වශයෙන් සැලසුම් කිරීම සහ සංවිධානය කිරීම), දැන් නැවත නැවතත් කරන කාර්යයන් වඩාත් පහසු වේ!
ප්රායෝගික උදාහරණය: කේතීකරණයේදී වර්ධන අනුපිළිවෙල දෘශ්ය කිරීම
අසමමිතික අංකනය එහි හරය තුළ වැඩසටහන්කරණයෙන් බෙහෙවින් වෙනස් ය. අසමමිතික අංකනය යනු දේවල් පරිමාණය වන ආකාරය සහ විවිධ ක්ෂේත්රවල භාවිතා කළ හැකි ආකාරය ගැන සිතීම සඳහා ගණිතමය රාමුවකි. එය පැවසුවේ ... ඔබ කේතීකරණයට අසමමිතික අංකනය යොදන ආකාරය මෙයයි .
මූලික කරුණු: අපි A ප්රමාණයේ එකතුවක (අරා, කට්ටලයක්, සිතියමක සියලුම යතුරු ආදිය) සෑම මූලද්රව්යයක් සමඟම අන්තර්ක්රියා කරන විට හෝ ලූපයක පුනරාවර්තනයක් සිදු කරන විට, එය A ප්රමාණයේ ගුණ කිරීමේ සාධකයකි. "ගුණ කිරීමේ සාධකය" යැයි මා කියන්නේ ඇයි? - ලූප සහ ශ්රිත (අර්ථ දැක්වීම අනුව) ගුණ කිරීමේ ධාවන කාලය ඇති හෙයින්: පුනරාවර්තන ගණන, ලූපයේ වැඩ කරන වේලාවන් (හෝ කාර්යයන් සඳහා: ඔබ ඇමතූ වාර ගණන ශ්රිතය, ශ්රිතයේ වේලාවන් වැඩ කිරීම) .
(මෙහි, x
s නිරූපණය කරන්නේ කාර්යයේ නියත-කාලීන ඒකක, ප්රොසෙසර් උපදෙස්, පරිවර්තක ඔප්කෝඩ්, ඕනෑම දෙයක්)
for(i=0; i<A; i++) // A * ...
some O(1) operation // 1
--> A*1 --> O(A) time
visualization:
|<------ A ------->|
1 2 3 4 5 x x ... x
other languages, multiplying orders of growth:
javascript, O(A) time and space
someListOfSizeA.map((x,i) => [x,i])
python, O(rows*cols) time and space
[[r*c for c in range(cols)] for r in range(rows)]
උදාහරණ 2:
for every x in listOfSizeA: // A * (...
some O(1) operation // 1
some O(B) operation // B
for every y in listOfSizeC: // C * (...
some O(1) operation // 1))
--> O(A*(1 + B + C))
O(A*(B+C)) (1 is dwarfed)
visualization:
|<------ A ------->|
1 x x x x x x ... x
2 x x x x x x ... x ^
3 x x x x x x ... x |
4 x x x x x x ... x |
5 x x x x x x ... x B <-- A*B
x x x x x x x ... x |
................... |
x x x x x x x ... x v
x x x x x x x ... x ^
x x x x x x x ... x |
x x x x x x x ... x |
x x x x x x x ... x C <-- A*C
x x x x x x x ... x |
................... |
x x x x x x x ... x v
උදාහරණ 3:
function nSquaredFunction(n) {
total = 0
for i in 1..n: // N *
for j in 1..n: // N *
total += i*k // 1
return total
}
// O(n^2)
function nCubedFunction(a) {
for i in 1..n: // A *
print(nSquaredFunction(a)) // A^2
}
// O(a^3)
අපි තරමක් සංකීර්ණ දෙයක් කරන්නේ නම්, සිදුවන්නේ කුමක්ද යන්න ඔබට දෘශ්යමය වශයෙන් සිතාගත හැකිය:
for x in range(A):
for y in range(1..x):
simpleOperation(x*y)
x x x x x x x x x x |
x x x x x x x x x |
x x x x x x x x |
x x x x x x x |
x x x x x x |
x x x x x |
x x x x |
x x x |
x x |
x___________________|
මෙන්න, ඔබට ඇඳිය හැකි කුඩාම දළ සටහන වන්නේ වැදගත් දෙයයි; ත්රිකෝණයක් යනු ද්විමාන හැඩයක් (0.5 A ^ 2), චතුරස්රයක් ද්විමාන හැඩයක් (A ^ 2) මෙන්; මෙහි නියත සාධකය දෙක අතර අසමමිතික අනුපාතය තුළ පවතී, කෙසේ වෙතත්, අපි එය සියලු සාධක මෙන් නොසලකා හරිමු ... (මෙම තාක්ෂණයට අවාසනාවන්ත සූක්ෂ්ම කරුණු කිහිපයක් මා මෙහි නොයනු ඇත; එය ඔබව නොමඟ යැවිය හැකිය.)
ඇත්ත වශයෙන්ම මින් අදහස් කරන්නේ ලූප සහ කාර්යයන් නරක බවයි; ඊට පටහැනිව, ඒවා නවීන ක්රමලේඛන භාෂාවල ගොඩනැඟිලි කොටස් වන අතර අපි ඔවුන්ට ආදරෙයි. කෙසේ වෙතත්, අපගේ දත්ත (පාලන ප්රවාහය ආදිය) සමඟ අපි ලූප සහ ක්රියාකාරිත්වයන් සහ කොන්දේසි රෙදි විවීම අපගේ වැඩසටහනේ කාලය හා අවකාශය අනුකරණය කරන බව අපට පෙනේ! කාලය හා අභ්යවකාශ භාවිතය ගැටලුවක් බවට පත්වුවහොත්, එනම්, අප දක්ෂතාවයට යොමුවී, අප නොසැලකූ පහසු ඇල්ගොරිතමයක් හෝ දත්ත ව්යුහයක් සොයා ගත් විට, කෙසේ හෝ වර්ධන අනුපිළිවෙල අඩු කර ගැනීමයි. එසේ වුවද, මෙම දෘශ්යකරණ ශිල්පීය ක්රම (ඒවා සැමවිටම ක්රියාත්මක නොවුවද) නරකම අවස්ථාවක දී ඔබට බොළඳ අනුමාන කළ හැකිය.
අපට දෘශ්යමය වශයෙන් හඳුනාගත හැකි තවත් දෙයක් මෙන්න:
<----------------------------- N ----------------------------->
x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x
x x x x x x x x x x x x x x x x
x x x x x x x x
x x x x
x x
x
අපට මෙය නැවත සකස් කර එය O (N) බලන්න පුළුවන්:
<----------------------------- N ----------------------------->
x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x
x x x x x x x x x x x x x x x x|x x x x x x x x|x x x x|x x|x
O (N * log (N)) මුළු කාලය සඳහා ඔබ දත්ත ලොග් (N) සමත් කරයි:
<----------------------------- N ----------------------------->
^ x x x x x x x x x x x x x x x x|x x x x x x x x x x x x x x x x
| x x x x x x x x|x x x x x x x x|x x x x x x x x|x x x x x x x x
lgN x x x x|x x x x|x x x x|x x x x|x x x x|x x x x|x x x x|x x x x
| x x|x x|x x|x x|x x|x x|x x|x x|x x|x x|x x|x x|x x|x x|x x|x x
v x|x|x|x|x|x|x|x|x|x|x|x|x|x|x|x|x|x|x|x|x|x|x|x|x|x|x|x|x|x|x|x
සම්බන්ධයක් නැති නමුත් නැවත සඳහන් කිරීම වටී: අපි හැෂ් එකක් (උදා: ශබ්දකෝෂයක් / හැෂ්ටබල් බැලීමක්) සිදු කරන්නේ නම්, එය O (1) හි සාධකයකි. එය ඉතා වේගවත්.
[myDictionary.has(x) for x in listOfSizeA]
\----- O(1) ------/
--> A*1 --> O(A)
එවැනි ආවර්තනික උත්සවය හෝ බෙදීම-සහ-ජයගන්න ඇල්ගොරිතමය මෙන් ඉතා සංකීර්ණ දෙයක්, එසේ නම්, ඔබ භාවිතා කළ හැකිය මාස්ටර් ප්රමේයය (සාමාන්යයෙන් ක්රියා කරයි), හෝ හාස්යජනක අවස්ථාවල Akra-Bazzi ප්රමේයය (සෑම විටම පාහේ ක්රියා කරයි) ඔබ දෙස බලා විකිපීඩියාවේ ඔබගේ ඇල්ගොරිතමයේ ධාවන කාලය.
නමුත්, ක්රමලේඛකයින් මේ ආකාරයට නොසිතන හෙයින්, අවසානයේදී ඇල්ගොරිතම ප්රතිභානය දෙවන ස්වභාවය බවට පත්වේ. ඔබ අකාර්යක්ෂම දෙයක් කේත කිරීමට පටන් ගෙන වහාම "මම තරමක් අකාර්යක්ෂම දෙයක් කරන්නේද? " පිළිතුර "ඔව්" නම් සහ එය සැබවින්ම වැදගත් යැයි ඔබ පුරෝකථනය කරන්නේ නම්, ඔබට පියවරක් පසුපසට ගොස් දේවල් වේගයෙන් ක්රියාත්මක කිරීම සඳහා විවිධ උපක්රම ගැන සිතිය හැකිය (පිළිතුර සෑම විටම පාහේ "හැෂ් ටේබල් එකක් භාවිතා කරන්න", කලාතුරකින් "ගසක් භාවිතා කරන්න", සහ ඉතා කලාතුරකින් ටිකක් සංකීර්ණ දෙයක්).
ක්රමක්ෂය සහ සාමාන්ය සිද්ධි සංකීර්ණතාව
"ක්රමක්ෂය" සහ / හෝ "සාමාන්ය නඩුව" යන සංකල්පය ද ඇත (මේවා වෙනස් බව සලකන්න).
සාමාන්ය නඩුව : මෙය ශ්රිතයක අපේක්ෂිත අගය සඳහා විශාල-ඕ අංකනය භාවිතා කරනවාට වඩා වැඩි දෙයක් නොවේ. සුපුරුදු අවස්ථාවෙහිදී, සියලු යෙදවුම් සමාන විය හැකි යැයි ඔබ සලකන විට, සාමාන්ය නඩුව ක්රියාත්මක වන වේලාවේ සාමාන්යය පමණි. නිදසුනක් ලෙස ක්වික්සෝර්ට් සමඟ, නරකම අවස්ථාව O(N^2)
සමහර අයහපත් යෙදවුම් සඳහා වුවද, සාමාන්ය නඩුව සුපුරුදු ය O(N log(N))
(ඇත්තෙන්ම නරක යෙදවුම් සංඛ්යාවෙන් ඉතා කුඩා වන අතර සාමාන්ය නඩුවේදී අප ඒවා නොදකින සුළු සංඛ්යාවක්).
ක්රමක්ෂය කළ නරකම අවස්ථාව : සමහර දත්ත ව්යුහයන්ට නරකම තත්වයේ සංකීර්ණතාවයක් තිබිය හැකි නමුත් ඔබ මෙම මෙහෙයුම් බොහොමයක් කරන්නේ නම්, ඔබ කරන සාමාන්ය වැඩ ප්රමාණය නරකම අවස්ථාවන්ට වඩා හොඳ වනු ඇති බවට සහතික වන්න. උදාහරණයක් ලෙස, ඔබට නිරන්තරයෙන් නියත O(1)
කාලයක් ගතවන දත්ත ව්යුහයක් තිබිය හැකිය . කෙසේ වෙතත්, ඉඳහිට එය 'ඉක්කාව' හා O(N)
එක් අහඹු මෙහෙයුමක් සඳහා කාලය ගතවනු ඇත , මන්ද සමහර විට එයට පොත් තැබීම හෝ කසළ එකතු කිරීම හෝ යමක් කිරීමට අවශ්ය විය හැකිය ... නමුත් එය ඔබට පොරොන්දු වන්නේ එය ඉක්කාව කළහොත් එය නැවත එන් සඳහා ඉක්කාව නොයන බවයි. තවත් මෙහෙයුම්. නරකම අවස්ථාව තවමත් O(N)
එක් මෙහෙයුමක් සඳහා වන නමුත් බොහෝ ලකුණු වලට වඩා ක්රමක්ෂය පිරිවැය වේO(N)/N
=O(1)
එක් මෙහෙයුමකට. විශාල මෙහෙයුම් ප්රමාණවත් තරම් දුර්ලභ බැවින්, ඉඳහිට කරන විශාල වැඩ ප්රමාණයක් නියත සාධකයක් ලෙස සෙසු කාර්යයන් සමඟ සම්මිශ්රණය කිරීම සඳහා සැලකිය හැකිය. අපි කියන්නේ ප්රමාණවත් තරම් විශාල ඇමතුම් සංඛ්යාවක් හරහා එය “ක්රමක්ෂය” කර ඇති අතර එය අසමමිතික ලෙස අතුරුදහන් වේ.
ක්රමක්ෂය විශ්ලේෂණය සඳහා ප්රතිසමයක්:
ඔබ වාහනයක් පදවනවා. ඉඳහිට, ඔබ ගෑස් නැවතුම්පොළට ගොස් විනාඩි 10 ක් ගත කළ යුතු අතර පසුව ටැංකිය ගෑස් සමඟ නැවත පිරවීම සඳහා මිනිත්තු 1 ක් ගත කළ යුතුය. ඔබ ඔබේ මෝටර් රථය සමඟ ඕනෑම තැනකට ගිය සෑම අවස්ථාවකම මෙය කළා නම් (ගෑස් නැවතුම්පොළට විනාඩි 10 ක් රිය පැදවීම, ගැලුම් භාගයක් පුරවා තත්පර කිහිපයක් ගත කිරීම), එය ඉතා අකාර්යක්ෂම වනු ඇත. නමුත් ඔබ දින කිහිපයකට වරක් ටැංකිය පුරවා ගන්නේ නම්, ගෑස් නැවතුම්පොළ වෙත රිය පැදවීම සඳහා ගත කළ මිනිත්තු 11 ප්රමාණවත් තරම් සංචාර ගණනකට වඩා “ක්රමක්ෂය” කර ඇති අතර, ඔබට එය නොසලකා හැරිය හැකි අතර ඔබේ සියලු සංචාර 5% දිගු විය හැකිය.
සාමාන්ය නඩුව හා ක්රමක්ෂය කළ නරකම අවස්ථාව අතර සංසන්දනය:
කෙසේ වෙතත්, ඔබ ප්රහාරකයෙකු ගැන සාධාරණ ලෙස කනස්සල්ලට පත්ව සිටී නම්, ක්රමක්ෂය සහ සාමාන්ය සිද්ධියට අමතරව කරදර වීමට තවත් බොහෝ ඇල්ගොරිතම ප්රහාරක වාහකයන් ඇත.)
සාමාන්ය-නඩුව සහ ක්රමක්ෂය යන දෙකම පරිමාණයෙන් සිතා බැලීමට හා සැලසුම් කිරීමට ඇදහිය නොහැකි තරම් ප්රයෝජනවත් මෙවලම් වේ.
( මෙම උප මාතෘකාව ගැන උනන්දුවක් දක්වන්නේ නම් සාමාන්ය නඩුව සහ ක්රමක්ෂය විශ්ලේෂණය අතර වෙනස බලන්න .)
බහුවිධ බිග්-ඕ
බොහෝ විට, වැඩ කිරීමේදී එක් විචල්යයකට වඩා ඇති බව මිනිසුන්ට වැටහෙන්නේ නැත. නිදසුනක් ලෙස, නූල්-සෙවුම් ඇල්ගොරිතමයක, ඔබේ ඇල්ගොරිතමයට කාලය ගතවනු ඇත O([length of text] + [length of query])
, එනම් එය විචල්යයන් දෙකකින් රේඛීය වේ O(N+M)
. තවත් බොළඳ ඇල්ගොරිතම O([length of text]*[length of query])
හෝ විය හැකිය O(N*M)
. බහු විචල්යයන් නොසලකා හැරීම ඇල්ගොරිතම විශ්ලේෂණයේ දී මා දකින වඩාත් සුලභ අධීක්ෂණයක් වන අතර ඇල්ගොරිතමයක් සැලසුම් කිරීමේදී ඔබට බාධා කළ හැකිය.
මුළු කතාවම
බිග්-ඕ යනු සම්පූර්ණ කතාව නොවන බව මතක තබා ගන්න. හැඹිලි භාවිතා කිරීමෙන්, ඒවා හැඹිලි-නොසලකා හැරීමෙන්, තැටිය වෙනුවට RAM සමඟ වැඩ කිරීමෙන්, සමාන්තරකරණය භාවිතා කිරීමෙන් හෝ වේලාවට පෙර වැඩ කිරීමෙන් ඔබට සමහර ඇල්ගොරිතම දැඩි ලෙස වේගවත් කළ හැකිය - මෙම ක්රම බොහෝ විට වර්ධන අනුපිළිවෙලින් ස්වාධීන වේ "බිග්-ඕ" අංකනය, සමාන්තර ඇල්ගොරිතම වල විශාල-ඕ අංකනයෙහි ඇති හර ගණන ඔබ බොහෝ විට දකිනු ඇත.
ඔබේ වැඩසටහනේ සැඟවුණු අවහිරතා නිසා, ඔබ අසමමිතික හැසිරීම් ගැන සැබවින්ම සැලකිල්ලක් නොදක්වන බව මතක තබා ගන්න. ඔබ සීමිත අගයන් සංඛ්යාවක් සමඟ වැඩ කරමින් සිටිනවා විය හැක, උදාහරණයක් ලෙස:
O(N log(N))
ක්වික්සෝර්ට් භාවිතා කිරීමට ඔබට අවශ්ය නැත ; ඔබට ඇතුළත් කිරීමේ වර්ග කිරීම භාවිතා කිරීමට අවශ්යය, එය කුඩා යෙදවුම් මත හොඳින් ක්රියා කරයි. මෙම තත්වයන් බොහෝ විට බෙදීම් සහ ජය ගැනීමේ ඇල්ගොරිතමයන් තුළ ඇති වන අතර එහිදී ඔබ ගැටළුව කුඩා හා කුඩා උපප්රශ්න වලට බෙදනු ලැබේ, එනම් පුනරාවර්තන වර්ග කිරීම, වේගවත් ෆූරියර් පරිණාමනය හෝ අනුකෘති ගුණ කිරීම.ප්රායෝගිකව, සමාන හෝ සමාන අසමමිතික කාර්ය සාධනයක් ඇති ඇල්ගොරිතම අතර පවා, ඒවායේ සාපේක්ෂ කුසලතාව ඇත්ත වශයෙන්ම වෙනත් දේ මගින් මෙහෙයවනු ලැබේ, එනම්: වෙනත් කාර්ය සාධන සාධක (ක්වික්සෝර්ට් සහ ඒකාබද්ධ කිරීම යන දෙකම වේ O(N log(N))
, නමුත් ක්වික්සෝර්ට් CPU හැඹිලි වලින් ප්රයෝජන ගනී); ක්රියාත්මක කිරීමේ පහසුව වැනි ක්රියාකාරී නොවන සලකා බැලීම්; පුස්තකාලයක් තිබේද යන්න සහ පුස්තකාලය කෙතරම් පිළිගත් හා නඩත්තු කරන්නේද යන්න.
500GHz පරිගණකයක් සහ 2GHz පරිගණකයක් මත වැඩසටහන් මන්දගාමීව ක්රියාත්මක වේ. අපි මෙය සැබවින්ම සම්පත් සීමාවේ කොටසක් ලෙස නොසැලකේ, මන්ද යන්ත සම්පත් අනුව පරිමාණය කිරීම ගැන අපි සිතමු (උදා: ඔරලෝසු චක්රයකට), සැබෑ තත්පරයට නොවේ. කෙසේ වෙතත්, ඔබ අනුකරණය යටතේ ක්රියාත්මක වන්නේද, නැතහොත් සම්පාදක ප්රශස්තිකරණය කළ කේතයද යන්න වැනි කාර්ය සාධනයට 'රහසින්' බලපෑම් කළ හැකි සමාන දේ තිබේ. මෙමඟින් සමහර මූලික මෙහෙයුම් සඳහා වැඩි කාලයක් ගතවනු ඇත (එකිනෙකාට සාපේක්ෂව පවා), හෝ සමහර මෙහෙයුම් අසමමිතික ලෙස (එකිනෙකාට සාපේක්ෂව) වේගවත් කිරීම හෝ මන්දගාමී කිරීම. විවිධ ක්රියාත්මක කිරීම් සහ / හෝ පරිසරය අතර බලපෑම කුඩා හෝ විශාල විය හැකිය. එම කුඩා වැඩිපුර වැඩ කිරීමට ඔබ භාෂා හෝ යන්ත්ර මාරු කරනවාද? එය තවත් හේතු සියයක් මත රඳා පවතී (අවශ්යතාවය, කුසලතා, සහායකයන්, ක්රමලේඛක produc ලදායිතාව,
ඉහත ගැටළු, ක්රමලේඛන භාෂාව භාවිතා කිරීමේ තේරීමෙහි බලපෑම වැනි, කිසි විටෙකත් නියත සාධකයේ කොටසක් ලෙස නොසැලකේ (ඒවා නොවිය යුතුය); සමහර විට (කලාතුරකින් වුවද) ඒවා දේවල් කෙරෙහි බලපාන බැවින් යමෙකු ඒවා ගැන දැනුවත් විය යුතුය . උදාහරණයක් ලෙස cpython හි, ස්වදේශීය ප්රමුඛතා පෝලිම් ක්රියාත්මක කිරීම අසමමිතික ලෙස ප්රශස්ත නොවන වේ ( ඔබ ඇතුළු කිරීම හෝ සොයා ගැනීම සඳහා තෝරා ගැනීම O(log(N))
වෙනුවට O(1)
); ඔබ වෙනත් ක්රියාත්මක කිරීමක් භාවිතා කරනවාද? සී ක්රියාත්මක කිරීම වේගවත් වන නිසාත්, වෙනත් තැනක වෙනත් සමාන ගැටළු ඇති නිසාත් බොහෝ විට එසේ නොවේ. වෙළඳාම තිබේ; සමහර විට ඒවා වැදගත් වන අතර සමහර විට ඒවා වැදගත් නොවේ.
( සංස්කරණය කරන්න : “සරල ඉංග්රීසි” පැහැදිලි කිරීම මෙතැනින් අවසන් වේ.)
ගණිත එකතු කිරීම
සම්පූර්ණත්වය සඳහා, බිග්-ඕ අංකනයෙහි නිශ්චිත අර්ථ දැක්වීම පහත පරිදි වේ: f(x) ∈ O(g(x))
එයින් අදහස් වන්නේ “f යනු අසමමිතිකව ඉහළ මායිමකින් යුත් කොන්ස් * g” යන්නයි: x හි යම් සීමිත අගයකට වඩා අඩු සියල්ල නොසලකා හරිමින්, නියතයක් පවතී |f(x)| ≤ const * |g(x)|
. (අනෙක් සංකේත පහත පරිදි වේ: O
means යන්නෙන් අදහස් වන්නේ means, Ω
අර්ථය ≥. කුඩා අකුරු ප්රභේද ඇත: o
අර්ථය <, සහ ω
අදහස්>.) f(x) ∈ Ɵ(g(x))
යන්නෙන් අදහස් කරන්නේ දෙකම f(x) ∈ O(g(x))
සහ f(x) ∈ Ω(g(x))
(ඉහළ හා පහළ මායිම් g): f වැනි සමහර නියතයන් පවතී. const1*g(x)
සහ අතර ඇති "සංගීත කණ්ඩායම" තුළ සැමවිටම පවතිනු ඇත . (කණගාටුයි, නිරවද්යතාවයේ සංකේත සඳහන් කිරීම මේ දක්වා ප්රමාද කිරීමට මම තෝරා ගත්තෙමි, පැහැදිලිකම වෙනුවෙන්; විශේෂයෙන් පරිගණක විද්යා සන්දර්භයක් තුළ negative ණාත්මක අගයන් මතු නොවන බව මම දැක ඇත්තෙමි.)const2*g(x)
. එය ඔබට කළ හැකි ශක්තිමත්ම අසමමිතික ප්රකාශය වන අතර දළ වශයෙන් සමාන වේ==
මිනිසුන් බොහෝ විට භාවිතා කරනු ඇත = O(...)
, එය සමහර විට වඩාත් නිවැරදි 'comp-sci' අංකනය වන අතර එය භාවිතා කිරීමට සම්පූර්ණයෙන්ම නීත්යානුකූල ය; "f = O (...)" කියවනු ලබන්නේ "f යනු අනුපිළිවෙලයි ... / f යනු xxx- මායිම් වලින් ..." සහ "f යනු අසමමිතිකයන් වන යම් ප්රකාශනයකි ..." ලෙස සැලකේ. වඩාත් දැඩි ලෙස භාවිතා කිරීමට මට ඉගැන්නුවා ∈ O(...)
. ∈
එහි තේරුම “මූලද්රව්යයකි” (පෙර මෙන් තවමත් කියවා ඇත). මෙම විශේෂ අවස්ථාවේ දී, O(N²)
{වැනි මූල ද්රව්ය අඩංගු 2 N²
, 3 N²
, 1/2 N²
, 2 N² + log(N)
, - N² + N^1.9
, ...} සහ අපරිමිත, නමුත් එය තවමත් මාලාවක් ය.
O සහ sy සමමිතික නොවේ (n = O (n²), නමුත් n O යනු O (n) නොවේ, නමුත් sy සමමිතික වන අතර (මෙම සම්බන්ධතා සියල්ලම සංක්රාන්තික හා ප්රත්යාවර්තක බැවින්) Ɵ, එබැවින් සමමිතික හා සංක්රාන්තික හා ප්රත්යාවර්තක වේ , එබැවින් සියලු ශ්රිතවල කට්ටලය සමාන පන්ති වලට බෙදා වෙන් කරයි. සමානතා පන්තියක් යනු අප එක හා සමාන යැයි සලකන දේවල් සමූහයකි. එනම්, ඔබට සිතිය හැකි ඕනෑම කාර්යයක් අනුව, ඔබට පන්තියේ කැනොනිකල් / අද්විතීය 'අසමමිතික නියෝජිතයෙකු' සොයා ගත හැකිය (සාමාන්යයෙන් සීමාව ගැනීමෙන් ... මම හිතන්නේ ); ඔබට සියලු නිඛිල පරස්පර හෝ ඊවන්ස් ලෙස කාණ්ඩ කළ හැකි සේම, ඔබට සියලු ක්රියාකාරකම් with සමඟ එක්ස්-ඊෂ්, ලොග් (x) ^ 2-ඊෂ් යනාදිය සමඟ කාණ්ඩගත කළ හැකිය ... මූලික වශයෙන් කුඩා යෙදුම් නොසලකා හැරීමෙන් (නමුත් සමහර විට ඔබ හිර වී සිටිය හැක තමන්ටම වෙනම පංති වන වඩාත් සංකීර්ණ කාර්යයන්).
මෙම =
අංකනය වඩා පොදු එක් විය හැකි පවා ලෝක ප්රසිද්ධ පරිගණක විද්යාඥයින් විසින් ප්රශ්න පත්ර භාවිතා වේ. මීට අමතරව, බොහෝ විට සිදුවන්නේ අනියම් පසුබිමක, මිනිසුන් O(...)
අදහස් කරන විට පවසනු ඇත Ɵ(...)
; මෙය තාක්ෂණිකව සත්යයක් බැවින් දේවල් සමූහය Ɵ(exactlyThis)
උප කුලකයක් වන O(noGreaterThanThis)
අතර එය ටයිප් කිරීම පහසුය. ;-)
සංස්කරණය කරන්න: ඉක්මන් සටහන, මෙය නිසැකවම පාහේ බීටා ඕ අංකනය (එය ඉහළ මායිමකි) තීටා අංකනය සමඟ (ඉහළ සහ පහළ මායිම) ව්යාකූල කරයි. මගේ අත්දැකීම් අනුව මෙය ඇත්ත වශයෙන්ම අනධ්යයන සැකසුම් වල සාකච්ඡා වලට සමානය. කිසියම් ව්යාකූලතාවයක් සඳහා සමාව අයදිමි.
එක් වාක්යයකින්: ඔබගේ රැකියාවේ ප්රමාණය වැඩි වන විට, එය සම්පූර්ණ කිරීමට කොපමණ කාලයක් ගතවේද?
නිසැකවම එය ආදානය ලෙස "ප්රමාණය" සහ ප්රතිදානය ලෙස "ගතවන කාලය" පමණි - ඔබට මතක භාවිතය ආදිය ගැන කතා කිරීමට අවශ්ය නම් එම අදහසම අදාළ වේ.
මෙන්න අපට වියළීමට අවශ්ය එන් ටී ෂර්ට් ඇති උදාහරණයක්. ඒවා වියළන ස්ථානයට ගෙන ඒම ඇදහිය නොහැකි තරම් ඉක්මන් යැයි අපි උපකල්පනය කරමු (එනම් මිනිස් අන්තර්ක්රියා නොසැලකිලිමත් ය). සැබෑ ජීවිතයේ එය එසේ නොවේ, ඇත්ත වශයෙන්ම ...
පිටත රෙදි සෝදන රේඛාවක් භාවිතා කිරීම: ඔබට අසීමිත විශාල පසුපස අංගනයක් ඇතැයි උපකල්පනය කර, O (1) කාලය තුළ වියළන සේදීම. ඔබ සතුව කොපමණ ප්රමාණයක් තිබුණත්, එය එකම හිරු හා නැවුම් වාතය ලබා ගනී, එබැවින් ප්රමාණය වියළීමේ වේලාවට බලපාන්නේ නැත.
ටම්බල් වියළුමක් භාවිතා කිරීම: ඔබ එක් එක් බරට ෂර්ට් 10 ක් දමන්න, ඉන්පසු ඒවා පැයකට පසුව සිදු කෙරේ. (මෙහි සත්ය සංඛ්යා නොසලකා හරින්න - ඒවා අදාල නොවේ.) එබැවින් ෂර්ට් 50 ක් වියළීම ෂර්ට් 10 ක් වියළීමට වඩා 5 ගුණයක් පමණ ගත වේ .
සෑම දෙයක්ම වාතය අල්මාරියකට දැමීම: අපි සෑම දෙයක්ම එක විශාල ගොඩකට දමා සාමාන්ය උණුසුම ලබා දීමට ඉඩ දුන්නොත්, මැද කමිස වියළී යාමට බොහෝ කාලයක් ගතවනු ඇත. විස්තරාත්මකව අනුමාන කිරීමට මා කැමති නැත, නමුත් මෙය අවම වශයෙන් O (N ^ 2) යැයි මම සැක කරමි - ඔබ සේදීමේ බර වැඩි කරන විට, වියළීමේ කාලය වේගයෙන් වැඩිවේ.
"විශාල O" අංකනය එක් වැදගත් අංගයක් වන්නේ එය නොවේ දෙන ප්රමාණය සඳහා වේගවත් වනු ඇත ඇල්ගොරිතමය පවසති. යුගල පෙළක් (නූල්, නිඛිල) එදිරිව හැෂ් ටේබල් (නූල් යතුර, නිඛිල අගය) ගන්න. නූලක් මත පදනම්ව, හැෂ් ටේබල් එකේ යතුරක් හෝ අරාවෙහි මූලද්රව්යයක් සොයා ගැනීම වේගවත් ද? (එනම් අරාව සඳහා, "දී ඇති යතුරට ගැලපෙන පළමු අංගය සොයා ගන්න.") හැෂ්ටේබල් සාමාන්යයෙන් ක්රමක්ෂය කර ඇත (~ = "සාමාන්යයෙන්") O (1) - ඒවා සැකසූ පසු, 1,000,000 ප්රවේශ වගුවක මෙන් 100 ප්රවේශ වගුවක ප්රවේශයක් සොයා ගැනීමට එකම වේලාව. අරාවෙහි මූලද්රව්යයක් සොයා ගැනීම (දර්ශකයට වඩා අන්තර්ගතය මත පදනම්ව) රේඛීය වේ, එනම් ඕ (එන්) - සාමාන්යයෙන් ඔබට ඇතුළත් කිරීම්වලින් අඩක් බැලීමට සිදුවේ.
මෙය බැලීම් සඳහා අරාවකට වඩා වේගයෙන් හැෂ් ටේබල් එකක් කරයිද? අවශ්ය නොවේ. ඔබට ඉතා කුඩා ප්රවේශ එකතුවක් තිබේ නම්, අරාව වේගවත් විය හැකිය - ඔබ බලන හැෂ් කේතය ගණනය කිරීමට ගතවන කාලය තුළ ඔබට සියලු නූල් පරීක්ෂා කිරීමට හැකි වනු ඇත. කෙසේ වෙතත්, දත්ත කට්ටලය විශාල වන විට, හැෂ් ටේබල් අවසානයේ අරාව පරාජය කරයි.
බිග් ඕ විසින් ශ්රිතයක වර්ධන හැසිරීම පිළිබඳ ඉහළ සීමාවක් විස්තර කරයි, උදාහරණයක් ලෙස යෙදවුම් විශාල වන විට වැඩසටහනක ධාවන කාලය.
උදාහරණ:
O (n): මම ආදාන ප්රමාණය දෙගුණ කළහොත් ධාවන කාලය දෙගුණ වේ
O (n 2 ): ආදාන ප්රමාණය ධාවන කාල හතර මෙන් දෙගුණයක් නම්
O (log n): ආදාන ප්රමාණය දෙගුණ වුවහොත් ධාවන කාලය එකකින් වැඩි වේ
O (2 n ): ආදාන ප්රමාණය එකකින් වැඩි වුවහොත්, ධාවන කාලය දෙගුණ වේ
ආදාන ප්රමාණය සාමාන්යයෙන් ආදානය නිරූපණය කිරීමට අවශ්ය බිටු වල අවකාශයයි.
ආදාන කට්ටලයේ විශාලත්වයේ ශ්රිතයක් ලෙස ප්රකාශනය සම්පුර්ණ කිරීමට ගණනය කිරීමක් (ඇල්ගොරිතමයක්) කොපමණ කාලයක් ගතවේද යන්න පිළිබඳ ආසන්න මිනුමක් ලෙස ක්රමලේඛකයින් විසින් බිග් ඕ අංකනය බහුලව භාවිතා කරයි.
යෙදවුම් ගණන වැඩි වන විට ඇල්ගොරිතම දෙකක් කොතරම් දුරට ඉහළ යනු ඇත්දැයි සංසන්දනය කිරීමට බිග් ඕ ප්රයෝජනවත් වේ.
වඩාත් නිවැරදිව බිග් ඕ අංකනය ශ්රිතයක අසමමිතික හැසිරීම ප්රකාශ කිරීමට යොදා ගනී. එයින් අදහස් වන්නේ ශ්රිතය අනන්තය කරා ළඟා වන විට එය හැසිරෙන ආකාරයයි.
බොහෝ අවස්ථාවන්හීදී ඇල්ගොරිතමයක “ඕ” පහත දැක්වෙන අවස්ථාවන්ට වැටෙනු ඇත:
බිග් ඕ විසින් ශ්රිතයක වර්ධන වක්රය සඳහා අර්ථවත් ආකාරයකින් දායක නොවන සාධක නොසලකා හරින අතර ආදාන ප්රමාණය අනන්තය දෙසට වැඩි වේ. මෙයින් අදහස් කරන්නේ ශ්රිතයට එකතු කරන හෝ ගුණ කරන නියතයන් සරලව නොසලකා හරින බවයි.
බිග් ඕ යනු “ඔබේ කේතය ක්රියාත්මක කිරීමට කොපමණ කාලයක් / අවකාශයක් ගතවේද?” යන පොදු ආකාරයෙන් ඔබම “ප්රකාශ කිරීම” සඳහා වූ ක්රමයකි.
ඔබට බොහෝ විට O (n), O (n 2 ), O (nlogn) සහ තවත් බොහෝ දේ දැකිය හැකිය , මේ සියල්ල පෙන්විය හැකි ක්රම පමණි; ඇල්ගොරිතමයක් වෙනස් වන්නේ කෙසේද?
ඕ (එන්) යන්නෙන් අදහස් කරන්නේ බිග් ඕ යනු එන්, දැන් ඔබට සිතිය හැකිය, "එන් යනු කුමක්ද?" හොඳයි "n" යනු මූලද්රව්ය ප්රමාණයයි. රූපරාමු ඔබට අරාවෙහි අයිතමයක් සෙවීමට අවශ්යය. ඔබට එක් එක් මූලද්රව්යය දෙස බැලිය යුතු අතර "ඔබ නිවැරදි මූලද්රව්යය / අයිතමයද?" නරකම අවස්ථාවෙහිදී, අයිතමය අවසාන දර්ශකයේ ඇත, එයින් අදහස් වන්නේ ලැයිස්තුවේ අයිතම ඇති තරම් කාලයක් ගත වූ බවයි, එබැවින් සාමාන්ය වීමට නම්, අපි කියන්නේ "අනේ හේයි, n යනු සාධාරණ අගයක් ලබා දී ඇති අගයක්!" .
එබැවින් "n 2 " යන්නෙහි තේරුම ඔබට වැටහෙනු ඇත , නමුත් ඊටත් වඩා නිශ්චිතව කිවහොත්, ඔබට සරල, වර්ග කිරීමේ ඇල්ගොරිතම ඇති සරලම සිතුවිල්ල සමඟ සෙල්ලම් කරන්න; බුබුලු. මෙම ඇල්ගොරිතම සෑම අයිතමයක් සඳහාම මුළු ලැයිස්තුවම සොයා බැලිය යුතුය.
මගේ ලැයිස්තුව
මෙහි ගලායාම වනුයේ:
මෙය O n 2 නිසා, ඔබ ලැයිස්තුවේ ඇති සියලුම අයිතම "n" අයිතම ඇති බව සොයා බැලිය යුතුය. එක් එක් අයිතමය සඳහා, ඔබ නැවත වරක් සියලු අයිතම දෙස බලයි, සංසන්දනය කිරීම සඳහා මෙයද "n" වේ, එබැවින් සෑම අයිතමයක් සඳහාම ඔබ "n" වේලාවන් අර්ථය n * n = n 2
මෙය ඔබට අවශ්ය තරම් සරල යැයි මම සිතමි.
නමුත් මතක තබා ගන්න, බිග් ඕ යනු කාලය හා අවකාශය අනුව ඔබම ව්යාප්ත කළ හැකි ක්රමයක් පමණි.
බිග් ඕ ඇල්ගොරිතමයක මූලික පරිමාණ ස්වභාවය විස්තර කරයි.
දී ඇති ඇල්ගොරිතමයක් ගැන බිග් ඕ ඔබට නොකියන තොරතුරු රාශියක් තිබේ. එය අස්ථියට කපා ඇල්ගොරිතමයක පරිමාණයේ ස්වභාවය පිළිබඳ තොරතුරු පමණක් ලබා දෙයි, විශේෂයෙන් “ආදාන ප්රමාණයට” ප්රතිචාර වශයෙන් ඇල්ගොරිතමයක සම්පත් භාවිතය (කාලය හෝ මතකය සිතන්න).
වාෂ්ප එන්ජිමක් සහ රොකට්ටුවක් අතර වෙනස සලකා බලන්න. ඒවා හුදෙක් එකම දේවල විවිධ ප්රභේද නොවේ (කියනුයේ, ප්රියස් එන්ජිමක් එදිරිව ලැම්බෝගිනි එන්ජිමකි) නමුත් ඒවා ඒවායේ හරය තුළ නාටකාකාර ලෙස විවිධ ආකාරයේ ප්රචාලන පද්ධති වේ. වාෂ්ප එන්ජිමක් සෙල්ලම් රොකට්ටුවකට වඩා වේගවත් විය හැකි නමුත් කක්ෂීය දියත් කිරීමේ වාහනයක වේගය ළඟා කර ගැනීමට කිසිදු වාෂ්ප පිස්ටන් එන්ජිමකට නොහැකි වනු ඇත. මෙයට හේතුව, ලබා දී ඇති වේගයට (“ආදාන ප්රමාණය”) ළඟා වීමට අවශ්ය ඉන්ධන සම්බන්ධතාවය (“සම්පත් භාවිතය”) සම්බන්ධයෙන් මෙම පද්ධතිවලට විවිධ පරිමාණ ලක්ෂණ ඇති බැවිනි.
මෙය එතරම් වැදගත් වන්නේ ඇයි? මෘදුකාංගය ට්රිලියන ගණනක් දක්වා සාධක අනුව ප්රමාණයෙන් වෙනස් විය හැකි ගැටළු සමඟ කටයුතු කරන බැවිනි. එය මොහොතකට සලකා බලන්න. සඳ වෙත ගමන් කිරීමට අවශ්ය වේගය සහ මිනිස් ඇවිදීමේ වේගය අතර අනුපාතය 10,000: 1 ට වඩා අඩු වන අතර, ආදාන ප්රමාණයේ මෘදුකාංග පරාසයට සාපේක්ෂව එය ඉතා කුඩා වේ. මෘදුකාංගය ආදාන ප්රමාණවලින් තාරකා විද්යාත්මක පරාසයකට මුහුණ දිය හැකි බැවින් ඇල්ගොරිතමයක බිග් ඕ සංකීර්ණතාවයට විභවයක් ඇත, එය ක්රියාත්මක කිරීමේ තොරතුරු තුරන් කිරීම මූලික පරිමාණ ස්වභාවය වේ.
කැනොනිකල් වර්ග කිරීමේ උදාහරණය සලකා බලන්න. බුබුලු වර්ග කිරීම O (n 2 ) වන අතර ඒකාබද්ධ කිරීමේ වර්ග කිරීම O (n log n) වේ. ඔබට වර්ග කිරීමේ යෙදුම් දෙකක් ඇති බව කියමු, බුබුලු වර්ග කිරීම භාවිතා කරන යෙදුම A සහ ඒකාබද්ධ කිරීමේ වර්ග කිරීම භාවිතා කරන යෙදුම B, සහ මූලද්රව්ය 30 ක පමණ ආදාන ප්රමාණ සඳහා යෙදුම A වර්ග කිරීම සඳහා B යෙදුමට වඩා 1,000x වේගවත් බව කියමු. ඔබට කිසි විටෙකත් මූලද්රව්ය 30 කට වඩා වර්ග කිරීමට අවශ්ය නැතිනම්, මෙම ආදාන ප්රමාණයන්හි වඩා වේගවත් බැවින් ඔබ A යෙදුමට වැඩි කැමැත්තක් දැක්විය යුතු බව පැහැදිලිය. කෙසේ වෙතත්, ඔබට අයිතම මිලියන දහයක් වර්ග කිරීමට සිදුවිය හැකි බව ඔබ සොයා ගන්නේ නම්, ඔබ අපේක්ෂා කරන දෙය නම්, B යෙදුම ඇත්ත වශයෙන්ම A යෙදුමට වඩා දහස් ගුණයකින් වේගවත් වීමයි. මේ අවස්ථාවේ දී, එක් එක් ඇල්ගොරිතම පරිමාණයන් නිසා ය.
බිග්-ඕ හි පොදු ප්රභේද පැහැදිලි කිරීමේදී මම භාවිතා කිරීමට පෙළඹෙන සරල ඉංග්රීසි බිස්ටරි මෙන්න
සෑම අවස්ථාවකදීම, ලැයිස්තුවේ පහළින් සිටින අයට වඩා ඉහළින් ඇති ඇල්ගොරිතම වලට වැඩි කැමැත්තක් දක්වන්න. කෙසේ වෙතත්, වඩා මිල අධික සංකීර්ණ පන්තියකට යාමේ පිරිවැය සැලකිය යුතු ලෙස වෙනස් වේ.
ඕ (1):
වර්ධනයක් නැත. ගැටලුව කොතරම් විශාල වුවත්, ඔබට එය එකම වේලාවක විසඳා ගත හැකිය. විකාශන පරාසය තුළ සිටින පුද්ගලයින් සංඛ්යාව නොසලකා, යම් දුරක් විකාශනය කිරීමට සමාන ශක්තියක් අවශ්ය වන විට මෙය විකාශනයට තරමක් සමාන වේ.
ඕ (ලොග් එන් ):
මෙම සංකීර්ණතාව O (1) ට සමාන වේ. සියළුම ප්රායෝගික අරමුණු සඳහා, ඔබට මෙය ඉතා විශාල නියත පරිමාණයක් ලෙස සැලකිය හැකිය. අයිතම 1 දහසක් සහ බිලියනයක් සැකසීම අතර කාර්යයේ වෙනස සාධක හයක් පමණි.
ඕ ( එන් ):
ගැටළුව විසඳීමේ පිරිවැය ගැටලුවේ ප්රමාණයට සමානුපාතික වේ. ඔබේ ගැටළුව ප්රමාණයෙන් දෙගුණයක් නම්, විසඳුමේ පිරිවැය දෙගුණ වේ. දත්ත ඇතුළත් කිරීම, තැටි කියවීම හෝ ජාල තදබදය වැනි බොහෝ ගැටලු යම් ආකාරයකින් පරිගණකයට පරිලෝකනය කළ යුතු බැවින් මෙය සාමාන්යයෙන් දැරිය හැකි පරිමාණ සාධකයකි.
O ( n ලොග් n ):
මෙම සංකීර්ණතාව O ( n ) ට බෙහෙවින් සමාන ය . සියලු ප්රායෝගික අරමුණු සඳහා, දෙක සමාන වේ. මෙම සංකීර්ණතා මට්ටම සාමාන්යයෙන් තවමත් පරිමාණය කළ හැකි යැයි සැලකේ. උපකල්පන වෙනස් කිරීමෙන් සමහර O ( n log n ) ඇල්ගොරිතම O ( n ) ඇල්ගොරිතම බවට පරිවර්තනය කළ හැකිය . උදාහරණයක් ලෙස, යතුරු ප්රමාණය සීමා කිරීම O ( n log n ) සිට O ( n ) දක්වා වර්ග කිරීම අඩු කරයි .
O ( n 2 ):
චතුරස්රයක් ලෙස වර්ධනය වේ, කොහේද n යනු හතරැස් පැත්තක දිග වේ. මෙය "ජාල ආචරණය" හා සමාන වර්ධන වේගයකි, එහිදී ජාලයක සිටින සියල්ලන්ම ජාලයේ අනෙක් සියල්ලන්ම දැන සිටිය හැකිය. වර්ධනය මිල අධිකයි. සැලකිය යුතු ජිම්නාස්ටික් නොකර බොහෝ පරිමාණ කළ හැකි විසඳුම් වලට මෙම මට්ටමේ සංකීර්ණතා සහිත ඇල්ගොරිතම භාවිතා කළ නොහැක. මෙය සාමාන්යයෙන් අනෙකුත් සියලුම බහුපද සංකීර්ණ - O ( n k ) සඳහා ද අදාළ වේ.
ඕ (2 එන් ):
පරිමාණය නොකරයි. සුළු නොවන ප්රමාණයේ ගැටලුවක් විසඳීමට ඔබට බලාපොරොත්තුවක් නැත. වළක්වා ගත යුතු දේ දැන ගැනීමට සහ විශේෂ experts යින්ට O ( n k හි ඇති ආසන්න ඇල්ගොරිතම සොයා ගැනීමට ප්රයෝජනවත් වේ ) .
බිග් ඕ යනු ඇල්ගොරිතමයක් එහි ආදානයේ ප්රමාණයට සාපේක්ෂව කොපමණ කාලයක් / අවකාශයක් භාවිතා කරනවාද යන්න මැනීමකි.
ඇල්ගොරිතමයක් O (n) නම් කාලය / අවකාශය එහි ආදානයට සමාන අනුපාතයකින් වැඩි වේ.
ඇල්ගොරිතමයක් O (n 2) නම් ) නම්, එහි ආදාන වර්ගයට අනුව කාලය / අවකාශය වැඩි වේ.
සහ යනාදි.
බිග් ඕ පිළිබඳ සරල ඉංග්රීසි පැහැදිලි කිරීමක් යනු කුමක්ද? හැකි තරම් විධිමත් අර්ථ දැක්වීමක් සහ සරල ගණිතය සමඟ.
බිග්-ඕ අංකනය කිරීමේ අවශ්යතාව පිළිබඳ සරල ඉංග්රීසි පැහැදිලි කිරීමක් :
අපි වැඩසටහන් කරන විට, අපි උත්සාහ කරන්නේ ගැටලුවක් විසඳීමටයි. අප කේත කරන දේ ඇල්ගොරිතම ලෙස හැඳින්වේ. බිග් ඕ අංකනය අපගේ ඇල්ගොරිතම වල නරකම කාර්ය සාධනය ප්රමිතිගත ආකාරයකින් සංසන්දනය කිරීමට අපට ඉඩ දෙයි. දෘඩාංග පිරිවිතර කාලයත් සමඟ වෙනස් වන අතර දෘඩාංග වැඩි දියුණු කිරීමෙන් ඇල්ගොරිතම ක්රියාත්මක වීමට ගතවන කාලය අඩු කළ හැකිය. නමුත් දෘඩාංග ප්රතිස්ථාපනය කිරීමෙන් අපගේ ඇල්ගොරිතම කාලයත් සමඟ වඩා හොඳ හෝ වැඩිදියුණු වී ඇති බවක් අදහස් නොවේ. එබැවින් විවිධ ඇල්ගොරිතම සංසන්දනය කිරීමට අපට ඉඩ දීම සඳහා, එකක් වඩා හොඳද නැද්ද යන්න තීරණය කිරීම සඳහා අපි බිග් ඕ අංකනය භාවිතා කරමු.
බිග් ඕ අංකනය යනු කුමක්ද යන්න පිළිබඳ සරල ඉංග්රීසි පැහැදිලි කිරීමක් :
සියලුම ඇල්ගොරිතම එකම වේලාවක ක්රියාත්මක නොවන අතර ආදානයේ ඇති අයිතම ගණන අනුව වෙනස් විය හැකිය, ඒවා අපි n ලෙස හඳුන්වන්නෙමු . මේ මත පදනම්ව, අපි සලකා බලන්නේ වඩාත් නරක සිද්ධි විශ්ලේෂණය, හෝ ධාවන කාලයෙහි ඉහළ සීමාවක් n ලෙස විශාල වන තරමටය. N යනු කුමක්ද යන්න පිළිබඳව අප දැනුවත් විය යුතුය , මන්ද බොහෝ බිග් ඕ අංකනයන් එය සඳහන් කරයි.
මෘදුකාංග වැඩසටහන් වල වේගය මැනීම ඉතා අපහසු වන අතර, අප උත්සාහ කරන විට, පිළිතුරු ඉතා සංකීර්ණ විය හැකි අතර ව්යතිරේක සහ විශේෂ අවස්ථා වලින් පිරී ඇත. මෙය විශාල ගැටළුවක් වන හෙයින්, “වේගවත්ම” දේ සොයා ගැනීම සඳහා විවිධ වැඩසටහන් දෙකක් එකිනෙක සමඟ සංසන්දනය කිරීමට අපට අවශ්ය වූ විට එම සියලු ව්යතිරේකයන් සහ විශේෂ අවස්ථා අවධානය වෙනතකට යොමු කිරීම සහ උදව් නොකිරීම.
මේ සියලු උදව් කළ නොහැකි සංකීර්ණතාවයේ ප්රති people ලයක් ලෙස, හැකි කුඩාම හා අවම සංකීර්ණ (ගණිතමය) ප්රකාශන භාවිතා කරමින් මෘදුකාංග වැඩසටහන් වල වේගය විස්තර කිරීමට මිනිසුන් උත්සාහ කරයි. මෙම ප්රකාශන ඉතා ගොරහැඩි ඇස්තමේන්තු වේ: සුළු වාසනාවකින් වුවද, මෘදුකාංගයක් වේගවත් හෝ මන්දගාමීද යන්න පිළිබඳ “සාරය” ඔවුන් ග්රහණය කරගනු ඇත.
ඒවා දළ වශයෙන් වන බැවින්, අපි දළ වශයෙන් සරල කිරීමක් සිදු කරන බවට පා the කයාට සං signal ා කිරීම සඳහා සම්මුතියක් ලෙස ප්රකාශනයේ “ඕ” (බිග් ඕ) අක්ෂරය භාවිතා කරමු. (තවද ප්රකාශනය කිසියම් ආකාරයකින් නිවැරදි යැයි කිසිවෙකු වැරදියට නොසිතන බවට වග බලා ගැනීම සඳහා).
ඔබ "ඔහ්" යන්නෙහි තේරුම "අනුපිළිවෙල අනුව" හෝ "ආසන්න වශයෙන්" කියවන්නේ නම් ඔබ බොහෝ දුරට වැරදියට නොයනු ඇත. (මම හිතන්නේ බිග්-ඕ තෝරා ගැනීම හාස්යය සඳහා වූ උත්සාහයක් විය හැකිය).
මෙම "බිග්-ඕ" ප්රකාශන කිරීමට උත්සාහ කරන එකම දෙය නම් මෘදුකාංගය සැකසීමට ඇති දත්ත ප්රමාණය වැඩි කරන විට මෘදුකාංගය මන්දගාමී වන ආකාරය විස්තර කිරීමයි. සැකසීමට අවශ්ය දත්ත ප්රමාණය මෙන් අපි දෙගුණයක් නම්, මෘදුකාංගය එහි වැඩ අවසන් කිරීමට දෙගුණයක් අවශ්යද? දස ගුණයක් දිග? ප්රායෝගිකව, ඔබට හමු වන විශාල-ඕ ප්රකාශන ඉතා සීමිත සංඛ්යාවක් ඇති අතර ඒ ගැන කරදර විය යුතුය:
යහපත:
O(1)
නියත : ආදානය කොතරම් විශාල වුවත් ක්රියාත්මක වීමට එකම වේලාවක් ගතවේ.O(log n)
ල ar ු ගණකය : ආදානයේ ප්රමාණයෙහි විශාල වැඩිවීම් තිබියදීත්, වැඩසටහනේ ධාවන කාලය වැඩි වන්නේ සෙමින් පමණි.නරක:
O(n)
රේඛීය : වැඩසටහනේ ධාවන කාලය ආදානයේ ප්රමාණයට සමානුපාතිකව වැඩි වේ.O(n^k)
බහුපද : - ආදාන ප්රමාණය වැඩි වන විට සැකසුම් කාලය වේගයෙන් හා වේගයෙන් වර්ධනය වේ - බහුපද ශ්රිතයක් ලෙස.... සහ කැත:
O(k^n)
On ාතීය ගැටලුවේ ප්රමාණයෙහි මධ්යස්ථ වැඩි වීමත් සමඟ වැඩසටහනේ ධාවන කාලය ඉතා ඉක්මණින් වැඩිවේ - on ාතීය ඇල්ගොරිතම සමඟ කුඩා දත්ත කට්ටල සැකසීම ප්රායෝගිකයි.O(n!)
සාධකය වැඩසටහනේ ධාවන කාලය ඔබට ඕනෑම දෙයක් බලා සිටීමට නොහැකි තරම් දිගු වන නමුත් ඉතා කුඩාම හා ඉතා සුළු ලෙස පෙනෙන දත්ත කට්ටල වේ.O(n log n)
එය හොඳ යැයි සැලකේ.
සරල answer ජු පිළිතුරක් විය හැක්කේ:
බිග් ඕ නිරූපණය කරන්නේ එම ඇල්ගොරිතම සඳහා ඇති විය හැකි නරකම කාලය / අවකාශයයි. ඇල්ගොරිතම කිසි විටෙකත් එම සීමාවට වඩා වැඩි ඉඩක් / කාලයක් ගත නොකරනු ඇත. බිග් ඕ නිරූපණය කරන්නේ ආන්තික අවස්ථාවෙහි කාලය / අවකාශයේ සංකීර්ණතාවයි.
හරි, මගේ ශත 2 යි.
බිග්-ඕ යනු වැඩිවීමේ වේගයයි වැඩසටහන මඟින් පරිභෝජනය කරන සම්පත් කිරීමේ
සම්පත්: සම්පූර්ණ-සීපීයූ කාලය විය හැකිය, උපරිම RAM ඉඩ විය හැකිය. පෙරනිමියෙන් CPU වේලාව අදහස් කරයි.
ගැටලුව "එකතුව සොයා ගන්න" යැයි පවසන්න,
int Sum(int*arr,int size){
int sum=0;
while(size-->0)
sum+=arr[size];
return sum;
}
problem-instance = {5,10,15} ==> problem-instance-size = 3, iterations-in-loop = 3
problem-instance = {5,10,15,20,25} ==> problem-instance-size = 5 iterations-in-loop = 5
"N" ප්රමාණයේ ආදානය සඳහා වැඩසටහන අරාවෙහි "n" පුනරාවර්තන වේගයෙන් වර්ධනය වේ. එබැවින් බිග්-ඕ යනු ඕ (එන්) ලෙස ප්රකාශ වේ
ගැටලුව "සංයෝජනය සොයා ගැනීම" යැයි පවසන්න,
void Combination(int*arr,int size)
{ int outer=size,inner=size;
while(outer -->0) {
inner=size;
while(inner -->0)
cout<<arr[outer]<<"-"<<arr[inner]<<endl;
}
}
problem-instance = {5,10,15} ==> problem-instance-size = 3, total-iterations = 3 * 3 = 9
problem-instance = {5,10,15,20,25} ==> problem-instance-size = 5, total-iterations = 5 * 5 = 25
"N" ප්රමාණයේ ආදානය සඳහා වැඩසටහන අරාවෙහි "n * n" පුනරාවර්තන වේගයෙන් වර්ධනය වේ. එබැවින් බිග්-ඕ යනු ඕ 2 (ඕ 2 ) ලෙස ප්රකාශ වේ
බිග් ඕ අංකනය යනු ඇල්ගොරිතමයක ඉහළ සීමාව අවකාශය හෝ ධාවන කාලය අනුව විස්තර කිරීමේ ක්රමයකි. N යනු ගැටලුවේ මූලද්රව්ය ගණන (එනම් අරාවක ප්රමාණය, ගසක ඇති නෝඩ් ගණන ආදිය) n විශාල වන විට ධාවන කාලය විස්තර කිරීමට අපි උනන්දු වෙමු.
සමහර ඇල්ගොරිතම O (f (n)) යැයි අප පවසන විට, අපි කියන්නේ එම ඇල්ගොරිතමයේ ධාවන කාලය (හෝ අවශ්ය අවකාශය) සෑම විටම f (n) නියත කාලවලට වඩා අඩු බවයි.
ද්විමය සෙවුමට O (ලොග්) හි ධාවන කාලයක් ඇති බව පැවසීම යනු ඔබට නියත c පවතින බව පැවසීමයි. එමඟින් ඔබට ලොග් (n) ගුණ කළ හැකි අතර එය සෑම විටම ද්විමය සෙවීමේ ධාවන කාලයට වඩා විශාල වේ. මෙම අවස්ථාවේ දී ඔබට සෑම විටම ලොග් (n) සැසඳීම්වල නියත සාධකයක් ඇත.
වෙනත් වචන වලින් කිවහොත්, ඔබගේ ඇල්ගොරිතමයේ ධාවන කාලය g (n) නම්, අපි කියන්නේ g (n) = O (f (n)) විට g (n) <= c * f (n) n> k, කොහේද? c සහ k යනු නියතයන් වේ.
" බිග් ඕ පිළිබඳ සරල ඉංග්රීසි පැහැදිලි කිරීමක් යනු කුමක්ද? හැකි තරම් විධිමත් අර්ථ දැක්වීමක් සහ සරල ගණිතයක් සහිතව. "
එවැනි ලස්සන හා සරල ප්රශ්නයක් අවම වශයෙන් සමාන කෙටි පිළිතුරක් ලැබිය යුතු බව පෙනේ.
බිග් ඕ අංකනය සරලවම පවසන්නේ ආදාන දත්ත ප්රමාණයට අනුව ඇල්ගොරිතමයක් තුළ කොපමණ කාලයක් ධාවනය කළ හැකිද යන්නයි **.
(* පුදුමාකාර, ඒකක රහිත කාල අර්ථයකින්!)
(** එය වැදගත් වන්නේ, මිනිසුන්ට අද හෝ හෙට ජීවත් වුවද, සෑම විටම වැඩි යමක් අවශ්ය වනු ඇත )
හොඳයි, බිග් ඕ අංකනය එතරම් පුදුම සහගත වන්නේ කුමක් ද?
ප්රායෝගිකව කිවහොත්, බිග් ඕ විශ්ලේෂණය එතරම් ප්රයෝජනවත් හා වැදගත් ය මහා O අවධානය සෘජුව මෙම ඇල්ගොරිතමය ගේ මත තබන නිසා ම සංකීර්ණ සහ සම්පූර්ණයෙන්ම නොසලකා හුදෙක් සමානුපාත නියතය වැනි ජාවාස්ක්රිප්ට් එන්ජින්, සී.පී.යූ. වේගය, ඔබගේ අන්තර්ජාල සම්බන්ධතාවය ඕනෑම දෙයක්, සහ ආදර්ශ ටී තරම් ඉක්මනින් යල් පැන ගිය ඒවා බවට පත්වන සියල්ල . බිග් ඕ කාර්ය සාධනය කෙරෙහි අවධානය යොමු කරන්නේ වර්තමානයේ හෝ අනාගතයේ ජීවත්වන මිනිසුන්ට සමානව වැදගත් වන ආකාරයට පමණි.
බිග් ඕ අංකනය පරිගණක ක්රමලේඛන / ඉංජිනේරු විද්යාවේ වැදගත්ම මූලධර්මය කෙරෙහි සෘජුවම අවධානය යොමු කරයි, මෙය සියලු හොඳ ක්රමලේඛකයින්ට සිතීම හා සිහින දැකීම සඳහා පෙළඹවීමකි: මන්දගාමී ඉදිරි ගමනෙන් ඔබ්බට ප්රති results ල ලබා ගත හැකි එකම ක්රමය වඩා හොඳ සොයා ගැනීමකි. ඇල්ගොරිතම .
ඇල්ගොරිතම උදාහරණය (ජාවා):
// Given a list of integers L, and an integer K
public boolean simple_search(List<Integer> L, Integer K)
{
// for each integer i in list L
for (Integer i : L)
{
// if i is equal to K
if (i == K)
{
return true;
}
}
return false;
}
ඇල්ගොරිතම විස්තරය:
මෙම ඇල්ගොරිතමය ලැයිස්තුවක්, අයිතමයක් අනුව, යතුරක් සොයයි,
ලැයිස්තුවේ ඇති සෑම අයිතමයක්ම අනුකරණය කිරීම, එය යතුර නම් සත්යය නැවත ලබා දෙන්න,
යතුර සොයා නොගෙන ලූපය අවසන් වී ඇත්නම්, අසත්යය ආපසු එවන්න.
බිග්-ඕ අංකනය නිරූපණය කරන්නේ සංකීර්ණතාවයේ ඉහළ මායිමයි (කාලය, අවකාශය, ..)
කාල සංකීර්ණත්වයේ බිග්-ඕ සොයා ගැනීමට:
නරකම අවස්ථාව කොපමණ කාලයක් (ආදාන ප්රමාණය සම්බන්ධයෙන්) ගණනය කරන්න:
නරකම අවස්ථාව: යතුර ලැයිස්තුවේ නොමැත.
කාලය (නරකම අවස්ථාව) = 4n + 1
වේලාව: O (4n + 1) = O (n) | බිග්-ඕ හි නියතයන් නොසලකා හරිනු ලැබේ
O (n) ~ රේඛීය
බිග්-ඔමේගා ද ඇත, එය හොඳම නඩුවේ සංකීර්ණත්වය නියෝජනය කරයි:
හොඳම අවස්ථාව: යතුර පළමු අයිතමයයි.
කාලය (හොඳම අවස්ථාව) = 4
වේලාව: Ω (4) = ඕ (1) ~ ක්ෂණික \ නියත
C
වඩා හොඳ වනු ඇතැයි මම සිතමි
ලොකු ඕ
x a වෙත යන විට f (x) = O ( g (x)) (උදාහරණයක් ලෙස a = + ∞) යන්නෙන් අදහස් වන්නේ k ශ්රිතයක් ඇති බවයි:
f (x) = k (x) g (x)
k යනු යම් අසල්වැසි ප්රදේශයක මායිම් වී ඇත (a = + if නම්, මෙයින් අදහස් වන්නේ සෑම x> N, | k (x) | <M) සඳහා N සහ M සංඛ්යා ඇති බවයි.
වෙනත් වචන වලින් කිවහොත්, සරල ඉංග්රීසියෙන්: f (x) = O ( g (x)), x → a යන්නෙන් අදහස් වන්නේ a හි අසල්වැසි ප්රදේශයක f යනු g හි නිෂ්පාදිතයට හා සමහර සීමිත ශ්රිතයකට දිරාපත් වන බවයි.
කුඩා ඕ
මාර්ගය වන විට, කුඩා o හි අර්ථ දැක්වීම සංසන්දනය කිරීම සඳහා මෙන්න.
x යනු මාධ්යයකට ගිය විට k ශ්රිතයක් ඇති බව f (x) = o ( g (x)):
f (x) = k (x) g (x)
x a වෙත යන විට k (x) 0 ට යයි.
උදාහරණ
x → 0 වන විට sin x = O (x).
sin x = O (1) x → + when විට,
x → 0 විට x 2 + x = O (x),
x → + when විට x 2 + x = O (x 2 ),
x → + when වන විට ln (x) = o (x) = O (x).
අවධානය! "=" යන සමාන ලකුණ සහිත අංකනය "ව්යාජ සමානාත්මතාවයක්" භාවිතා කරයි: o (g (x)) = O (g (x)) බව සත්යයකි, නමුත් O (g (x)) = o (g (x)). ඒ හා සමානව, x → + when වන විට "ln (x) = o (x) ලිවීම සුදුසුය, නමුත්" o (x) = ln (x) "සූත්රය තේරුමක් නැත.
තවත් උදාහරණ
O (1) = O (n) = O (n 2 ) n → + when (නමුත් අනෙක් පැත්තෙන් නොවේ, සමානාත්මතාවය "ව්යාජ" වේ),
N → + when වන විට O (n) + O (n 2 ) = O (n 2 )
N O + when වන විට O (O (n 2 )) = O (n 2 )
O (n 2 ) O (n 3 ) = O (n 5 ) n → + when විට
විකිපීඩියා ලිපිය මෙන්න: https://en.wikipedia.org/wiki/Big_O_notation
බිග් ඕ අංකනය යනු අත්තනෝමතික ආදාන පරාමිතීන් සංඛ්යාවක් ලබා දී ඇල්ගොරිතමයක් කෙතරම් ඉක්මනින් ක්රියාත්මක වේද යන්න විස්තර කිරීමේ ක්රමයකි, එය අපි "n" ලෙස හඳුන්වමු. පරිගණක විද්යාවට එය ප්රයෝජනවත් වන්නේ විවිධ යන්ත්ර විවිධ වේගයකින් ක්රියාත්මක වන නිසා සහ ඇල්ගොරිතමයකට තත්පර 5 ක් ගත වන බව පැවසීම ඔබට බොහෝ දේ නොකියන බැවිනි, මන්ද ඔබ 4.5 Ghz ඔක්ටෝ-කෝර් ප්රොසෙසරයක් සහිත පද්ධතියක් ක්රියාත්මක කරන විට, මම ධාවනය විය හැකිය අවුරුදු 15 ක් පැරණි, 800 Mhz පද්ධතියක් වන අතර එය ඇල්ගොරිතම නොසලකා වැඩි කාලයක් ගතවනු ඇත. එබැවින් කාලය අනුව ඇල්ගොරිතමයක් කොතරම් වේගයෙන් ක්රියාත්මක වේද යන්න සඳහන් කරනවා වෙනුවට, ආදාන පරාමිති ගණන අනුව හෝ "n" අනුව එය කොතරම් වේගයෙන් ක්රියාත්මක වේදැයි අපි කියමු. මේ ආකාරයෙන් ඇල්ගොරිතම විස්තර කිරීමෙන්, පරිගණකයේ වේගය සැලකිල්ලට නොගෙන ඇල්ගොරිතම වල වේගය සංසන්දනය කිරීමට අපට හැකි වේ.
මම මෙම විෂය සඳහා තවදුරටත් දායක වන බව විශ්වාස නැත, නමුත් මම බෙදාගනු ඇතැයි සිතුවෙමි: වරක් මෙම බ්ලොග් සටහන බිග් ඕ පිළිබඳ තරමක් ප්රයෝජනවත් (ඉතා මූලික) පැහැදිලි කිරීම් සහ උදාහරණ ඇති බව මට පෙනී ගියේය:
උදාහරණ හරහා, මෙය මගේ ඉබ්බා වැනි හිස් කබලට හිස් මුලික කරුණු ලබා ගැනීමට උපකාරී විය, එබැවින් මම සිතන්නේ ඔබ නිවැරදි දිශාවට ගමන් කිරීම සඳහා මිනිත්තු 10 ක කියවීමකි.
ලොකු ඕ ගැන දැන ගැනීමට ඇති සියල්ල ඔබට දැන ගැනීමට අවශ්යද? මමත් කරන්නේ එහෙමයි.
ලොකු ඕ ගැන කතා කිරීම සඳහා, මම එක පහරක් පමණක් ඇති වචන භාවිතා කරමි. වචනයට එක් ශබ්දයක්. කුඩා වචන ඉක්මන් ය. ඔබ මෙම වචන දන්නවා, මමත් එහෙමයි. අපි එක ශබ්දයකින් වචන භාවිතා කරමු. ඒවා කුඩා ය. අපි භාවිතා කරන සියලුම වචන ඔබ දැන ගනු ඇතැයි මට විශ්වාසයි!
දැන්, ඔබත් මමත් වැඩ ගැන කතා කරමු. බොහෝ විට මම වැඩට කැමති නැත. ඔබ වැඩට කැමතිද? එය ඔබ කරන කාරණය විය හැකිය, නමුත් මට විශ්වාස නැත මම එසේ නොකරන බව.
මම රැකියාවට යාමට කැමති නැත. මම රැකියාවේ කාලය ගත කිරීමට කැමති නැත. මට මගේ මාර්ගය තිබුනේ නම්, මම කැමතියි සෙල්ලම් කිරීමට හා විනෝදජනක දේවල් කිරීමට. ඔබටත් මට දැනෙන ආකාරයටම දැනෙනවාද?
දැන් සමහර වෙලාවට මට වැඩට යන්න වෙනවා. එය කණගාටුදායක නමුත් සත්යයකි. එබැවින්, මම රැකියාවෙහි යෙදී සිටින විට, මට නීතියක් ඇත: මම අඩු වැඩක් කිරීමට උත්සාහ කරමි. මට හැකි තරම් වැඩකට ආසන්නයි. එහෙනම් මම සෙල්ලම් කරන්න යනවා!
ඉතින් මෙන්න ලොකු ප්රවෘත්තියක්: වැඩ නොකිරීමට ලොකු ඕ මට උදව් කරයි! මට වැඩි කාලයක් ක්රීඩා කළ හැකිය, මම විශාල ඕ. අඩු වැඩක් දන්නේ නම්, වැඩි සෙල්ලම් කරන්න! ලොකු ඕ මට උදව් කරන්නේ එයයි.
දැන් මට වැඩ ටිකක් තියෙනවා. මට මෙම ලැයිස්තුව තිබේ: එකක්, දෙකක්, තුනක්, හතරක්, පහක්, හයක්. මම මේ ලැයිස්තුවේ සියල්ල එකතු කළ යුතුයි.
ඇවැත්නි, මම වැඩට වෛර කරමි. නමුත් ඔහ්, මට මෙය කළ යුතුයි. ඉතින් මෙන්න මම යනවා.
එක් ප්ලස් දෙක තුනයි… ප්ලස් තුන හයයි… හතරයි ... මම දන්නේ නැහැ. මම අතරමං වුණා. මගේ ඔළුවේ කරන්න බැරි තරම් අමාරුයි. මම මේ වගේ වැඩක් ගැන එතරම් තැකීමක් කරන්නේ නැහැ.
ඒ නිසා අපි වැඩ නොකරමු. ඔබත් මමත් සිතමු එය කොතරම් දුෂ්කරද කියා. අංක හයක් එක් කිරීමට මට කොපමණ වැඩ කළ යුතුද?
හොඳයි, අපි බලමු. මම එකක් සහ දෙකක් එකතු කළ යුතු අතර, පසුව එය තුනකට එකතු කර එය හතරකට එකතු කළ යුතුය… සියල්ලට ම, මම එකතු කිරීම් හයක් ගණන් කරමි. මෙය විසඳීම සඳහා මට එකතු කිරීම් හයක් කළ යුතුය.
මෙන්න විශාල ඕ, මේ ගණිතය කෙතරම් දුෂ්කර දැයි අපට කියන්න.
බිග් ඕ පවසයි: මෙය විසඳීම සඳහා අපි එකතු කිරීම් හයක් කළ යුතුය. එක් එකතු කිරීමක්, එක් දෙයක් සඳහා එක් සිට හය දක්වා. කුඩා වැඩ හයක් ... එක් එක් වැඩ ටිකක් එක් එකතු කිරීමකි.
හොඳයි, මම දැන් ඒවා එකතු කිරීමේ කාර්යය නොකරමි. නමුත් මම දන්නවා එය කොතරම් දුෂ්කරද කියා. එය එකතු කිරීම් හයක් වනු ඇත.
අපොයි, දැන් මට තවත් වැඩ තිබේ. ෂීෂ්. කවුද මේ වගේ දේවල් හදන්නේ?!
දැන් ඔවුන් මගෙන් ඉල්ලා සිටින්නේ එක සිට දහය දක්වා එකතු කරන්න! ඇයි මම එහෙම කරන්නේ? එකක් හෝ හයක් එකතු කිරීමට මට අවශ්ය නොවීය. එක සිට දහය දක්වා එකතු කිරීම… හොඳයි… එය ඊටත් වඩා දුෂ්කර වනු ඇත!
ඊට වඩා කොපමණ අපහසු වේද? මට තව කොපමණ වැඩ කළ යුතුද? මට වැඩි හෝ අඩු පියවර අවශ්යද?
හොඳයි, මම හිතන්නේ මට එකතු කිරීම් දහයක් කිරීමට සිදුවේවි… එක් දෙයක් සඳහා එකක් සිට දහය දක්වා. දහය හයට වඩා වැඩිය. එක සිට හය දක්වා එකතු කිරීමට මට තවත් බොහෝ දේ කිරීමට සිදුවනු ඇත!
මට දැන් එකතු කිරීමට අවශ්ය නැත. මට අවශ්ය වන්නේ එතරම් එකතු කිරීම කොතරම් දුෂ්කර ද යන්න ගැන ය. ඒ වගේම, මම බලාපොරොත්තු වෙනවා, මට හැකි ඉක්මනින් ක්රීඩා කිරීමට.
එක සිට හය දක්වා එකතු කිරීම, එය යම් වැඩකි. නමුත් ඔබට පෙනේ, එකක් සිට දහය දක්වා එකතු කිරීම, එය වඩා වැඩක් ද?
බිග් ඕ ඔබේ මිතුරා සහ මගේ ය. බිග් ඕ අපට කළ යුතු වැඩ ගැන සිතා බැලීමට උපකාරී වේ, එබැවින් අපට සැලසුම් කළ හැකිය. තවද, අපි ලොකු ඕ සමඟ මිතුරන් නම්, එතරම් අපහසු නොවන වැඩක් තෝරා ගැනීමට ඔහුට උදව් කළ හැකිය!
දැන් අපි අලුත් වැඩක් කළ යුතුයි. ඔහ්, නැහැ. මම මේ වැඩේ කොහෙත්ම කැමති නැහැ.
නව කාර්යය නම්: සියල්ල සිට එක දක්වා එකතු කරන්න.
ඉන්න! N යනු කුමක්ද? මට එය මග හැරුණාද? N යනු කුමක්දැයි ඔබ මට නොකියන්නේ නම් මම එක සිට n දක්වා එකතු කරන්නේ කෙසේද?
හොඳයි, මම දන්නේ නැහැ n කියන්නේ මොකක්ද කියලා. මට කිව්වේ නැහැ. ඔයාද? නොමැත? හා හොඳයි. ඒ නිසා අපට වැඩ කරන්න බැහැ. තිරිඟු.
නමුත් අපි දැන් එම කාර්යය නොකරනු ඇතත්, අප n දැන සිටියේ නම් එය කෙතරම් දුෂ්කර වනු ඇත්දැයි අපට අනුමාන කළ හැකිය. අපිට දේවල් එකතු කරන්න වෙනවා නේද? ඇත්ත වශයෙන්!
දැන් මෙන්න ලොකු ඕ එනවා, මේ වැඩේ කොච්චර අමාරුද කියලා ඔහු අපිට කියයි. ඔහු මෙසේ කියයි: සෑම දෙයක්ම එකින් එක N ට එකතු කිරීම, එකින් එක, O (n) වේ. මේ සියල්ල එකතු කිරීමට, [මම n වාරයක් එකතු කළ යුතු බව මම දනිමි.] [1] එය විශාල ඕ! යම් ආකාරයක වැඩක් කිරීම කොතරම් දුෂ්කර දැයි ඔහු අපට කියයි.
මට නම් මම හිතන්නේ ලොකු ඕ ගැන ලොකු, මන්දගාමී, ලොක්කා වගේ. ඔහු වැඩ ගැන සිතන නමුත් ඔහු එය නොකරයි. "එම කාර්යය ඉක්මන්" යැයි ඔහු පැවසිය හැකිය. නැතහොත්, "එම කාර්යය ඉතා මන්දගාමී හා දුෂ්කර ය!" නමුත් ඔහු වැඩ කරන්නේ නැහැ. ඔහු කාර්යය දෙස පමණක් බලා, ඊට කොපමණ කාලයක් ගතවේදැයි ඔහු අපට කියයි.
මම ලොකු ඕ ගැන ගොඩක් සැලකිලිමත් වෙනවා. ඇයි? මම වැඩ කිරීමට කැමති නැත! කිසිවෙකු වැඩ කිරීමට කැමති නැත. අපි හැමෝම ලොකු ඕට ආදරය කරන්නේ එබැවිනි. අපට කොතරම් වේගයෙන් වැඩ කළ හැකිදැයි ඔහු අපට කියයි. වෙහෙස මහන්සි වී වැඩ කිරීම ගැන සිතීමට ඔහු අපට උපකාර කරයි.
අහ්, තවත් වැඩ. දැන් අපි වැඩ නොකරමු. නමුත්, පියවරෙන් පියවර එය කිරීමට සැලැස්මක් කරමු.
ඔවුන් අපට කාඩ්පත් දහයක තට්ටුවක් ලබා දුන්නා. ඒවා සියල්ලම මිශ්ර වී ඇත: හත, හතර, දෙක, හය… කෙලින්ම නොවේ. දැන් ... අපේ කාර්යය වන්නේ ඒවා වර්ග කිරීමයි.
අර්ග්. ඒක ගොඩක් වැඩ වගේ!
අපි කොහොමද මේ තට්ටුව වර්ග කරන්නේ? මට සැලසුමක් ඇත.
මම සෑම කාඩ්පත් යුගලයක්ම, යුගල වශයෙන් යුගල වශයෙන්, තට්ටුව හරහා, පළමු සිට අන්තිම දක්වා බලන්නෙමි. එක් යුගලයක පළමු කාඩ්පත විශාල නම් සහ එම යුගලයේ ඊළඟ කාඩ්පත කුඩා නම්, මම ඒවා මාරු කරමි. නැතහොත්, මම ඊළඟ යුගලයට යන්නෙමි, සහ එසේ ය ... සහ ඉක්මනින් ... තට්ටුව අවසන් වේ.
තට්ටුව අවසන් වූ විට, මම අසමි: මම එම අවසර පත්රයේ කාඩ්පත් මාරු කළාද? එසේ නම්, මම නැවත වරක් ඉහළ සිට එය කළ යුතුය.
යම් අවස්ථාවක දී, යම් වේලාවක, හුවමාරුවක් සිදු නොවනු ඇති අතර, අපගේ තට්ටුව වර්ග කිරීම සිදු කරනු ඇත. ගොඩාක් වැඩ!
හොඳයි, එම නීති සමඟ කාඩ්පත් වර්ග කිරීම සඳහා කොපමණ වැඩ කොටසක් කළ හැකිද?
මට කාඩ්පත් දහයක් තිබේ. තවද, බොහෝ විට - එනම්, මට වාසනාව නොමැති නම් - මම මුළු තට්ටුව හරහා දස ගුණයක් දක්වා යා යුතු අතර, සෑම අවස්ථාවකදීම කාඩ්පත් දහයක් දක්වා තට්ටුව හරහා ගමන් කළ යුතුය.
ලොකු ඕ, මට උදව් කරන්න!
බිග් ඕ පැමිණ මෙසේ කියයි: n කාඩ්පත් තට්ටුවක් සඳහා, මේ ආකාරයට එය වර්ග කිරීම O (N වර්ග) වේලාවේදී සිදු කෙරේ.
ඇයි ඔහු n වර්ග යැයි කියන්නේ?
හොඳයි, ඔබ දන්නවා n වර්ග n n වාරයක් n. දැන්, මට එය ලැබුණි: කාඩ්පත් n පරික්ෂා කර ඇත, තට්ටුව හරහා n වාරයක් විය හැකි දේ දක්වා. එය ලූප දෙකක් වන අතර, එක් එක් පියවර n ඇත. එය වර්ග කළ යුතු වැඩකි. ගොඩක් වැඩ, නිසැකවම!
දැන් ලොකු ඕ කියද්දී ඕ (එන් වර්ග) වැඩක් ගත වේ යැයි ඔහු අදහස් කරන්නේ නැත, නාසය මත වර්ග එකතු කිරීමක් අදහස් නොවේ. සමහර විට එය ටිකක් අඩු විය හැකිය. නමුත් නරකම අවස්ථාවෙහිදී, එය තට්ටුව වර්ග කිරීම සඳහා වර්ග අඩි n වැඩකට ආසන්න වනු ඇත.
දැන් මෙන්න ලොකු ඕ අපේ මිතුරා.
බිග් ඕ මෙය පෙන්වා දෙයි: n විශාල වන විට, අපි කාඩ්පත් වර්ග කරන විට, රැකියාව හුදෙක් එකතු කරන මේ දේවල් වලට වඩා බොහෝ දුෂ්කර වේ. අපි මෙය දන්නේ කෙසේද?
හොඳයි, n විශාල වුවහොත්, අපි n හෝ n වර්ග වලට එකතු කරන්නේ කුමක් දැයි අපි ගණන් ගන්නේ නැත.
විශාල n සඳහා, n වර්ග n ට වඩා විශාල වේ.
බිග් ඕ අපට පවසන්නේ දේවල් එකතු කිරීමට වඩා දේවල් වර්ග කිරීම දුෂ්කර බවයි. O (n වර්ග) විශාල n සඳහා O (n) ට වඩා වැඩිය. එයින් අදහස් වන්නේ: n විශාල වුවහොත්, n මිශ්රිත තට්ටුවක් වර්ග කිරීමට, මිශ්ර දේවල් n එකතු කිරීමට වඩා වැඩි කාලයක් ගත විය යුතුය.
බිග් ඕ අප වෙනුවෙන් වැඩ විසඳන්නේ නැත. බිග් ඕ අපට කියන්නේ වැඩ කොතරම් දුෂ්කරද යන්නයි.
මට කාඩ්පත් තට්ටුවක් තිබේ. මම ඒවා වර්ග කළා. ඔබ උදව් කළා. ස්තූතියි.
කාඩ්පත් වර්ග කිරීමට වඩා වේගවත් ක්රමයක් තිබේද? ලොකු ඕ අපට උදව් කළ හැකිද?
ඔව්, වඩා වේගවත් ක්රමයක් තිබේ! ඉගෙන ගැනීමට යම් කාලයක් ගත වේ, නමුත් එය ක්රියාත්මක වේ ... එය ඉතා වේගයෙන් ක්රියාත්මක වේ. ඔබටත් එය උත්සාහ කළ හැකිය, නමුත් එක් එක් පියවර සමඟ ඔබේ කාලය ගත කරන්න, ඔබේ ස්ථානය අහිමි නොකරන්න.
තට්ටුවක් වර්ග කිරීම සඳහා මෙම නව ක්රමයේදී, අපි ටික කලකට පෙර කළ ආකාරයට කාඩ්පත් යුගල පරීක්ෂා නොකරමු. මෙම තට්ටුව වර්ග කිරීම සඳහා ඔබගේ නව නීති මෙන්න:
එකක්: මම දැන් වැඩ කරන තට්ටුවේ එක් කාඩ්පතක් තෝරා ගනිමි. ඔබ කැමති නම් ඔබට මා වෙනුවෙන් එකක් තෝරා ගත හැකිය. (අප මෙය කරන පළමු අවස්ථාව, “අපි දැන් වැඩ කරන තට්ටුවේ කොටස” ඇත්ත වශයෙන්ම මුළු තට්ටුවයි.)
දෙක: ඔබ තෝරාගත් කාඩ් පතේ මම තට්ටුව ඉසිමි. මොකක්ද මේ ස්ප්ලේ; මම ඉසින්නේ කෙසේද? හොඳයි, මම ආරම්භක කාඩ්පතේ සිට එකින් එක පහළට යන අතර, මම ස්ප්ලේ කාඩ්පතට වඩා ඉහළ කාඩ්පතක් සොයමි.
තුන: මම අවසාන කාඩ්පතේ සිට ඉහළට යන අතර, මම ස්ප්ලේ කාඩ්පතට වඩා අඩු කාඩ්පතක් සොයමි.
මම මෙම කාඩ්පත් දෙක සොයාගත් පසු, මම ඒවා මාරු කර, හුවමාරු කර ගැනීම සඳහා තවත් කාඩ්පත් සොයමි. එනම්, මම දෙවන පියවර වෙත ආපසු ගොස් ඔබ තෝරාගත් කාඩ් පතෙහි ඉසින්න.
යම් අවස්ථාවක දී, මෙම ලූපය (දෙකේ සිට තුන දක්වා) අවසන් වේ. මෙම සෙවුමේ අර්ධ දෙකම ස්ප්ලේ කාඩ්පතේදී හමු වූ විට එය අවසන් වේ. පළමු පියවරේදී ඔබ තෝරාගත් කාඩ් පත සමඟ අපි තට්ටුව ඉසිමු. දැන්, ආරම්භය අසල ඇති සියලුම කාඩ්පත් ස්ප්ලේ කාඩ්පතට වඩා අඩුය; අවසානය අසල ඇති කාඩ්පත් ස්ප්ලේ කාඩ්පතට වඩා වැඩිය. සිසිල් උපක්රමය!
හතරක් (සහ මෙය විනෝදජනක කොටසයි): මට දැන් කුඩා තට්ටු දෙකක් තිබේ, එකක් ස්ප්ලේ කාඩ්පතට වඩා අඩු සහ තවත් එකක්. දැන් මම සෑම කුඩා තට්ටුවකම පළමු පියවරට යන්නෙමි! එනම්, මම පළමු කුඩා තට්ටුවේ පළමු පියවරේ සිට ආරම්භ කරන අතර, එම කාර්යය අවසන් වූ විට, මම ඊළඟ කුඩා තට්ටුවේ පළමු පියවරෙන් ආරම්භ කරමි.
මම තට්ටුව කොටස් වශයෙන් කැඩී, එක් එක් කොටස වඩාත් කුඩා හා කුඩා ලෙස වර්ග කරමි, සමහර විට මට තවත් වැඩක් නැත. දැන් මෙය සියලු නීති සමඟ මන්දගාමී බවක් පෙනෙන්නට තිබේ. නමුත් මාව විශ්වාස කරන්න, එය කිසිසේත් මන්දගාමී නොවේ. දේවල් වර්ග කිරීමේ පළමු ක්රමයට වඩා එය අඩු වැඩකි!
මේ ආකාරයේ හැඳින්වෙන්නේ කුමක්ද? එය ඉක්මන් වර්ග කිරීම ලෙස හැඳින්වේ! CAR Hoare නම් මිනිසෙකු විසින් එවැනි වර්ග කිරීම සිදු කරන ලද අතර ඔහු එය ඉක්මන් වර්ග කිරීම ලෙස හැඳින්වීය. දැන්, ඉක්මන් වර්ග කිරීම සෑම විටම භාවිතා වේ!
ක්ෂණික වර්ග කිරීම කුඩා ඒවාවල විශාල තට්ටු බිඳ දමයි. එනම්, එය කුඩා කාර්යයන් තුළ විශාල කාර්යයන් බිඳ දමයි.
හ්ම්ම්. එහි නීතියක් තිබිය හැකිය, මම සිතමි. විශාල කාර්යයන් කුඩා කිරීමට, ඒවා බිඳ දමන්න.
මෙම වර්ග කිරීම තරමක් ඉක්මන් ය. කෙතරම් ඉක්මන් ද? බිග් ඕ අපට කියයි: මෙම වර්ග කිරීම සඳහා ඕ (එන් ලොග් එන්) වැඩ කිරීම අවශ්ය වේ.
එය පළමු වර්ගයට වඩා වැඩි හෝ අඩු වේගවත් ද? ලොකු ඕ, කරුණාකර උදව් කරන්න!
පළමු වර්ග කිරීම O (n වර්ග) විය. නමුත් ක්ෂණික වර්ග කිරීම O (n log n) වේ. විශාල n සඳහා, n ලොග් n වර්ගයට වඩා අඩු බව ඔබ දන්නවාද? හොඳයි, ඉක්මන් වර්ග කිරීම වේගවත් බව අපි දනිමු!
ඔබට තට්ටුවක් වර්ග කිරීමට සිදුවුවහොත් හොඳම ක්රමය කුමක්ද? හොඳයි, ඔබට අවශ්ය දේ ඔබට කළ හැකිය, නමුත් මම ඉක්මන් වර්ග කිරීම තෝරා ගනිමි.
මම ඉක්මන් වර්ග කිරීම තෝරා ගන්නේ ඇයි? මම වැඩ කිරීමට කැමති නැත, ඇත්ත වශයෙන්ම! මට එය කළ හැකි ඉක්මනින් වැඩ කිරීමට අවශ්යයි.
ඉක්මන් වර්ග කිරීම අඩු වැඩක් බව මා දැන ගන්නේ කෙසේද? O (n log n) O (n වර්ග) ට වඩා අඩු බව මම දනිමි. Os වඩා කුඩා බැවින් ඉක්මන් වර්ග කිරීම අඩු වැඩකි!
දැන් ඔබ දන්නවා මගේ මිතුරා, බිග් ඕ. අඩු වැඩ කිරීමට ඔහු අපට උදව් කරයි. ඔබ විශාල O ගැන දන්නවා නම්, ඔබට අඩු වැඩක් කළ හැකිය!
ඔබ ඒ සියල්ල මා සමඟ ඉගෙන ගත්තා! ඔබ හරිම දක්ෂයි! ඔයාට බොහෝම ස්තූතියි!
දැන් ඒ වැඩේ ඉවරයි, අපි සෙල්ලම් කරමු!
[1]: සෑම දෙයක්ම එක වර සිට වංචා කිරීමට හා එක් කිරීමට එක් ක්රමයක් ඇත. ගෝස් නම් සමහර ළමයෙක් මේ බව දැනගත්තේ ඔහුට වයස අවුරුදු අටේදීය. මම එතරම් දක්ෂ නැහැ, ඒ නිසා ඔහු එය කළේ කෙසේදැයි මගෙන් අහන්න එපා .
කාල සංකීර්ණතාව ගණනය කිරීම සඳහා ඔහු වඩාත් සුලභ මෙට්රික් එකක් වන්නේ කාල සංකීර්ණතාව තේරුම් ගැනීමට මට වඩා සරල ක්රමයක් බිග් ඕ අංකනයයි. N අනන්තය කරා ළඟා වන විට N ට සාපේක්ෂව ධාවන කාලය තක්සේරු කළ හැකි වන පරිදි මෙය සියලු නියත සාධක ඉවත් කරයි. පොදුවේ ඔබට මේ ගැන සිතිය හැකිය:
statement;
නියතයි. N ට සාපේක්ෂව ප්රකාශයේ ධාවන කාලය වෙනස් නොවේ
for ( i = 0; i < N; i++ )
statement;
රේඛීය වේ. ලූපයේ ධාවන කාලය N ට සමානුපාතික වේ. N දෙගුණ වන විට ධාවන කාලය ද එසේමය.
for ( i = 0; i < N; i++ )
{
for ( j = 0; j < N; j++ )
statement;
}
චතුරස්රාකාර වේ. ලූප දෙකේ ධාවන කාලය N වර්ගයට සමානුපාතික වේ. N දෙගුණ වන විට, ධාවන කාලය N * N කින් වැඩි වේ.
while ( low <= high )
{
mid = ( low + high ) / 2;
if ( target < list[mid] )
high = mid - 1;
else if ( target > list[mid] )
low = mid + 1;
else break;
}
ල ar ු ගණකය වේ. ඇල්ගොරිතමයේ ධාවන කාලය N 2 න් බෙදිය හැකි වාර ගණනට සමානුපාතික වේ. මෙයට හේතුව ඇල්ගොරිතම එක් එක් නැවතීමේ ක්රියාවලිය සමඟ වැඩ කරන ප්රදේශය අඩකින් බෙදීමයි.
void quicksort ( int list[], int left, int right )
{
int pivot = partition ( list, left, right );
quicksort ( list, left, pivot - 1 );
quicksort ( list, pivot + 1, right );
}
N * ලොග් (N) වේ. ධාවන කාලය ල ar ු ගණක N ලූප (පුනරාවර්තන හෝ පුනරාවර්තන) වලින් සමන්විත වේ, එබැවින් ඇල්ගොරිතම යනු රේඛීය හා ල ar ු ගණකයේ එකතුවකි.
පොදුවේ ගත් කල, සෑම අයිතමයක් සමඟම එක් මානයකින් යමක් කිරීම රේඛීය වේ, සෑම අයිතමයක් සමඟම මානයන් දෙකකින් යමක් කිරීම චතුරස්රාකාර වන අතර, වැඩ කරන ප්රදේශය අඩකින් බෙදීම ල ar ු ගණකය වේ. Big න, on ාතීය සහ වර්ග මූල වැනි වෙනත් විශාල O මිනුම් ඇත, නමුත් ඒවා එතරම් පොදු නොවේ. බිග් ඕ අංකනය O () ලෙස විස්තර කෙරේ. ක්වික්සෝර්ට් ඇල්ගොරිතම O (N * log (N)) ලෙස විස්තර කෙරේ.
සටහන: මේ කිසිවක් හොඳම, සාමාන්ය හා නරකම පියවර සැලකිල්ලට ගෙන නොමැත. සෑම කෙනෙකුම තමන්ගේම බිග් ඕ අංකනයක් ඇත. මෙය ඉතා සරල පැහැදිලි කිරීමක් බව සලකන්න. බිග් ඕ වඩාත් සුලභ ය, නමුත් එය මා පෙන්වා ඇති වඩා සංකීර්ණ ය. ලොකු ඔමේගා, කුඩා ඕ, සහ විශාල තේටා වැනි වෙනත් අංකනයන් ද ඇත. ඇල්ගොරිතම විශ්ලේෂණ පා .මාලාවෙන් පිටතදී ඔබට ඒවා හමු නොවනු ඇත.
ඔබ හැරී පොටර් ඇණවුම් කළ බව පවසන්න: ඇමේසන් වෙතින් චිත්රපට 8 ක එකතුවක් (බ්ලූ-රේ] සම්පූර්ණ කර එකම චිත්රපට එකතුව අන්තර්ජාලය හරහා බාගත කරන්න. කුමන ක්රමය වේගවත් දැයි පරීක්ෂා කිරීමට ඔබට අවශ්යය. භාරදීමට දිනකට ආසන්න කාලයක් ගත වන අතර බාගත කිරීම විනාඩි 30 කට පමණ පෙර අවසන් විය. මහා! එබැවින් එය දැඩි තරඟයකි.
මම ලෝඩ් ඔෆ් ද රින්ග්ස්, ට්විටයිට්, ද ඩාර්ක් නයිට් ට්රයිලොජි වැනි බ්ලූ-රේ චිත්රපට කිහිපයක් ඇණවුම් කර සියලු චිත්රපට එකවර අන්තර්ජාලයෙන් බාගත කළහොත් කුමක් කළ යුතුද? මෙම අවස්ථාවේදී, භාරදීම සම්පූර්ණ කිරීමට දිනක් ගත වුවද අන්තර්ජාල බාගත කිරීම අවසන් වීමට දින 3 ක් ගතවේ. සබැඳි සාප්පු සවාරි සඳහා, මිලදී ගත් අයිතම ගණන (ආදානය) බෙදා හැරීමේ වේලාවට බලපාන්නේ නැත. ප්රතිදානය නියත ය. අපි මෙය O (1) ලෙස හඳුන්වමු .
සබැඳි බාගත කිරීම සඳහා, බාගැනීමේ කාලය චිත්රපට ගොනු ප්රමාණයන්ට (ආදානය) කෙලින්ම සමානුපාතික වේ. අපි මෙය O (n) ලෙස හඳුන්වමු .
අත්හදා බැලීම් වලින්, සබැඳි බාගත කිරීම් වලට වඩා මාර්ගගත සාප්පු පරිමාණයන් වඩා හොඳ බව අපි දනිමු. විශාල O අංකනය තේරුම් ගැනීම ඉතා වැදගත් වන්නේ එය ඇල්ගොරිතමවල පරිමාණය හා කාර්යක්ෂමතාව විශ්ලේෂණය කිරීමට උපකාරී වන බැවිනි .
සටහන: බිග් ඕ අංකනය නිරූපණය කරන්නේ ඇල්ගොරිතමයක නරකම අවස්ථාවයි. O (1) සහ O (n) ඉහත උදාහරණයේ නරකම අවස්ථා යැයි උපකල්පනය කරමු .
යොමුව : http://carlcheo.com/compsci
අපි කතා කරන්නේ A ඇල්ගොරිතමයක් ගැන යැයි සිතමු, එය n ප්රමාණයේ දත්ත කට්ටලයක් සමඟ යමක් කළ යුතුය .
එවිට O( <some expression X involving n> )
සරල ඉංග්රීසියෙන්:
A ක්රියාත්මක කිරීමේදී ඔබ අවාසනාවන්ත නම්, එය සම්පූර්ණ කිරීමට X (n) තරම් කාලයක් ගතවනු ඇත.
එය සිදු වන විට, ඇතැම් කාර්යයන් ඇත (ඒවා X (n) ක්රියාත්මක කිරීමක් ලෙස සිතන්න) ඒවා බොහෝ විට සිදු වේ. මෙම ප්රසිද්ධ සහ පහසුවෙන් (උදාහරණ: සංසන්දනය කරන , , , , , ආදිය ..)1
Log N
N
N^2
N!
A සහ වෙනත් ඇල්ගොරිතම ගැන කතා කිරීමේදී මේවා සංසන්දනය කිරීමෙන් , ඇල්ගොරිතම සම්පූර්ණ කිරීමට අවශ්ය විය හැකි මෙහෙයුම් ගණන අනුව (නරකම අවස්ථාව) ශ්රේණිගත කිරීම පහසුය .
පොදුවේ ගත් කල, අපගේ ඉලක්කය වනුයේ A ඇල්ගොරිතමයක් සොයා ගැනීම හෝ සැකසීම ය. එමඟින් හැකි X(n)
තරම් අඩු සංඛ්යාවක් ආපසු ලබා දෙන ශ්රිතයක් ඇත.
ඔබේ හිසෙහි අනන්තය පිළිබඳ සුදුසු අදහසක් තිබේ නම්, ඉතා කෙටි විස්තරයක් ඇත:
බිග් ඕ අංකනය ඔබට අසීමිත විශාල ගැටලුවක් විසඳීමේ පිරිවැය කියයි.
තව දුරටත්
නිරන්තර සාධක නොසැලකිලිමත් ය
ඔබේ ඇල්ගොරිතම මෙන් දෙගුණයක් වේගයෙන් ධාවනය කළ හැකි පරිගණකයකට ඔබ උත්ශ්රේණි කළහොත්, විශාල ඕ අංකනය එය නොදකිනු ඇත. විශාල සාධක අංකනය සමඟ ක්රියා කරන පරිමාණයෙන් නිරන්තර සාධක වැඩිදියුණු කිරීම් පවා කුඩා වේ. මෙය විශාල O අංකනය සැලසුම් කිරීමේ හිතාමතාම කොටසක් බව සලකන්න.
කෙසේ වෙතත්, නියත සාධකයකට වඩා “විශාල” කිසිවක් හඳුනාගත හැකි වුවද.
ආසන්න වශයෙන් අනන්තය ලෙස සැලකිය හැකි තරම් විශාල “විශාල” ගණනය කිරීම් කිරීමට ඔබ උනන්දු වන විට, විශාල O අංකනය යනු ඔබේ ගැටළුව විසඳීමේ පිරිවැය ආසන්න වශයෙන් වේ.
ඉහත සඳහන් තේරුමක් නැතිනම්, ඔබේ හිසෙහි අනන්තය පිළිබඳ අනුකූල බුද්ධිමය අදහසක් ඔබට නොමැති අතර, ඉහත සඳහන් සියල්ල ඔබ නොසලකා හැරිය යුතුය; මෙම අදහස් දැඩි කිරීමට හෝ ඒවා දැනටමත් සිතාමතාම ප්රයෝජනවත් නොවේ නම් ඒවා පැහැදිලි කිරීමට මා දන්නා එකම ක්රමය නම් මුලින්ම ඔබට විශාල O අංකනය හෝ ඒ හා සමාන දෙයක් ඉගැන්වීමයි. (අනාගතයේ දී ඔබ විශාල O අංකනය හොඳින් වටහා ගත් පසු, මෙම අදහස් නැවත බැලීම වටී)
“බිග් ඕ” අංකනය පිළිබඳ සරල ඉංග්රීසි පැහැදිලි කිරීමක් යනු කුමක්ද?
ඉතා ඉක්මන් සටහන:
“බිග් ඕ” හි ඇති ඕ යන්න “ඇණවුම” (හෝ හරියටම “අනුපිළිවෙල”) ලෙස හැඳින්වේ,
එබැවින් ඔබට එය සැසඳීමට යමක් ඇණවුම් කිරීමට භාවිතා කරන බවට එහි අදහස වචනාර්ථයෙන් ලබා ගත හැකිය.
"බිග් ඕ" කාරණා දෙකක් කරයි:
Notations
.වැඩිපුරම භාවිතා කළ අංක 7 ක් ඇත
1
පියවරෙන් පියවර , එය විශිෂ්ටයි, අංක 1 ඇණවුම් කර ඇතlogN
පියවරෙන් පියවර , එහි හොඳ, ඇණවුම් කළ අංක 2N
පියවරෙන් පියවරක් , එහි සාධාරණ, ඇණවුම අංක 3O(NlogN)
පියවරක් , එය හොඳ නැත, අංක 4 ඇණවුමN^2
පියවර , එය නරකයි, අංක 5 ඇණවුම2^N
පියවර , එය භයානකයි, අංක 6 ඇණවුමN!
පියවරෙන් පියවර කාර්යයක් කරන්න , එය භයානකයි, අංක 7 ඇණවුමඔබට අංකනය ලැබේ යැයි සිතමු, ඔබ O(N^2)
විසින් ක්රමවේදය මඟින් කාර්යයක් ඉටු කිරීම සඳහා N * N පියවර ගත යුතු බව පැහැදිලි වනවා පමණක් නොව, O(NlogN)
එහි ශ්රේණිගත කිරීම අනුව එය හොඳ නොවන බව ඔබට පෙනේ .
ඔබේ හොඳ අවබෝධය සඳහා කරුණාකර ඇණවුම පේළියේ සටහන් කරන්න. සියලු හැකියාවන් සලකා බැලුවහොත් අංක 7 කට වඩා තිබේ.
CS හි, කර්තව්යයක් ඉටු කිරීම සඳහා වන පියවර සමූහය ඇල්ගොරිතම ලෙස හැඳින්වේ.
පාරිභාෂිතය තුළ, ඇල්ගොරිතමයක ක්රියාකාරීත්වය හෝ සංකීර්ණත්වය විස්තර කිරීම සඳහා බිග් ඕ අංකනය භාවිතා කරයි.
ඊට අමතරව, බිග් ඕ නරකම අවස්ථාව තහවුරු කරයි හෝ ඉහළ මායිම් පියවර මැනිය.
හොඳම අවස්ථාව සඳහා ඔබට බිග්- Ω (බිග්-ඔමේගා) වෙත යොමු විය හැකිය.
බිග්- Ω (බිග්-ඔමේගා) අංකනය (ලිපිය) | ඛාන් ඇකඩමිය
සාරාංශය
"බිග් ඕ" ඇල්ගොරිතමයේ ක්රියාකාරිත්වය විස්තර කරන අතර එය ඇගයීමට ලක් කරයි.
හෝ විධිමත් ලෙස ආමන්ත්රණය කරන්න, "බිග් ඕ" ඇල්ගොරිතම වර්ගීකරණය කර සංසන්දනය කිරීමේ ක්රියාවලිය ප්රමිතිකරණය කරයි.
එය බැලීමට සරලම ක්රමය (සරල ඉංග්රීසියෙන්)
අපි උත්සාහ කරන්නේ ආදාන පරාමිතීන් ගණන, ඇල්ගොරිතමයක ධාවන කාලයට බලපාන්නේ කෙසේද යන්නයි. ඔබගේ යෙදුමේ ධාවන කාලය ආදාන පරාමිති ගණනට සමානුපාතික නම්, එය n හි විශාල O හි ඇති බව කියනු ලැබේ.
ඉහත ප්රකාශය හොඳ ආරම්භයක් නමුත් සම්පූර්ණයෙන්ම සත්ය නොවේ.
වඩාත් නිවැරදි පැහැදිලි කිරීමක් (ගණිතමය)
සිතමු
n = ආදාන පරාමිතීන් ගණන
T (n) = ඇල්ගොරිතමයේ ධාවන කාලය n හි ශ්රිතයක් ලෙස ප්රකාශ කරන සත්ය ශ්රිතය
c = නියතයක්
f (n) = ඇල්ගොරිතමයේ ධාවන කාලය n හි ශ්රිතයක් ලෙස ප්රකාශ කරන දළ ශ්රිතයකි
බිග් ඕ සම්බන්ධයෙන් ගත් කල, පහත දැක්වෙන කොන්දේසිය සත්ය වන තාක් දුරට f (n) ආසන්න කිරීම හොඳ යැයි සැලකේ.
lim T(n) ≤ c×f(n)
n→∞
N අනන්තය කරා ළඟා වන විට සමීකරණය කියවනු ලැබේ, n හි T, n හි c ගුණයකට වඩා අඩු හෝ සමාන වේ.
විශාල O අංකනයෙන් මෙය ලියා ඇත
T(n)∈O(n)
T හි n විශාල O හි ඇති බැවින් මෙය කියවනු ලැබේ.
නැවත ඉංග්රීසි වෙත
ඉහත ගණිතමය අර්ථ දැක්වීම මත පදනම්ව, ඔබේ ඇල්ගොරිතම n හි විශාල O යැයි ඔබ කියන්නේ නම්, එයින් අදහස් වන්නේ එය n (ආදාන පරාමිති ගණන) හෝ වේගවත් ශ්රිතයක් බවයි. ඔබේ ඇල්ගොරිතමය n හි විශාල O නම්, එය ස්වයංක්රීයව n වර්ගයේ විශාල O වේ.
බිග් ඕ ඔෆ් එන් යන්නෙන් අදහස් කරන්නේ මගේ ඇල්ගොරිතම අවම වශයෙන් මේ තරම් වේගයෙන් ධාවනය වන බවයි. ඔබේ ඇල්ගොරිතමයේ බිග් ඕ අංකනය දෙස බලා එහි මන්දගාමී බව ඔබට පැවසිය නොහැක. ඔබට කිව හැක්කේ එහි නිරාහාරය පමණි.
යූසී බර්ක්ලි වෙතින් බිග් ඕ පිළිබඳ වීඩියෝ නිබන්ධනයක් සඳහා මෙය පරීක්ෂා කරන්න . එය ඇත්ත වශයෙන්ම සරල සංකල්පයකි. මහාචාර්ය ෂෙව්චක් (දෙවියන්ගේ මට්ටමේ ගුරුවරයා) එය පැහැදිලි කිරීම ඔබට ඇසුනේ නම්, ඔබ කියනු ඇත්තේ "අනේ එපමණයි!".
විශාල ගණිතය පිළිබඳ විශාල පැහැදිලි කිරීමක් මට හමු විය, විශේෂයෙන් ගණිතයට එතරම් උනන්දුවක් නොදක්වන අයෙකුට.
https://rob-bell.net/2009/06/a-beginners-guide-to-big-o-notation/
ඇල්ගොරිතමයක ක්රියාකාරීත්වය හෝ සංකීර්ණත්වය විස්තර කිරීම සඳහා පරිගණක විද්යාවේ බිග් ඕ අංකනය භාවිතා කරයි. බිග් ඕ විශේෂයෙන් නරකම අවස්ථාව විස්තර කරන අතර, ක්රියාත්මක කිරීමේ වේලාව හෝ ඇල්ගොරිතමයක් මඟින් භාවිතා කළ අවකාශය (උදා: මතකයේ හෝ තැටියේ) විස්තර කිරීමට භාවිතා කළ හැකිය.
ක්රමලේඛන මුතු හෝ වෙනත් පරිගණක විද්යා පොත් කියවා ගණිතය පිළිබඳ පදනමක් නොමැති ඕනෑම අයෙක් ඕ (එන් ලොග් එන්) හෝ වෙනත් පිස්සු වාක්ය ඛණ්ඩයක් සඳහන් පරිච්ඡේද වෙත ළඟා වූ විට බිත්තියකට පහර දෙනු ඇත. බිග් ඕ සහ ල ar ු ගණකවල මූලික කරුණු පිළිබඳ අවබෝධයක් ලබා ගැනීමට මෙම ලිපිය ඔබට උපකාරී වනු ඇතැයි අපේක්ෂා කරමු.
පළමුව ක්රමලේඛකයෙකු ලෙස සහ ගණිත ian යෙකු ලෙස (හෝ තෙවන හෝ හතරවන) බිග් ඕ හොඳින් වටහා ගැනීමට හොඳම ක්රමය කේතයේ උදාහරණ කිහිපයක් ඉදිරිපත් කිරීමයි. එබැවින්, හැකි සෑම තැනකම විස්තර සහ උදාහරණ සමඟ පොදු වර්ධන නියෝග කිහිපයක් පහත දැක්වේ.
ඕ (1)
O (1) ආදාන දත්ත කට්ටලයේ ප්රමාණය නොසලකා සෑම විටම එකම වේලාවක (හෝ අවකාශය) ක්රියාත්මක කරන ඇල්ගොරිතමයක් විස්තර කරයි.
bool IsFirstElementNull(IList<string> elements) { return elements[0] == null; }
මත)
O (N) විස්තර කරන්නේ ඇල්ගොරිතමයක් වන අතර එහි ක්රියාකාරීත්වය රේඛීයව හා ආදාන දත්ත කට්ටලයේ ප්රමාණයට සෘජුව සමානුපාතිකව වර්ධනය වේ. පහත උදාහරණයෙන් පෙන්නුම් කරන්නේ බිග් ඕ නරකම කාර්ය සාධන තත්වයට කැමති වන්නේ කෙසේද; for for loop හි ඕනෑම පුනරාවර්තනයක් තුළ ගැලපෙන නූලක් සොයාගත හැකි අතර ශ්රිතය කලින් නැවත පැමිණෙනු ඇත, නමුත් බිග් ඕ අංකනය සැමවිටම ඇල්ගොරිතම මඟින් උපරිම පුනරාවර්තන ගණන සිදු කරන ඉහළ සීමාව උපකල්පනය කරයි.
bool ContainsValue(IList<string> elements, string value) { foreach (var element in elements) { if (element == value) return true; } return false; }
ඕ (එන් 2 )
O (N 2 ) යනු ආදාන දත්ත කට්ටලයේ ප්රමාණයට සෘජුවම සමානුපාතික වන ඇල්ගොරිතමයකි. දත්ත කට්ටලය හරහා කූඩු පුනරාවර්තනයන් ඇතුළත් වන ඇල්ගොරිතම සමඟ මෙය පොදු වේ. ගැඹුරු කැදැලි පුනරාවර්තනවල ප්රති O ලය O (N 3 ), O (N 4 ) යනාදියයි.
bool ContainsDuplicates(IList<string> elements) { for (var outer = 0; outer < elements.Count; outer++) { for (var inner = 0; inner < elements.Count; inner++) { // Don't compare with self if (outer == inner) continue; if (elements[outer] == elements[inner]) return true; } } return false; }
ඕ (2 එන් )
O (2 N ) මඟින් ආදාන දත්ත කට්ටලයට එක් එක් ඇඩිටෝනය සමඟ වර්ධනය දෙගුණ වන ඇල්ගොරිතමයක් දක්වයි. O (2 N ) ශ්රිතයක වර්ධන වක්රය on ාතීය වේ - ඉතා නොගැඹුරු ලෙස ආරම්භ වී උල්කාපාත ලෙස ඉහළ යයි. O (2 N ) ශ්රිතයක උදාහරණයක් වන්නේ ෆයිබොනාච්චි සංඛ්යා පුනරාවර්තන ගණනය කිරීමයි:
int Fibonacci(int number) { if (number <= 1) return number; return Fibonacci(number - 2) + Fibonacci(number - 1); }
ල ar ු ගණකය
ල ar ු ගණකය පැහැදිලි කිරීම සඳහා තරමක් උපක්රමශීලී බැවින් මම පොදු උදාහරණයක් භාවිතා කරමි:
ද්විමය සෙවීම යනු වර්ග කළ දත්ත කට්ටල සෙවීම සඳහා භාවිතා කරන තාක්ෂණයකි. එය ක්රියාත්මක වන්නේ දත්ත කට්ටලයේ මැද අංගය තෝරා ගැනීමෙනි, අත්යවශ්යයෙන්ම මධ්යන්යය, එය ඉලක්ක අගයකට සංසන්දනය කරයි. අගයන් ගැලපෙන්නේ නම් එය සාර්ථකත්වය ලබා දෙනු ඇත. ඉලක්කගත අගය පරීක්ෂණ මූලද්රව්යයේ වටිනාකමට වඩා වැඩි නම් එය දත්ත කට්ටලයේ ඉහළ භාගය ගෙන එයට එරෙහිව එකම මෙහෙයුමක් සිදු කරයි. ඒ හා සමානව, ඉලක්කගත අගය පරීක්ෂණ මූලද්රව්යයේ වටිනාකමට වඩා අඩු නම් එය පහළ භාගයට එරෙහිව ක්රියා කරයි. අගය සොයා ගන්නා තෙක් හෝ දත්ත කට්ටලය තවදුරටත් බෙදීමට නොහැකි වන තෙක් එය එක් එක් පුනරාවර්තනය සමඟ දත්ත කට්ටලය අඩකින් අඩක් කරනු ඇත.
මෙම වර්ගයේ ඇල්ගොරිතම O (ලොග් එන්) ලෙස විස්තර කෙරේ. ද්විමය සෙවුම් උදාහරණයේ විස්තර කර ඇති දත්ත කට්ටල පුනරාවර්තනය කිරීම වර්ධන වක්රය නිපදවන අතර එය ආරම්භයේ දී උච්ච වන අතර දත්ත කට්ටලවල ප්රමාණය වැඩි වන විට සෙමින් සමතලා වේ. උදා: අයිතම 10 ක් අඩංගු ආදාන දත්ත කට්ටලයක් සම්පූර්ණ කිරීමට තත්පරයක් ගත වේ, දත්ත කට්ටලයක් අයිතම 100 ක් අඩංගු වීමට තත්පර දෙකක් ගත වන අතර අයිතම 1000 ක් අඩංගු දත්ත කට්ටලයක් තත්පර තුනක් ගත වේ. ආදාන දත්ත කට්ටලයේ ප්රමාණය දෙගුණ කිරීමෙන් එහි වර්ධනය කෙරෙහි එතරම් බලපෑමක් ඇති නොවන අතර ඇල්ගොරිතමයේ එක් නැවත ක්රියාකාරීත්වයකින් පසුව දත්ත කට්ටලය අඩකින් අඩුවනු ඇති අතර එම නිසා ආදාන දත්ත සමඟ සමාන ප්රමාණයෙන් අඩක් පමණ වේ. විශාල දත්ත කට්ටල සමඟ කටයුතු කිරීමේදී ද්විමය සෙවීම වැනි ඇල්ගොරිතම අතිශයින්ම කාර්යක්ෂම කරයි.
මෙය ඉතා සරල පැහැදිලි කිරීමකි, නමුත් එය වඩාත් වැදගත් තොරතුරු ආවරණය කරනු ඇතැයි මම බලාපොරොත්තු වෙමි.
ඔබගේ ඇල්ගොරිතම ගැටළුව සමඟ කටයුතු කිරීම සමහර 'සාධක' මත රඳා පවතී යැයි අපි කියමු, උදාහරණයක් ලෙස අපි එය N සහ X බවට පත් කරමු.
N සහ X මත පදනම්ව, ඔබේ ඇල්ගොරිතමයට සමහර මෙහෙයුම් අවශ්ය වනු ඇත, උදාහරණයක් ලෙස WORST නඩුවේදී 3(N^2) + log(X)
ක්රියාත්මක වේ.
බිග්-ඕ නියත සාධකය (අකා 3) ගැන එතරම් තැකීමක් නොකරන බැවින්, ඔබේ ඇල්ගොරිතමයේ බිග්-ඕ වේ O(N^2 + log(X))
. එය මූලික වශයෙන් පරිවර්ථනය කරන්නේ 'මේ සමඟ ඇති නරකම පරිමාණයන් සඳහා ඔබේ ඇල්ගොරිතමයට අවශ්ය මෙහෙයුම් ප්රමාණය' යන්නයි.
ඇල්ගොරිතම : ගැටලුවක් විසඳීමේ ක්රියා පටිපාටිය / සූත්රය
ඇල්ගොරිතම විශ්ලේෂණය කරන්නේ කෙසේද සහ අපි එකිනෙකාට සාපේක්ෂව ඇල්ගොරිතම සංසන්දනය කරන්නේ කෙසේද?
උදාහරණය: 0 සිට N දක්වා සංඛ්යා එකතු කිරීම සඳහා ශ්රිතයක් නිර්මාණය කිරීමට ඔබ සහ මිතුරෙකුගෙන් ඉල්ලා සිටී. ඔබ f (x) සමඟ එන අතර ඔබේ මිතුරා g (x) සමඟ පැමිණේ. කාර්යයන් දෙකම එකම ප්රති result ලයක් ඇත, නමුත් වෙනස් ඇල්ගොරිතමයක්. ඇල්ගොරිතම වල කාර්යක්ෂමතාව වෛෂයිකව සංසන්දනය කිරීම සඳහා අපි බිග්-ඕ අංකනය භාවිතා කරමු .
බිග්-ඕ අංකනය: ආදානය අත්තනෝමතික ලෙස විශාල වන විට ආදානයට සාපේක්ෂව ධාවන කාලය කෙතරම් ඉක්මනින් වර්ධනය වේද යන්න විස්තර කරයි .
යතුරු රැගෙන යාම 3 ක්:
අභ්යවකාශ සංකීර්ණතාව: කාල සංකීර්ණතාව පසෙක තබා අපි අභ්යවකාශ සංකීර්ණතාව ගැන ද සැලකිලිමත් වෙමු (ඇල්ගොරිතමයක් කොපමණ මතකයක් / අවකාශයක් භාවිතා කරයි). මෙහෙයුම් කාලය පරීක්ෂා කිරීම වෙනුවට, අපි මතකය වෙන් කිරීමේ ප්රමාණය පරීක්ෂා කරමු.