دا الګوریتم دی په کوډ کې پلي کیږي د پروژې څخه د کلستر کلینټ کتابتونونه "ختیځ". (هلته، ونه په O(N lg N) کې جوړه شوې، مګر دا د الګوریتم وروستی پیچلتیا اغیزه نه کوي.)
دنده 2. زیبرا
دا اړینه وه چې په حافظه کې د اسنادو د مؤثره ترتیب کولو لپاره د الګوریتم وړاندیز وکړو چې د خپل سري غیر شاخص شوي ساحې لخوا:
ستاسو ټیم ته دنده سپارل شوې چې د حافظې دننه د اسنادو ډیټابیس رامینځته کړي. یو عام کاري بار به د لوړ N سندونو غوره کول وي چې د اندازې M (معمولا N <100 << M) ټولګه څخه د خپل سري (غیر شاخص شوي) شمیرې ساحې لخوا ترتیب شوي وي. یو څه لږ عام کاري بار به د پورتنۍ S سندونو (S ~ N) له پریښودو وروسته د پورتنۍ N غوره کول وي.
یو الګوریتم وړاندیز کړئ چې دا ډول پوښتنې په اغیزمنه توګه ترسره کړي. په اوسط قضیه کې د لوی O نوټیشن په کارولو سره د دې کمپیوټري پیچلتیا اټکل وکړئ او ترټولو بد حالت سناریو.
د حل تحلیل (ویډیو)
په 34:50 پیل کیږي، یوازې 6 دقیقې:
د حل تحلیل (متن)
د سطحې حل: ټول اسناد ترتیب کړئ (د مثال په توګه څوکه)، بیا د N+S اسناد واخلئ. په دې حالت کې، د ترتیب کولو پیچلتیا په اوسط ډول O (M lg M)، په بدترین O (M2) کې ده.
دا څرګنده ده چې د ټولو M اسنادو ترتیب کول او بیا د دوی یوازې لږه برخه اخیستل غیر موثر دي. د دې لپاره چې ټول اسناد ترتیب نه کړئ، یو الګوریتم مناسب دی چټک انتخاب، کوم چې به د غوښتل شوي اسنادو N + S غوره کړي (دوی د هر ډول الګوریتم لخوا ترتیب کیدی شي). په دې حالت کې، پیچلتیا به په اوسط ډول O (M) ته راټیټ شي، پداسې حال کې چې بدترین حالت به ورته پاتې وي.
په هرصورت، تاسو کولی شئ دا حتی په اغیزمنه توګه ترسره کړئ - د الګوریتم څخه کار واخلئ د بائنری هیپ جریان. په دې حالت کې، لومړی N+S سندونه په min- یا max-heap کې اضافه کیږي (د ترتیب په لور پورې اړه لري)، او بیا هر راتلونکی سند د ونې له ریښې سره پرتله کیږي، کوم چې اوسنی لږترلږه یا اعظمي سند لري، او د اړتیا په صورت کې ونې ته اضافه کیږي. په دې حالت کې، پیچلتیا په بدترین حالت کې، کله چې تاسو په دوامداره توګه د ونې بیارغونه کوئ، O(M lg M) دی، پیچلتیا په اوسط ډول O (M) ده، لکه څنګه چې د چټک انتخاب سره.
په هرصورت، د هپ سټریمینګ د دې حقیقت له امله ډیر اغیزمن وګرځید چې په عمل کې ډیری اسناد د هغې د اصلي عنصر سره د یو واحد پرتله کولو وروسته د هپ بیا جوړولو پرته رد کیدی شي. دا ډول ترتیب د زیبرا په حافظه کې د اسنادو ډیټابیس کې پلي کیږي چې په کنټور کې رامینځته شوی او کارول کیږي.
د سطحې حل: د لومړي او دویم عنصر حالتونه تبادله کړئ، بیا لومړی او دریم، بیا لومړی او څلورم، او داسې نور. د هر تبادلې وروسته، د یو عنصر حالت به په مطلوب موقعیت کې وي. تاسو باید د O (N) اجازه ورکړئ او د O (N M) وخت مصرف کړئ.
خطي وخت اوږد دی، نو تاسو کولی شئ د عناصرو حالتونه په جوړه کې تبادله کړئ: لومړی د دویم سره، دریم د څلورم سره، او داسې نور. د هر دولت تبادلې وروسته، هر دویم عنصر به په سم حالت کې وي. تاسو باید د O(lg N) اجازه ورکړئ او O(M lg N) وخت مصرف کړئ.
په هرصورت، دا ممکنه ده چې بدلون نور هم اغیزمن کړي - نه په خطي کې، مګر په دوامداره وخت کې. د دې کولو لپاره ، په لومړي ګام کې ، تاسو اړتیا لرئ د لومړي عنصر حالت له وروستي سره تبادله کړئ ، دوهم د پای پای سره ، او داسې نور. د وروستي عنصر حالت به په سم حالت کې وي. او اوس موږ اړتیا لرو چې د دوهم عنصر حالت له وروستي سره تبادله کړو، دریم له پایه لرونکي سره، او داسې نور. د تبادلې له دې پړاو وروسته، د ټولو عناصرو دولتونه به په سم حالت کې وي. په مجموع کې به O(2M) ~ O(1) تخفیفونه وي.
دا ډول حل به یو ریاضي پوه ته حیران نه کړي چې لاهم په یاد لري چې گردش د دوه محوري سمیټریونو ترکیب دی. د لارې په توګه، دا د بدلون لپاره په معمولی توګه عمومي شوی نه د یو لخوا، مګر د K <N پوستونو لخوا. (په نظرونو کې ولیکئ چې دقیقا څنګه.)