ප්‍රායෝගිකව වෙනත් වර්ග කිරීමේ ඇල්ගොරිතම වලට වඩා ක්වික්සෝර්ට් වඩා හොඳ වන්නේ ඇයි?


338

සම්මත ඇල්ගොරිතම පා course මාලාවක අපට උගන්වනුයේ ක්වික්සෝර්ට් සාමාන්‍යයෙන් O(nlogn) සහ නරකම අවස්ථාවෙහි O(n2) බවයි. ඒ අතරම, වෙනත් වර්ග කිරීමේ ඇල්ගොරිතමයන් අධ්‍යයනය කරනු ලබන්නේ නරකම අවස්ථාවක ( ඒකාබද්ධ කිරීම් සහ හෙප්සෝර්ට් වැනි ) ), සහ හොඳම අවස්ථාවෙහිදී රේඛීය වේලාව ( බබල්සෝර්ට් වැනි ) නමුත් මතකයේ අමතර අවශ්‍යතා ඇත.O(nlogn)

තවත් ධාවන වේලාවන් දෙස බැලීමෙන් පසු ක්වික්සෝර්ට් අනෙක් ඒවා මෙන් කාර්යක්ෂම නොවිය යුතු යැයි පැවසීම ස්වාභාවිකය .

තවද, පුනරාවර්තනය සාමාන්‍යයෙන් එතරම් හොඳ නොවන බව මූලික ක්‍රමලේඛන පා courses මාලා වල සිසුන් ඉගෙන ගන්නා බව සලකන්න. එයට ඕනෑවට වඩා මතකය භාවිතා කළ හැකිය. එය පුනරාවර්තන ඇල්ගොරිතමයක් නිසා ඇත්තෙන්ම හොඳයි.

එසේනම්, ක්වික්සෝර්ට් ප්‍රායෝගිකව වෙනත් වර්ග කිරීමේ ඇල්ගොරිතම අභිබවා යන්නේ ඇයි? තාත්වික දත්තවල ව්‍යුහය සමඟ එය සම්බන්ධද ? පරිගණකවල මතකය ක්‍රියා කරන ආකාරය සමඟ එය සම්බන්ධද? සමහර මතකයන් අනෙක් ඒවාට වඩා වේගවත් බව මම දනිමි, නමුත් මෙම ප්‍රති-බුද්ධිමය ක්‍රියාකාරිත්වයට සැබෑ හේතුව එයදැයි මම නොදනිමි (න්‍යායාත්මක ඇස්තමේන්තු සමඟ සසඳන විට).


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

කෙසේ වෙතත්, සමහර පිළිතුරු යෝජනා කරන පරිදි, මතක මට්ටමින්, ක්‍රියාත්මක කිරීම් පරිගණකවල අභ්‍යන්තර ව්‍යුහයෙන් ප්‍රයෝජන ගන්නා අතර, උදාහරණයක් ලෙස, හැඹිලි මතකය RAM වලට වඩා වේගවත් බව පෙනේ. මෙම සාකච්ඡාව දැනටමත් රසවත් වන අතර, නමුත් මම එය කරන බව පෙනී යයි සිට, මතක කළමනාකරණ සම්බන්ධයෙන් වැඩි විස්තර දැක ගැනීමට මෙන් තවමත් හොදයි මේ පිළිතුර එය ඇති කළ යුතු.


යාවත්කාලීන 2: වර්ග කිරීමේ ඇල්ගොරිතම සංසන්දනය කරන වෙබ් පිටු කිහිපයක් තිබේ, අනෙක් ඒවාට වඩා සමහර රසිකයින් (විශේෂයෙන් වර්ග කිරීම- ඇල්ගොරිතම.කොම් ). ලස්සන දෘශ්‍ය ආධාරයක් ඉදිරිපත් කරනවාට අමතරව, මෙම ප්‍රවේශය මගේ ප්‍රශ්නයට පිළිතුරු සපයන්නේ නැත.


2
ඒකාබද්ධ කිරීමේ වර්ග කිරීම නරකම අවස්ථාවෙහිදී වන අතර, නිඛිලවල ප්‍රමාණයට දන්නා සීමාවක් ඇති පූර්ණ සංඛ්‍යා සමූහයක් වර්ග කිරීම O ( n ) කාලය තුළ ගණන් කිරීමේ වර්ග කිරීමකින් කළ හැකිය. (nලඝුn)(n)
කාල් මුමර්ට්

14
sorting-algorithms.com ඇල්ගොරිතම වර්ග කිරීම හා සැසඳීමේ දී තරමක් ගැඹුරින් සැසඳේ.
ජෝ

2
දැන්වීම් යාවත්කාලීන 1: ඔබට දැඩි විශ්ලේෂණයක් හෝ යථාර්ථවාදී උපකල්පන තිබිය හැකි යැයි මම අනුමාන කරමි . මම දෙකම දැක නැත. නිදසුනක් වශයෙන්, බොහෝ විධිමත් විශ්ලේෂණයන් ගණනය කරනු ලබන්නේ සැසඳීම් පමණි.
රෆායෙල්

9
මෙම ප්‍රශ්නය ක්‍රමලේඛකයින් පිළිබඳ මෑත තරඟයක් ජයග්‍රහණය කළේය .
රෆායෙල්

3
සිත්ගන්නා ප්‍රශ්නය. මම මීට කලකට පෙර අහඹු දත්ත සහ ඉක්මන් වර්ග කිරීම සහ ඒකාබද්ධ කිරීමේ වර්ග කිරීම බොළඳ ලෙස ක්‍රියාවට නැංවීය. ඇල්ගොරිතම දෙකම කුඩා දත්ත කට්ටල සඳහා (අයිතම 100000 ක් දක්වා) ඉතා හොඳින් ක්‍රියාත්මක වූ නමුත් ඒකාබද්ධ කිරීමෙන් පසුව වර්ග කිරීම වඩා හොඳ විය. ඉක්මන් වර්ග කිරීම එතරම් හොඳ ය යන පොදු උපකල්පනයට මෙය පටහැනි බව පෙනේ. ඒ සඳහා මට තවමත් පැහැදිලි කිරීමක් හමු වී නැත. මට ඉදිරිපත් කළ හැකි එකම අදහස නම් සාමාන්‍යයෙන් ඉක්මන් වර්ග කිරීම යන යෙදුම හඳුන්වාදීමේ වර්ග කිරීම වැනි වඩාත් සංකීර්ණ ඇල්ගොරිතම සඳහා භාවිතා වන අතර අහඹු හැරීම් සමඟ ඉක්මන් වර්ග කිරීම බොළඳ ලෙස ක්‍රියාත්මක කිරීම එතරම් හොඳ නොවන බවයි.
ජෝර්ජියෝ

Answers:


233

කෙටි පිළිතුර

හැඹිලි කාර්යක්ෂමතා තර්කය දැනටමත් විස්තරාත්මකව පැහැදිලි කර ඇත. ඊට අමතරව, ක්වික්සෝර්ට් වේගවත් වන්නේ මන්දැයි සහජ තර්කයක් තිබේ. “හරස් පොයින්ටර්” දෙකක් මෙන් ක්‍රියාත්මක කරන්නේ නම්, උදා. මෙහි අභ්‍යන්තර ලූප ඉතා කුඩා ශරීරයක් ඇත. බොහෝ විට ක්‍රියාත්මක කරන කේතය මෙය බැවින් මෙය ගෙවනු ලැබේ.

දිගු පිළිතුර

සියල්ලට කළින්,

මෙම සාමාන්ය නඩු නොපවතියි!

හොඳම හා නරකම අවස්ථාව බොහෝ විට අන්තයේ සිදුවන්නේ කලාතුරකිනි, සාමාන්‍ය සිද්ධි විශ්ලේෂණය සිදු කරනු ලැබේ. නමුත් ඕනෑම සාමාන්‍ය සිද්ධි විශ්ලේෂණයක් මඟින් යෙදවුම් බෙදා හැරීම උපකල්පනය කරයි ! වර්ග කිරීම සඳහා, සාමාන්‍ය තේරීම අහඹු ප්‍රේරණ ආකෘතියයි (විකිපීඩියාව මත නිශ්ශබ්දව උපකල්පනය කෙරේ).

ඇයි -Notation?

ඇල්ගොරිතම විශ්ලේෂණය කිරීමේදී නියතයන් බැහැර කිරීම එක් ප්‍රධාන හේතුවක් නිසා සිදු වේ: මම නිශ්චිත ධාවන වේලාවන් ගැන උනන්දුවක් දක්වන්නේ නම් , ඊට සම්බන්ධ සියලු මූලික මෙහෙයුම්වල ( සාපේක්ෂ) පිරිවැය මට අවශ්‍ය වේ ( තවමත් හැඹිලි ගැටළු නොසලකා හැරීම, නවීන ප්‍රොසෙසරවල නල එළීම ...). ගණිතමය විශ්ලේෂණය මඟින් එක් එක් උපදෙස් ක්‍රියාත්මක කරන වාර ගණන ගණනය කළ හැකි නමුත් තනි උපදෙස් ක්‍රියාත්මක වන වේලාවන් සකසනය පිළිබඳ විස්තර මත රඳා පවතී, උදා: 32-බිටු නිඛිල ගුණ කිරීම එකතු කිරීමට වැඩි කාලයක් ගතවේද යන්න.

ක්‍රම දෙකක් තිබේ:

  1. යන්ත්‍ර ආකෘතියක් සවි කරන්න.

    මෙය සිදු කරනු ලබන්නේ කතුවරයා විසින් නිර්මාණය කරන ලද කෘතිම “සාමාන්‍ය” පරිගණකයක් සඳහා දොන් නූත්ගේපරිගණක වැඩසටහන්කරණ කලාව” නම් පොත් මාලාවේ ය . 3 වන වෙළුමේ බොහෝ වර්ග කිරීමේ ඇල්ගොරිතම සඳහා සාමාන්‍ය සාමාන්‍ය ප්‍රති results ල ඔබ සොයා ගනී , උදා

    • ක්වික්සෝර්ට් : 11.667(n+1)ln(n)-1.74n-18.74
    • ඒකාබද්ධ කිරීම: 12.5nln(n)
    • Heapsort: 16nln(n)+0.01n
    • ඇතුළත් කිරීම්: [ ප්‍රභවය ]2.25n2+7.75n-3ln(n) වර්ග කිරීමේ ඇල්ගොරිතම කිහිපයක ධාවන වේලාවන්

    මෙම ප්‍රති results ලවලින් පෙනී යන්නේ ක්වික්සෝර්ට් වේගවත්ම බවයි. නමුත්, එය ඔප්පු වී ඇත්තේ නුත්ගේ කෘතිම යන්ත්‍රය මත පමණක් වන අතර, එය ඔබගේ x86 පරිගණකය යැයි කීමට කිසිවක් ඇඟවුම් නොකරයි. කුඩා යෙදවුම් සඳහා ඇල්ගොරිතම වෙනස් ආකාරයකින් සම්බන්ධ වන බව සලකන්න:
    කුඩා යෙදවුම් සඳහා වර්ග කිරීමේ ඇල්ගොරිතම කිහිපයක ධාවන වේලාවන්
    [ ප්‍රභවය ]

  2. වියුක්ත මූලික මෙහෙයුම් විශ්ලේෂණය කරන්න .

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

    • Quicksort: සැසඳීම් සහ 12nln(n) හුවමාරුව සාමාන්‍යයෙන්13nln(n)
    • ඒකාබද්ධ කිරීම: සැසඳීම්, නමුත් දක්වා1.44nln(n) අරාව ප්‍රවේශයන් (ඒකාබද්ධ කිරීම swap මත පදනම් වූවක් නොවේ, එබැවින් අපට එය ගණන් කළ නොහැක).8.66nln(n)
    • ඇතුළත් කිරීම්: සැසඳීම් සහ 114n2හුවමාරුව සාමාන්‍යයෙන්.14n2

    ඔබ දකින පරිදි, මෙය නිශ්චිත ධාවන කාල විශ්ලේෂණය ලෙස ඇල්ගොරිතම සංසන්දනය කිරීමට පහසුවෙන් ඉඩ නොදේ, නමුත් ප්‍රති results ල යන්ත්‍ර විස්තර වලින් ස්වාධීන වේ.

වෙනත් ආදාන බෙදාහැරීම්

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


8
යන්ත්‍ර මත යැපෙන නියතයන් ඇතුළත් කිරීමෙන් 2 වන වර්ගයේ ප්‍රති Results ල 1 වර්ගයේ ප්‍රති results ල බවට පරිවර්තනය කළ හැකිය. එබැවින් මම තර්ක කරන්නේ 2. උසස් ප්‍රවේශයකි.
රෆායෙල්

2
Ap රෆායෙල් +1. මම හිතන්නේ ඔබ උපකල්පනය කරන්නේ යන්ත්‍ර මත යැපීම ද ක්‍රියාත්මක කිරීම මත රඳා පවතින බවයි, නේද? මම කිව්වේ, වේගවත් යන්ත්‍ර + දුර්වල ලෙස ක්‍රියාත්මක කිරීම බොහෝ විට කාර්යක්ෂම නොවේ.
ජනෝමා

2
An ජානෝමා විශ්ලේෂණය කරන ලද ඇල්ගොරිතම ඉතා සවිස්තරාත්මක ස්වරූපයෙන් ලබා දිය යුතු යැයි මම සිතුවෙමි (විශ්ලේෂණය සවිස්තරාත්මක බැවින්) සහ ක්‍රියාත්මක කිරීම හැකි තරම් ලිපියෙන් කළ යුතුය. නමුත් ඔව්, ක්‍රියාත්මක කිරීමද ඊට හේතු වේ.
රෆායෙල්

3
ඇත්ත වශයෙන්ම, දෙවන වර්ගයේ විශ්ලේෂණය ප්රායෝගිකව පහත් ය. තාත්වික ලෝක යන්ත්‍ර කොතරම් සංකීර්ණද යත්, දෙවන වර්ගයේ ප්‍රති results ල 1 වර්ගයට පරිවර්තනය කළ නොහැකි ය. එය 1 වන වර්ගයට සංසන්දනය කරන්න: පර්යේෂණාත්මක ධාවන වේලාවන් සැලසුම් කිරීම සඳහා මිනිත්තු 5 ක කාලයක් ගතවේ.
ජූල්ස්

4
Ules ජූල්ස්: “පර්යේෂණාත්මක ධාවන කාලය සැලසුම් කිරීම” පළමු වර්ගය නොවේ ; එය කිසිදු ආකාරයක විධිමත් විශ්ලේෂණයක් නොවන අතර එය වෙනත් යන්ත්‍ර වෙත මාරු කළ නොහැක. අප විධිමත් විශ්ලේෂණයක් කරන්නේ එබැවිනි.
රෆායෙල්

84

මෙම ප්‍රශ්නය සම්බන්ධයෙන් කරුණු කිහිපයක් ඉදිරිපත් කළ හැකිය.

ක්වික්සෝර්ට් සාමාන්යයෙන් වේගවත් වේ

ක්වික්සෝර්ට්හි නරකම තත්වයේ හැසිරීමක් තිබුණද , එය සාමාන්‍යයෙන් වේගවත් ය: අහඹු හැරීම් තේරීම උපකල්පනය කරමින්, ආදානය සමාන ප්‍රමාණයේ උප කුලක දෙකකට වෙන් කරන යම් සංඛ්‍යාවක් තෝරා ගැනීමට අපට විශාල අවස්ථාවක් තිබේ, එය අපට අවශ්‍ය වන්නේ හරියටම ය .O(n2)

විශේෂයෙන්, අපි සෑම බෙදීම් 10 කටම 10% -90% බෙදීමක් ඇති කරන හැරීමක් තෝරා ගත්තද (එය මෙහ් බෙදීමකි), සහ 1 මූලද්‍රව්‍යය - මූලද්‍රව්‍ය වෙනත් ආකාරයකින් බෙදී ගියද (එය ඔබට ලබා ගත හැකි නරකම භේදයයි) , අපගේ ධාවන කාලය තවමත් O ( n log n ) වේ (මෙය ඒකාබද්ධ කිරීම වර්ග කිරීම වේගවත් වුවත් එය නියතයන් පුපුරවා හරිනු ඇති බව සලකන්න).n1O(nlogn)

ක්වික්සෝර්ට් සාමාන්‍යයෙන් බොහෝ වර්ග වලට වඩා වේගවත්ය

ක්වික්සෝර්ට් සාමාන්‍යයෙන් ට වඩා මන්දගාමී වන වර්ග වලට වඩා වේගවත් වේ (කියන්න, එහි O ( n 2 ) ධාවන කාලය සමඟ ඇතුළත් කිරීමේ වර්ග කිරීම ), විශාල n සඳහා සරලවමO(nlogn)O(n2)n ඒවායේ ධාවන කාලය පුපුරා යන නිසාය.

හීප්සෝර්ට් වැනි අනෙකුත් ඇල්ගොරිතම හා සසඳන විට ක්වික්සෝර්ට් ප්‍රායෝගිකව එතරම් වේගවත් වීමට හොඳ හේතුවක් වන්නේ එය සාපේක්ෂව හැඹිලි-කාර්යක්ෂම වීමයි. එහි ධාවන කාලය ඇත්ත වශයෙන්ම O ( n) වේO(nlogn), මෙහිBයනු බ්ලොක් ප්‍රමාණයයි. අනෙක් අතට, හීප්සෝර්ට්හි එවැනි වේගවත් කිරීමක් නොමැත: එය කිසිසේත් මතක හැඹිලියට කාර්යක්ෂමව ප්‍රවේශ නොවේ.O(nBlog(nB))B

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

හැඹිලි කාර්යක්ෂමතාව O ( n) දක්වා තවදුරටත් වැඩිදියුණු කළ හැකිය, කොහෙදඑම්සඳහා භාවිතා කරනවා නම්, අපගේ ප්රධාන මතකය ප්රමාණය වේkQuicksort -way. ඒකාබද්ධ කිරීම ක්වික්සෝර්ට් හා සමාන හැඹිලි-කාර්යක්ෂමතාවයක් ඇති බව සලකන්න. ඇත්ත වශයෙන්ම එහි k-way අනුවාදය මතකය දැඩි බාධාවක් නම් වඩා හොඳ ක්‍රියාකාරීත්වයක් (අඩු නියත සාධක හරහා) ඇත. මෙය ඊළඟ කාරණයට මග පාදයි: අපට වෙනත් සාධක මත ක්වික්සෝර්ට් ඒකාබද්ධ කිරීම හා සැසඳිය යුතුය.O(nBlogMB(nB))Mk

Quicksort සාමාන්‍යයෙන් Mergesort ට වඩා වේගවත්ය

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

ක්වික්සෝර්ට් වඩාත් පුනරාවර්තන ඇමතුම් ලබා දෙන බව සලකන්න, නමුත් තොග ඉඩ වෙන් කිරීම ලාභදායී වේ (ඇත්ත වශයෙන්ම නොමිලේ, ඔබ තොගය පුපුරවා නොගන්නා තාක් කල්) සහ ඔබ එය නැවත භාවිතා කරයි. ෙයාදා මත යෝධ වාරණ වෙන් (හෝ ඔබේ දෘඪ තැටිය, නම් යනු ඇත්තටම විශාල) ටිකක් විතර වඩා මිල අධික වන අතර, එහෙත් ඒ දෙකම සාමාන්ය ( ලොග් n ) සංසන්දනය ඉතා බාල බව පොදු කාර්ය වියදම් සාමාන්ය ( n ) වැඩ ඉහත සඳහන්.nO(logn)O(n)

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

ඔබේ අවශ්‍යතාවන්ට ගැලපෙන වර්ග කිරීම භාවිතා කරන්න

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


4
ඔබගේ අවසාන ප්‍රකාශය විශේෂයෙන් වටී. මගේ සගයකු දැනට විවිධ ආදාන බෙදාහැරීම් යටතේ ක්වික්සෝර්ට් ක්‍රියාත්මක කිරීම් විශ්ලේෂණය කරයි. ඒවායින් සමහරක් බොහෝ අනුපිටපත් සඳහා බිඳ වැටේ.
රෆායෙල්

4
Ap රෆායෙල්, මැක්ල්රෝයිගේ "ක්වික්සෝර්ට් සඳහා මිනීමරු විරුද්ධවාදියෙකු", මෘදුකාංග - පුහුණුවීම් සහ අත්දැකීම් 29 (4), 341-344 (1999) දෙස බලන්න. ක්වික්සෝර්ට් සෑම විටම කාලය ගත කිරීම සඳහා වංක ක්‍රමවේදයක් විස්තර කරයි . බෙන්ට්ලි සහ මැක්ල්රෝයිගේ "ඉංජිනේරු වර්ග කිරීම", මෘදුකාංග - පුහුණුව සහ අත්දැකීම් 23 (11), 1249-1265 (1993) ද අදාළ විය හැකිය. O(n2)
වොන්බ්‍රෑන්ඩ්

9
"මෙහි පිටුපස කිසිදු න්‍යායක් නොමැත. එය වේගවත් වේ." බව ප්රකාශ වෙයි ඉතා විද්යාත්මක දෘෂ්ටි සිට අසතුටුදායක. "සමනලුන් ඉහළට පියාඹනවා, ඇපල් බිමට වැටෙනවා: මේ පිටුපස කිසිම න්‍යායක් නැහැ, ඇපල් වැටෙනවා."
ඩේවිඩ් රිචර්බි

2
Lex ඇලෙක්ස් ටෙන් බ්‍රින්ක්, “විශේෂයෙන් ඇල්ගොරිතම හැඹිලි-නොසලකා හැරේ” යන්නෙන් ඔබ අදහස් කරන්නේ කුමක්ද?
හිබු 57

4
Av ඩේවිඩ් රිචර්බි, “එම ප්‍රකාශය විද්‍යාත්මක දෘෂ්ටි කෝණයකින් සෑහීමකට පත්විය නොහැකි ය”: ඔහු සත්‍යයක් ගැන සාක්ෂි දරන්නේ අප ඒ ගැන සතුටු විය යුතු යැයි මවා පාමින් නොවේ. සමහර ඇල්ගොරිතම පවුල් පූර්ණ විධිමත් කිරීමක් නොමැති වීමෙන් පීඩා විඳිති; හැෂිං කාර්යයන් උදාහරණ අවස්ථාවකි.
හිබු 57

49

මගේ විශ්ව විද්යාල දී වැඩසටහන් නිබන්ධන එක්, අපි quicksort, mergesort, ඇතුළු කරන එදිරිව Python හි ඇති (called list.sort ආකාරයක කාර්ය සාධනය සන්සන්දනය කිරීම සිසුන් ඉල්ලා Timsort ). බිල්ට් ලැයිස්තුවේ සිට පර්යේෂණාත්මක ප්‍රති results ල මා බෙහෙවින් පුදුමයට පත් කළේය. වෙනත් වර්ග කිරීමේ ඇල්ගොරිතමයන්ට වඩා බොහෝ සෙයින් ක්‍රියා කර ඇති අතර, පහසුවෙන් ක්වික්සෝර්ට්, ඒකාබද්ධ කිරීමේ බිඳවැටීම් ඇති කළ අවස්ථා පවා ඇත. එබැවින් සුපුරුදු ක්වික්සෝර්ට් ක්‍රියාත්මක කිරීම ප්‍රායෝගිකව හොඳම බව නිගමනය කිරීම නොමේරූ ය. නමුත් මට විශ්වාසයි ක්වික්සෝර්ට් වඩා හොඳ ක්‍රියාත්මක කිරීමක් හෝ එහි දෙමුහුන් අනුවාදයක් එහි ඇති බව.

ඩේවිඩ් ආර්. මැක් අයිවර් විසින් රචිත කදිම බ්ලොග් ලිපියකි, ටිම්සෝට් අනුවර්තන ඒකාබද්ධ කිරීමේ ආකාරයක් ලෙස.


19
Ap රෆායෙල් එය සංක්ෂිප්තව කිවහොත්, ටිම්සෝර්ට් යනු අසමමිතික සඳහා වර්ග කිරීම සහ කෙටි යෙදවුම් සඳහා ඇතුළත් කිරීමේ වර්ග කිරීම සහ ඉඳහිට දැනටමත් පිළිවෙලට ඇති පිපිරීමක් ඇති දත්ත සමඟ කාර්යක්ෂමව කටයුතු කිරීම සඳහා සමහර ප්‍රතිකාර ක්‍රම වේ (එය බොහෝ විට ප්‍රායෝගිකව සිදු වේ). ඩයි: ඇල්ගොරිතමයට අමතරව, list.sortවෘත්තිකයන් විසින් ප්‍රශස්තිකරණය කරන ලද ගොඩනංවන ලද ශ්‍රිතයක් වීමේ ප්‍රතිලාභ. වඩා හොඳ සංසන්දනයක දී සියලු කාර්යයන් එකම භාෂාවෙන් එකම මට්ටමේ උත්සාහයකින් ලියා ඇත.
ගිලෙස්ගේ SO- නපුරු වීම නවත්වන්න '

1
Ai ඩයි: ඔබේ ප්‍රති .ල ලබාගත්තේ කුමන ආකාරයේ යෙදවුම් (ඒවායේ ව්‍යාප්තිය) කුමන තත්වයන් යටතේද (අඩු RAM, එක් ක්‍රියාත්මක කිරීමේ සමාන්තරයක් සිදු කළේද ...) ඔබට විස්තර කළ හැකිය.
රෆායෙල්

7
අපි අහඹු සංඛ්‍යා ලැයිස්තුවෙන් පරීක්‍ෂා කළ අතර අර්ධ වශයෙන් වර්ග කර, සම්පුර්ණයෙන්ම වර්ග කර, ප්‍රතිලෝමව වර්ග කර ඇත. එය හඳුන්වාදීමේ පළමු වසර පා course මාලාවක් බැවින් එය ගැඹුරු ආනුභවික අධ්‍යයනයක් නොවීය. නමුත් එය දැන් ජාවා එස්ඊ 7 සහ ඇන්ඩ්‍රොයිඩ් වේදිකාවේ අරා වර්ග කිරීම සඳහා නිල වශයෙන් භාවිතා කර ඇති නිසා යමක් අදහස් වේ.
ඩයි

4
මෙය ද මෙහි සාකච්ඡා කෙරිණි: cstheory.stackexchange.com/a/927/74
ජුක්කා සුමෙලා

ප්‍රාථමික FWIW වර්ග කිරීම සඳහා ජාවා SE 7 (ද්විත්ව හැරීම්) ක්වික්සෝර්ට් භාවිතා කරයි ... ස්ථාවර වර්ග කිරීම එහි වැදගත් නොවන බැවින් ...
rogerdpack

36

අනෙක් වර්ග කිරීමේ ඇල්ගොරිතම සමඟ සසඳන විට ක්වික්සෝර්ට් මෙතරම් වේගයෙන් පැවතීමට එක් ප්‍රධාන හේතුවක් වන්නේ එය හැඹිලි-හිතකාමී බැවිනි. QS අරාවෙහි කොටසක් සැකසූ විට, එය කොටසේ ආරම්භයේ සහ අවසානයේ මූලද්‍රව්‍යයන්ට ප්‍රවේශ වන අතර, එම කොටසේ කේන්ද්‍රය දෙසට ගමන් කරයි.

එබැවින්, ඔබ ආරම්භ කරන විට, ඔබ අරාවෙහි පළමු අංගයට ප්‍රවේශ වන අතර මතක කෑල්ලක් (“පිහිටීම”) හැඹිලියට පටවනු ලැබේ. ඔබ දෙවන අංගයට ප්‍රවේශ වීමට උත්සාහ කරන විට, එය (බොහෝ දුරට ඉඩ ඇත) දැනටමත් හැඹිලියේ ඇත, එබැවින් එය ඉතා වේගවත්ය.

හෙප්සෝර්ට් වැනි වෙනත් ඇල්ගොරිතම මේ ආකාරයට ක්‍රියා නොකරයි, ඒවා අරාවෙහි බොහෝ සෙයින් පනින අතර එමඟින් ඒවා මන්දගාමී වේ.


5
එය විවාදාත්මක පැහැදිලි කිරීමකි: ඒකාබද්ධ කිරීම හැඹිලි හිතකාමී ය.
ඩිමිට්‍රෝ කෝර්ඩුබාන්

2
මෙම පිළිතුර මූලික වශයෙන් නිවැරදි යැයි මම සිතමි, නමුත් මෙන්න විස්තර කිහිපයක් youtube.com/watch?v=aMnn0Jq0J-E
rgrig

3
ඉක්මන්-වර්ග කිරීමේ සාමාන්‍ය සිද්ධි කාල සංකීර්ණතාව සඳහා ගුණ කිරීමේ නියතය ද වඩා හොඳය (ඔබ සඳහන් කළ හැඹිලි සාධකයෙන් ස්වාධීනව).
කවේ

1
ඉක්මන් වර්ග කිරීමේ වෙනත් හොඳ ගුණාංග හා සසඳන විට ඔබ සඳහන් කළ කාරණය එතරම් වැදගත් නොවේ.
එම්එම්එස්

1
Ave කවේ: "ඉක්මන්-වර්ග කිරීමේ සාමාන්‍ය සිද්ධි කාල සංකීර්ණතාව සඳහා ගුණ කිරීමේ නියතය ද වඩා හොඳය" ඔබට මේ පිළිබඳ දත්ත තිබේද?
ජෝර්ජියෝ

29

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

ඒ කියන්නේ මොකද්ද? ඕනෑම ප්‍රේරණයක් අහඹු ලෙස තෝරාගෙන ඇතැයි උපකල්පනය කරන්න (ඒකාකාර බෙදා හැරීම උපකල්පනය කරන්න). මෙම අවස්ථාවෙහිදී, සාමාන්‍ය හැරීම් තේරීමේ ක්‍රම මඟින් අපේක්‍ෂාවෙන් ලැයිස්තුව / අරාව දළ වශයෙන් අඩකින් බෙදෙන හැරීම් සපයයි ; එයයි අපව වෙතට ගෙන එන්නේ(nලඝුn) පුනරාවර්තනයෙන් ලබාගත් අර්ධ විසඳුම් සඳහා ගත වන්නේ නියත කාලය පමණි ( දී රේඛීය කාලයට වඩා වෙනස්ව). ඇත්ත වශයෙන්ම, හැරීම අනුව ආදාන ලැයිස්තු දෙකකින් වෙන් කිරීම රේඛීය වේලාවකි, නමුත් බොහෝ විට එයට සත්‍ය හුවමාරු කිහිපයක් අවශ්‍ය වේ.

ක්වික්සෝර්ට් හි බොහෝ ප්‍රභේද ඇති බව සලකන්න (උදා: සෙඩ්ජ්වික්ගේ නිබන්ධනය බලන්න). ඔවුන් විවිධ ආදාන බෙදාහැරීම් මත වෙනස් ආකාරයකින් ක්‍රියා කරයි (ඒකාකාර, පාහේ වර්ග කර ඇති, ප්‍රතිලෝමව වර්ග කර ඇති, බොහෝ අනුපිටපත්, ...), සහ වෙනත් ඇල්ගොරිතම සමහරුන්ට වඩා හොඳ විය හැකිය.

k10


20

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

ps: නිවැරදිව කිවහොත්, වෙනත් ඇල්ගොරිතමයන්ට වඩා හොඳ වීම කාර්යය මත රඳා පවතී. සමහර කාර්යයන් සඳහා වෙනත් වර්ග කිරීමේ ඇල්ගොරිතම භාවිතා කිරීම වඩා හොඳ විය හැකිය.

මෙයද බලන්න:


3
An ජනෝමා මෙය ඔබ භාවිතා කරන භාෂාව සහ සම්පාදකයා පිළිබඳ කාරණයකි. සෑම ක්‍රියාකාරී භාෂාවකටම (එම්එල්, ලිස්ප්, හැස්කල්) තොග වර්ධනය වීම වළක්වන ප්‍රශස්තිකරණයන් කළ හැකි අතර අත්‍යවශ්‍ය භාෂාවන් සඳහා වඩා හොඳ සම්පාදකයින්ටද එයම කළ හැකිය (ජීසීසී, ජී ++, සහ එම්එස්වීසී සියල්ලම මෙය කරයි). සැලකිය යුතු ව්‍යතිරේකය වන්නේ ජාවා වන අතර එය කිසි විටෙකත් මෙම ප්‍රශස්තිකරණය සිදු නොකරනු ඇත, එබැවින් ඔබේ පුනරාවර්තනය නැවත නැවත ලිවීම ජාවා හි අර්ථවත් කරයි.
Rafe Kettler

4
@JD, ඔබට ක්වික්සෝර්ට් සමඟ වලිග ඇමතුම් ප්‍රශස්තිකරණය භාවිතා කළ නොහැක (අවම වශයෙන් සම්පූර්ණයෙන්ම නොවේ), මන්ද එය දෙවරක්ම කතා කරයි. ඔබට දෙවන ඇමතුම ප්‍රශස්තිකරණය කළ හැකිය, නමුත් පළමු ඇමතුම නොවේ.
svick

1
An ජනෝමා, ඔබට සැබවින්ම පුනරාවර්තන ක්‍රියාත්මක කිරීම අවශ්‍ය නොවේ. උදාහරණයක් ලෙස, ඔබ C හි qsort ශ්‍රිතය ක්‍රියාත්මක කිරීම දෙස බැලුවහොත්, එය පුනරාවර්තන ඇමතුම් භාවිතා නොකරන අතර එම නිසා ක්‍රියාත්මක කිරීම වඩා වේගවත් වේ.
කවේ

1
Heapsort ද ක්‍රියාත්මක වේ, QS බොහෝ විට වේගවත් වන්නේ ඇයි?
කෙවින්

6
23240 යි

16

Θ(n2)Θ(nලඝුn) නියතයන් ඉතා කුඩා වේ වෙනත් වර්ග කිරීමේ ඇල්ගොරිතම සමඟ සසඳන විට. වෙනත් වර්ග කිරීමේ ඇල්ගොරිතම වලට වඩා ඉක්මන් වර්ග කිරීම භාවිතා කිරීමට ප්‍රධාන හේතුව මෙයයි.

දෙවන හේතුව එය ඉටු කිරීමයි in-place වර්ග අතර අථත්ය-මතක පරිසරයන් සමඟ ඉතා හොඳින් ක්රියා කරයි.

යාවත්කාලීන කිරීම: (ජැනෝමා සහ ස්වික්ගේ අදහස් වලින් පසුව)

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

පහත දැක්වෙන අනුපිළිවෙල සලකා බලන්න:

12,30,21,8,6,9,1,7. The merge sort algorithm works as follows:

(a) 12,30,21,8    6,9,1,7  //divide stage
(b) 12,30   21,8   6,9   1,7   //divide stage
(c) 12   30   21   8   6   9   1   7   //Final divide stage
(d) 12,30   8,21   6,9   1,7   //Merge Stage
(e) 8,12,21,30   .....     // Analyze this stage

අවසාන අදියර සිදුවන්නේ කෙසේදැයි ඔබ හොඳින් සොයා බලන්නේ නම්, පළමු 12 8 හා සසඳන විට 8 කුඩා වන අතර එය පළමු තැනට යයි. 21 සමඟ සසඳන විට දැන් 12 ක් AGAIN වන අතර 12 ඊළඟට ඉදිරියට යයි. ඔබ අවසාන ඒකාබද්ධ කිරීම එනම් මූලද්‍රව්‍ය 4 ක් වෙනත් මූලද්‍රව්‍ය 4 ක් සමඟ ගතහොත්, එය ඉක්මන් වර්ග කිරීම සඳහා සිදු නොවන නියතයන් ලෙස අමතර සංසන්දනයන් රාශියක් සිදු කරයි. ඉක්මන් වර්ග කිරීම වඩාත් කැමති වීමට හේතුව මෙයයි.


1
නමුත් නියතයන් එතරම් කුඩා වන්නේ කුමක් නිසාද?
svick

1
@svick ඒවා වර්ග කර ඇති නිසා, in-placeඑනම් අමතර මතකයක් අවශ්‍ය නොවේ.
0x0

Θ(nlgn)

16

සැබෑ ලෝක දත්ත සමඟ වැඩ කිරීමේ මගේ අත්දැකීම එයයි ක්වික්සෝර්ට් දුර්වල තේරීමක් බවයි බවයි. ක්වික්සෝර්ට් අහඹු දත්ත සමඟ හොඳින් ක්‍රියා කරයි, නමුත් සැබෑ ලෝක දත්ත බොහෝ විට අහඹු නොවේ.

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

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

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

සංස්කරණය කරන්න: ජාවා, පයිතන් සහ පර්ල් වැනි ක්‍රමලේඛන භාෂා ද ඒකාබද්ධ කිරීමේ වර්ග කිරීම හෝ වඩාත් නිවැරදිව ටිම්සෝර්ට් වැනි ව්‍යුත්පන්නයක් භාවිතා කරයි. (ජාවා සරල පික්සෝර්ට් වලට වඩා වේගවත් ද්විත්ව හැරවුම් ක්වික්සෝර්ට් ද භාවිතා කරයි.)


මේ හා සමාන දෙයක් මා දුටුවා, මන්දයත් අප දැනටමත් වර්ග කර ඇති දත්ත සමූහයකට ඇතුළු කිරීමට නිරන්තරයෙන් එකතු වන / යොමුවී සිටින බැවිනි. සසම්භාවී ක්වික්සෝර්ට් එකක් භාවිතා කිරීමෙන් ඔබට සාමාන්‍යයෙන් මෙය වටා වැඩ කළ හැකිය (සහ දුර්ලභ හා අහඹු භයානක මන්දගාමී වර්ග කිරීමකින් පුදුමයට පත් වන්න), නැතහොත් නිම කිරීමට පුදුම සහගත කාලයක් ගත නොවන සෑම විටම මන්දගාමී වර්ගයක් ඔබට ඉවසිය හැකිය. සමහර විට ඔබට වර්ග කිරීමේ ස්ථාවරත්වයක් ද අවශ්‍ය වේ. ජාවා ඒකාබද්ධ කිරීමේ වර්ග කිරීම භාවිතා කිරීමෙන් ක්වික්සෝර්ට් ප්‍රභේදයකට ගොස් ඇත.
රොබ්

Ob රොබ් මෙය නිවැරදි නොවේ. ජාවා අද දක්වාම ඒකාබද්ධ කිරීමේ (ටිම්සෝර්ට්) ප්‍රභේදයක් භාවිතා කරයි. එය ක්වික්සෝර්ට් හි ප්‍රභේදයක් ද භාවිතා කරයි (ද්විත්ව හැරීම් ක්වික්සෝර්ට්).
අර්වාන් ලෙග්‍රෑන්ඩ්

සරල ක්‍රියාත්මක කිරීමක් සහ තරමක් සවිස්තරාත්මක එකක් අතර විස්තර විශාල වෙනසක් කළ හැකිය. දැනටමත් වර්ග කර ඇති හෝ ප්‍රතිලෝම ලෙස වර්ග කර ඇති විට, "පළමු මූලද්‍රව්‍යය හැරීම ලෙස භාවිතා කරන්න" සහ "පළමු, මැද හා අවසාන මූලද්‍රව්‍ය වර්ග කරන්න, නව මැද භාවිතා කරන්න" අතර වෙනස අති විශාලය. (හෝ අහඹු ලෙස, නමුත් මට
ක්වික්සෝර්ට්

14

1 - ඉක්මන් වර්ග කිරීම ක්‍රියාත්මක වේ (නියත ප්‍රමාණයක් හැර අමතර මතකයක් අවශ්‍ය නොවේ.)

2 - වෙනත් කාර්යක්ෂම වර්ග කිරීමේ ඇල්ගොරිතම වලට වඩා ඉක්මන් වර්ග කිරීම ක්‍රියාත්මක කිරීම පහසුය.

3 - ඉක්මන් වර්ග කිරීම අනෙකුත් කාර්යක්ෂම වර්ග කිරීමේ ඇල්ගොරිතම වලට වඩා එහි ක්‍රියාකාරී වේලාවේ කුඩා නියත සාධක ඇත.

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


3
දියුණු ස්ථානයක, ක්‍රියාකාරී ක්වික්සෝර්ට් ක්‍රියාත්මක කිරීම් ඔබ දැක තිබේද ? ඒවා බොහෝ දේ නමුත් "පහසු" නොවේ.
රෆායෙල්

2
අංක 2 මගේ ප්‍රශ්නයට කිසිසේත් පිළිතුරු නොදෙන අතර අංක 1 සහ 3 අංකවලට නිසි සාධාරණීකරණය අවශ්‍ය බව මගේ මතයයි.
ජනෝමා

Ap රෆායෙල්: ඒවා පහසුයි. දර්ශකයන් වෙනුවට අරාව භාවිතා කරමින් ඉක්මන් වර්ග කිරීම ක්‍රියාත්මක කිරීම වඩා පහසුය. එය ක්‍රියාත්මක වීමට නැවත ක්‍රියාකාරී වීම අවශ්‍ය නොවේ.
එම්එම්එස්

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

Merg 1 ඒකාබද්ධ කිරීම ද ස්ථානගත විය හැකිය. කාර්යක්ෂමතාව යනු කුමක්ද? ඒකාබද්ධ කිරීම වර්ග කිරීමට මා කැමතිය, මන්ද එය ඉතා සරල හා මගේ මතය අනුව කාර්යක්ෂම වේ. Data 3 ඔබ විශාල දත්ත ප්‍රමාණයක් වර්ග කරන විට අදාළ නොවේ, ඇල්ගොරිතම කාර්යක්ෂමව ක්‍රියාත්මක කිරීම අවශ්‍ය වේ.
ඔස්කාර් ස්කොග්

13

නිශ්චිත වර්ග කිරීමේ ඇල්ගොරිතමයක් ඇත්ත වශයෙන්ම වේගවත්ම කොන්දේසි මොනවාද?

  1. දෘඩාංගවල සමාන්තරව ක්‍රියාත්මක වන විට එයට අඩු ප්‍රමාදයක් අවශ්‍යද? හැකි තරම් දොරටු කිහිපයක් අවශ්‍ය වන අතර අවශ්‍යද?

    Θ(ලඝු(n)2)Θ(nලඝු(n)2)

  2. එක් එක් මූලද්‍රව්‍යයට විවිධ අගයන් කීයක් තිබිය හැකිද? හැකි සෑම අගයකටම මතකයේ හෝ හැඹිලියේ අද්විතීය ස්ථානයක් ලබා දිය හැකිද?

    Θ(nk)Θ(nඑම්)k=2#nයූඑම්බීr_of_පීossමමබීl_vlයූsඑම්=#එම්xමමඑම්යූඑම්_lnටීh_of_kys

  3. යටින් පවතින දත්ත ව්‍යුහය සම්බන්ධිත අංග වලින් සමන්විත වේද?

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

  4. ද? ස්ථාවර වී තෝරා බේරා ගැනීමේ අවශ්යතාව ?

    Θ(n) ද ඉක්මන් ආකාරයක ඒකාබද්ධ ආකාරයක කට අධික විය හැකි බව සෑම කාර්ය සාධන වාසි, එසේ බව, ආදාන දත්ත මත සිදු කිරීමට නියමිත බව සෑම ස්වැප් සමඟ සමපාත වේදැයි තබා ගැනීමට අවශ්ය වන මුල් දර්ශක සමන්විත නරකම, අතිරේක මතකය සමහර විට වලක්වනු ඇත.

  5. යටින් පවතින දත්තවල ප්‍රමාණය කුඩා සිට මධ්‍යම ප්‍රමාණයට බැඳිය හැකිද? හැකිද? උදා n <10,000 ... 100,000,000 (යටින් පවතින ගෘහ නිර්මාණ ශිල්පය සහ දත්ත ව්‍යුහය අනුව)?

    භාවිතා bitonic ආකාරයක හෝ Batcher අමුතු පවා mergesort . # 1 වෙත යන්න

  6. ඔබට තවත් ඉතිරිΘ(n) මතකයක් ?

    කළ හැකිද?

    ඔව්

    • ආදාන දත්ත දැනටමත් වර්ග කර ඇති අනුක්‍රමික දත්ත විශාල කොටස් වලින් සමන්විත වේද? වේද?

    • භාවිතය අනුවර්තනය (හෙවත් ස්වභාවික) ඒකාබද්ධ ආකාරයක හෝ timsort

    • ආදාන දත්ත බොහෝ දුරට නිවැරදි ස්ථානයේ ඇති මූලද්‍රව්‍ය වලින් සමන්විතද? වේද?

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

    නොමැත

    • ඔබට තවත් එකක් ඉතිරි කළ හැකිද?Θ(ලඝු(n))මතකය y? ඔව්

    • මෙම වන්නේ යටින් දත්ත ව්යූහයක් අධ්යක්ෂණය අනුක්රමික ප්රවේශ හෝ හොඳ ඉඩ දෙන්නේ ඇයි?

    • ඔව්

      • දත්තවල අවසානය දක්වා (උදා: යොමු කළ ටේප් ප්‍රවේශය) දක්වා එකවර කියවීමේ / ලිවීමේ ප්‍රවේශයන් එකකට පමණක් එය ඉඩ දෙයිද?
      • ඔව්, ඒකාබද්ධ කිරීමේ වර්ග කිරීම භාවිතා කරන්න , නමුත් මෙම නඩුව ක්‍රියාත්මක කිරීමට පැහැදිලි ක්‍රමයක් නොමැත, එබැවින් එයට අමතර අවශ්‍ය විය හැකියΘ(n)මතකය. නමුත් ඔබට එය කිරීමට කාලය සහ බෝල තිබේ නම්, අරා 2 ක් ඒකාබද්ධ කිරීමට ක්‍රමයක් තිබේΘ(n) කාලය භාවිතා කිරීම පමණි Θ(ලඝු(n))ඩොනල්ඩ් ඊ. නුත් "පරිගණක ක්‍රමලේඛන කලාව, 3 වන වෙළුම: වර්ග කිරීම සහ සෙවීම" අනුව ව්‍යායාම 5.5.3. එල්. ට්‍රබ්-පර්ඩෝ විසින් ඇල්ගොරිතමයක් ඇති බව ප්‍රකාශ කරයි. කෙසේ වෙතත්, මෙය බොළඳ ඒකාබද්ධ කිරීමේ අනුවාදයට හෝ ඉහත නඩුවේ ක්වික්සෝර්ට් වලට වඩා වේගවත් වනු ඇතැයි මම සැක කරමි.

      • නැත, එය දත්ත අනුක්‍රමයකට එකවර ප්‍රවේශ වීමට ඉඩ දෙයි (උදා: ටේප් ඩ්‍රයිව් නොවේ) ක්වික්සෝර්ට් භාවිතා කරන්න , ප්‍රායෝගික අරමුණු සඳහා මම අහඹු ලෙස හෝ ආසන්න වශයෙන් මධ්‍යන්‍ය එකක් නිර්දේශ කරමි. ඔබ ව්යාධිජනක ගැන සැලකිලිමත් නම්Θ(n2)අවස්ථා, හඳුන්වාදීමේ වර්ග කිරීම භාවිතා කිරීම සලකා බලන්න. ඔබ නිර්ණායක හැසිරීම් වලට නැඹුරු නම්, හැරවුම් මූලද්‍රව්‍යය තෝරා ගැනීම සඳහා මධ්‍ය-මධ්‍ය-මධ්‍ය ඇල්ගොරිතම භාවිතා කිරීම සලකා බලන්න, එයට අවශ්‍ය වේΘ(n) කාලය සහ එය බොළඳ ලෙස ක්‍රියාත්මක කිරීම අවශ්‍ය වේ Θ(n) අවකාශය (සමාන්තරගත කළ හැකි), නමුත් එය ක්‍රියාත්මක කළ හැක්කේ අවශ්‍යතාවයට පමණි Θ(ලඝු(n))අවකාශය (සමාන්තරගත නොවේ). කෙසේ වෙතත්, මධ්යන්ය-මධ්යන්ය ඇල්ගොරිතමය ඔබට වඩාත් නරක තත්වයක් ඇති නිර්ණායක ක්වික්සෝර්ට් එකක් ලබා දෙයිΘ(nලඝු(n)) ධාවන කාලය.

    • නැත, ඔබ ඉස්කුරුප්පු කර ඇත (සමාවන්න, අපට එක් එක් දත්ත මූලද්‍රව්‍යයට එක් වරක් ප්‍රවේශ වීමට අවම වශයෙන් එක් ක්‍රමයක්වත් අවශ්‍ය වේ)

      • නැත, ඔබට කුඩා නියත මතක ප්‍රමාණයක් ඉතිරි කළ හැකිද ?
      • ඔව්, යටින් පවතින දත්ත ව්‍යුහය අහඹු ලෙස ප්‍රවේශ වීමට ඉඩ දෙයිද?
        • ඔව්, හෙප්සෝර්ට් භාවිතා කරන්න , එයට අසමමිතික ප්‍රශස්ත ධාවන කාලයක් ඇතΘ(nලඝු(n)), නමුත් අශෝභන හැඹිලි සහසම්බන්ධය සහ හොඳින් සමාන්තර නොවේ.
        • නැහැ, ඔබ ඉස්කුරුප්පු කර ඇත
      • නැහැ, ඔබ ඉස්කුරුප්පු කර ඇත

ක්වික්සෝර්ට් සඳහා ඉඟි ක්‍රියාත්මක කිරීම

  • බොළඳ ද්විමය ක්වික්සෝර්ට් අවශ්‍යයි Θ(n) අතිරේක මතකය, කෙසේ වෙතත්, එය අඩු කිරීම සාපේක්ෂව පහසුය Θ(ලඝු(n))අවසාන පුනරාවර්තන ඇමතුම ලූපයකට නැවත ලිවීමෙන්. K> 2 සඳහා k-ary quicksorts සඳහා එකම දේ කිරීම අවශ්‍ය වේΘ(nලඝුk(k-1)) අවකාශය (ප්‍රධාන ප්‍රමේයයට අනුව), එබැවින් ද්විමය ක්වික්සෝර්ට් සඳහා අවම මතක ප්‍රමාණයක් අවශ්‍ය වේ, නමුත් k> 2 සඳහා k-ary qusort සමහර සැබෑ ලෝක සැකසුම් වල ද්විමය ක්වික්සෝර්ට් වලට වඩා වේගවත් විය හැකිදැයි යමෙක් දන්නේ නම් මම සතුටට පත් වෙමි.

  • ක්වික්සෝර්ට් හි පහළ-පහළ, පුනරාවර්තන ප්‍රභේද පවතී, නමුත් AFAIK, ඒවාට ඉහළ-පහළ ඒවාට සමාන අසමමිතික අවකාශයක් සහ කාල සීමාවන් ඇත, ක්‍රියාත්මක කිරීමට අපහසු අමතර පහළ පැති ඇත (උදා: පැහැදිලිවම පෝලිමක් කළමනාකරණය කිරීම). මගේ අත්දැකීම නම්, ඕනෑම ප්‍රායෝගික අරමුණු සඳහා ඒවා කිසි විටෙකත් සලකා බැලීම වටී නැත.

ඒකාබද්ධ කිරීම සඳහා ඉඟි ක්‍රියාත්මක කිරීම

  • පුනරාවර්තන ඇමතුම් අවශ්‍ය නොවන බැවින් පහළ-පහළ ඒකාබද්ධ කිරීම සෑම විටම ඉහළ-පහළ ඒකාබද්ධයට වඩා වේගවත් වේ.

  • එක් එක් පියවරෙන් පසු තාවකාලික අරාව වෙතින් දත්ත නැවත පිටපත් කිරීම වෙනුවට ද්විත්ව බෆරයක් භාවිතා කර බෆරය මාරු කිරීමෙන් ඉතා බොළඳ ඒකාබද්ධ කිරීම වේගවත් කළ හැකිය.

  • බොහෝ තාත්වික දත්ත සඳහා, අනුවර්තී ඒකාබද්ධ කිරීම ස්ථාවර ප්‍රමාණයේ ඒකාබද්ධ කිරීමකට වඩා වේගවත් වේ.

  • ආදාන දත්ත k ආසන්න වශයෙන් එකම ප්‍රමාණයේ කොටස් වලට බෙදීමෙන් ඒකාබද්ධ කිරීමේ ඇල්ගොරිතම පහසුවෙන් සමාන්තරගත කළ හැකිය. මේ සඳහා දත්ත වෙත k යොමු කිරීම් අවශ්‍ය වන අතර, k තෝරා ගැනීම හොඳ දෙයක් වන අතර, ඒ සියල්ලම k (හෝ කුඩා නියතයක් සඳහා c * k) ආසන්නතම මතක ධූරාවලියට (සාමාන්‍යයෙන් L1 දත්ත හැඹිලිය) ගැලපේ. K මූලද්‍රව්‍ය වලින් කුඩාම දේ තෝරා ගැනීම බොළඳ ක්‍රමය (රේඛීය සෙවීම) ගනීΘ(k) කාලය, එම k මූලද්‍රව්‍යයන් තුළ කුඩා ගොඩක් ගොඩ නැගීම සහ කුඩාම එකක් තෝරා ගැනීම සඳහා ක්‍රමක්ෂය කිරීම පමණක් අවශ්‍ය වේ Θ(ලඝු(k)) කාලය (අවම තේරීම වේ Θ(1) ඇත්ත වශයෙන්ම, නමුත් එක් පියවරක් තුළ එක් මූලද්‍රව්‍යයක් ඉවත් කර තවත් එකක් ආදේශ කරන බැවින් අපි ටිකක් නඩත්තු කළ යුතුය).

  • සමාන්තරගත ඒකාබද්ධ කිරීම සැමවිටම අවශ්‍ය වේ Θ(n) k නොසලකා මතකය.

  • මා ලියා ඇති දෙයින්, ක්වික්සෝර්ට් බොහෝ විට වේගවත්ම ඇල්ගොරිතම නොවන බව පැහැදිලිය, පහත සඳහන් කොන්දේසි සියල්ල අදාළ වන විට හැර:

  • හැකි අගයන් කිහිපයකට වඩා තිබේ

  • යටින් පවතින දත්ත ව්‍යුහය සම්බන්ධ නොවේ

  • අපට ස්ථාවර නියෝගයක් අවශ්‍ය නොවේ

  • දත්ත ප්‍රමාණවත් තරම් විශාල වන අතර එය බිටෝනික් වර්ගයක හෝ බැචර්ගේ අමුතු-පවා ඒකාබද්ධ කිරීමේ සුළු උප ප්‍රශස්ත අසමමිතික ධාවන කාලය ආරම්භ වේ.

  • දත්ත බොහෝ දුරට වර්ග කර නැති අතර දැනටමත් වර්ග කර ඇති විශාල කොටස් වලින් සමන්විත නොවේ

  • අපට එකවර ස්ථාන කිහිපයකින් දත්ත අනුක්‍රමය වෙත පිවිසිය හැකිය

  • මතකය ලිවීම විශේෂයෙන් මිල අධිකය (එය ඒකාබද්ධ කිරීමේ ප්‍රධාන අවාසිය නම්), එය ක්වික්සෝර්ට්හි උප ප්‍රශස්ත බෙදීම් වලින් ඔබ්බට ඇල්ගොරිතම මන්දගාමී වන තාක් දුරට ය. නැත්නම් අපට තිබිය හැක්කේΘ(ලඝු(n)) අතිරේක මතකය, Θ(n) වැඩියි (උදා: බාහිර ආචයනය)


(5): ඇපල් වර්ග කිරීම ක්‍රියාවට නැංවීම මඟින් අරාව ආරම්භයේ සහ අවසානයේ පළමු හා ඉහළට යන විට එක් ධාවනයක් පරීක්ෂා කරයි. එවැනි මූලද්‍රව්‍යයන් නොමැති නම් මෙය ඉතා ඉක්මන් වන අතර, මෙම මූලද්‍රව්‍යයන් n / ln n ට වඩා වැඩි නම් ඒවා ඉතා effectively ලදායී ලෙස හැසිරවිය හැකිය. වර්ග කළ අරා දෙකක් සංයුක්ත කර
ප්‍රති result ලය

මම ඒ සඳහා ගොග්ලිං කිරීම ගැන වෙහෙසට පත් වූ අතර, IIRC ෆේස්බුක් හෝ ගූගල් විසින් පුස්තකාලයක් නිර්මාණය කරන ලද්දේ කුමන ඇල්ගොරිතම භාවිතා කළ යුතුද යන්න තීරණය කිරීමට පෙර දත්ත ගවේෂණය කරමිනි, මම සිතුවේ එය F15 හෝ වෙනත් දෙයක් ලෙස හැඳින්වූ බවයි
එස්ඩීරීස්

8

බොහෝ වර්ග කිරීමේ ක්‍රම වලට දත්ත කෙටි පියවරකින් ගෙන යා යුතුය (නිදසුනක් ලෙස, ඒකාබද්ධ කිරීම වර්ග කිරීම දේශීයව වෙනස්කම් ඇති කරයි, පසුව මෙම කුඩා දත්ත කැබැල්ල ඒකාබද්ධ කරයි, පසුව විශාල එකක් ඒකාබද්ධ කරයි ..). ප්‍රති consequ ලයක් වශයෙන්, දත්ත එහි ගමනාන්තයට වඩා is තින් නම් ඔබට බොහෝ දත්ත චලනයන් අවශ්‍ය වේ.

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


5
Quickort vs ඒකාබද්ධ කිරීමේ වර්ග කිරීම පිළිබඳ ඔබේ තර්කය ජලය රඳවා නොගනී. ක්වික්සෝර්ට් විශාල චලනයකින් ආරම්භ වන අතර පසුව කුඩා හා කුඩා චලනයන් සිදු කරයි (සෑම පියවරකදීම අඩක් පමණ විශාල වේ). ඒකාබද්ධ කිරීම කුඩා පියවරකින් ආරම්භ වන අතර පසුව විශාල හා විශාල චලනයන් සිදු කරයි (එක් එක් පියවරේදී දෙගුණයක් පමණ විශාල වේ). මෙයින් එකක් අනෙකට වඩා කාර්යක්ෂම වීමක් පෙන්නුම් නොකරයි.
ගිලෙස්ගේ SO- නපුරු වීම නවත්වන්න '
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.