Digər lüğətlərdə bir "dəstə" nə olduğunu izləyin. Xovlu sinonimlər xovlu nümunələr

Digər lüğətlərdə bir "dəstə" nə olduğunu izləyin. Xovlu sinonimlər xovlu nümunələr

İkili yığın (ikili yığın) tez bir zamanda (logaritmik vaxt üçün) elementlər əlavə etməyə və elementləri maksimum prioritet (məsələn, maksimum dəyər) olan bir elementi çıxarmağa imkan verən məlumatlar quruluşu tərəfindən həyata keçirilir.

Daha sonra oxumaq üçün ağaclar haqqında bir fikir vermək lazımdır və alqoritmlərin mürəkkəbliyinin qiymətləndirilməsi barədə də bilmək istənir. Bu məqalədəki alqoritmlər C # ilə kodla müşayiət olunacaq.

Giriş

İkili bir dəstə, həyata keçirildiyi tam ikili ağacdır kuchinin əsas xüsusiyyəti.: Hər bir vertexin prioriteti onun nəsilləri üçün daha çox prioritetdir. Ən sadə halda, hər bir vertexin prioriteti onun dəyərinə bərabər hesab edilə bilər. Bu vəziyyətdə quruluş adlanır max-yığın, Subfersionun kökü, alt hissənin elementlərinin dəyərlərinin maksimum olmasıdır. Bu yazıda bu sadəlik üçün istifadə olunur. Ağacın adlandırıldığını da xatırladıram tam ikiliHər bir ucundan iki nəsildən çoxu yoxdursa və zirvələrin səviyyəsinin doldurulması yuxarıdan aşağıya (eyni səviyyədə - soldan sağa).

İkili dəstə rahatlıqla birölçülü bir sıra şəklində saxlanılır və indeks ilə vertexin sol nəsli I. indeksi var 2 * i + 1və sağ 2 * i + 2. Ağacın kökü bir indeks olan bir elementdir. İkili yığın hündürlüyü ağacın hündürlüyünə bərabərdir, yəni 2 n, yəni log 2 n N. - sıra elementlərinin sayı.

C # üzərində bir sinif boşluq verin:

İctimai sinif Binaryheap (Şəxsi siyahı Siyahı; İctimai inte yığın (bu geri qayıt.))))))

Bir maddə əlavə etmək

Yeni element serialdakı son yerə əlavə olunur, yəni indeks ilə mövqedir Yığın.:

Yeni elementin daha çox valideyn ola biləcəyi üçün yığın əsas mülkinin narahat olacağı mümkündür. Bu vəziyyətdə, yığının əsas əmlakı müşahidə olunana qədər bir səviyyəli bir elementi (zirvəli valideynlə dəyişmək) üçün "qaldırmalı" etməlisiniz:

Başqa sözlə, yeni element "pops up", "itələmək", yerini alana qədər. Alqoritmin mürəkkəbliyi ikili yığın hündürlüyündən çox deyil ("liftlərin" sayından ağacın hündürlüyündən çox deyil), yəni o (log 2 n) bərabərdir.

İctimai void əlavə (int dəyəri) (siyahı.add (dəyəri); int i \u003d yığın - 1; int valideyn \u003d (i - 1) / 2; isə (i\u003e 0 && siyahısı< list[i]) { int temp = list[i]; list[i] = list; list = temp; i = parent; parent = (i - 1) / 2; } }

İkili yığın sifariş

Artıq tikilmiş ikili dəstə olan digər əməliyyatlar zamanı yığının əsas xüsusiyyəti də narahat ola bilər: zirvəsi onun nəslindən az ola bilər.

Üsul İzləşdirmək İkisi də dəstəklədiyi təqdirdə, i-ci Vertexdə bir kök olan bir ağac üçün bir yığın bir ağacın əsas əmlakını bərpa edir. Bunu etmək üçün, əsas əmlak bərpa olunana qədər i-uu vertexini (nəsillərin ən böyüyü olan yerlərdə dəyişmək) lazımdır (bu proses, valideynindən daha çox nəsil olmadıqda proses başa çatacaq). Bu alqoritmin mürəkkəbliyinin də o (log 2 n) -ə bərabər olduğunu başa düşmək asandır.

İctimai boşluq (int solschild; int hicchild; int ən böyük; üçün (;) (;) (solchild \u003d 2 * i + 1; ən böyük \u003d i + 2; əgər (mən)< heapSize && list > Siyahı) (ən böyük \u003d solşəkil) varsa (sağçı)< heapSize && list > Siyahı) (ən böyük \u003d sağçı;) əgər (ən böyük \u003d\u003d i) (qırılma;) int temp \u003d siyahı [i]; Siyahı [i] \u003d siyahısı; Siyahı \u003d temp; İ \u003d ən böyük; ))

Binary yığın

Bir dəstə nizamlı bir sıra qurmağın ən açıq yolu, bütün elementlərini əlavə edir. Belə bir o (n log 2 n) alqoritminin müvəqqəti qiymətləndirilməsi. Ancaq daha sürətli bir dəstə qura bilərsiniz - O (n) üçün. Birincisi, yığın əsas əmlakına riayət etməkdən narahat olmayaraq, massivin bütün elementlərindən bir ağac tikmək lazımdır və sonra metodu çağırın İzləşdirmək Ən azı bir nəsil olan bütün ucları üçün (nəsil olmadan bir vertexdən ibarət olan subtrekslər üçün artıq sifariş olunur). Nəsillərin əvvəlcə yeməsinə zəmanət verilir Yığın / 2. Verkhin.

İctimai Void Buildheap (Int Sourcearray) (Siyahı \u003d Sourcearray.tolist (); üçün (INT i \u003d i \u003d 2; i \u003d 2; i--) (i- 0; i-) (i) (

Maksimum elementin çıxarılması (çıxarılması)

Qaydada Max-yığın Maksimum element həmişə kökdə saxlanılır. Son elementi öz yerinə qoyaraq zəng edərək maksimum elementi çıxarıldıqdan sonra ikili yığın sifarişini bərpa edin İzləşdirmək Kök üçün, yəni bütün ağacları düzəldir.

Public int getmax () (int nəticə \u003d siyahısı; siyahısı \u003d siyahısı; siyahı.removeat (yığmaq - 1); qayıtmaq nəticə;)

İkili yığın ilə çeşidləmək

Qeyd edək ki, bir sıra, əvvəlcə ikili bir dəstə qura bilərsiniz, sonra ardıcıl olaraq maksimum elementləri aradan qaldıra bilərsiniz. Belə bir elementin müvəqqəti mürəkkəbliyini qiymətləndirək: bir yığın - o (n), hasilat N. Elementlər - o (n log 2 n). Nəticə etibarilə, son qiymətləndirmə o (n log 2 n). Bu vəziyyətdə, serial üçün əlavə yaddaş istifadə edilmir.

İctimai boşluq yığımı (massiv); üçün (int i \u003d array.length - 1; i\u003e \u003d 0; i-) (massiv [i] \u003d getmax ();)

Rəy

Beləliklə, ikili yığın bir logaritmik boylu ağac quruluşuna malikdir (ucları sayına nisbətən), logaritmik vaxt üçün elementlər əlavə etməyə və elementi daimi vaxt üçün maksimum prioritet olan elementləri çıxarmağa imkan verir. Eyni zamanda, ikili dəstəni həyata keçirmək asandır və əlavə yaddaş tələb etmir.

Safra

1. Çox sayda bir şey, bir slaydda bir yerdə qaçdı. Bir yığın qum. "Bir dəstə qırılma, xoruz inci taxıl tapdı." Qanad . "Bir dəfə döyüşçülər onu bir dəstə içində yer üzünü sökməyi əmr etdilər." Puşkin . Yarpaq yığın.

|| Nizamsız yapışqan, müxtəlif əşyaların yığılması. Küncdə hər xovlu bir dəstə düşdü. Yanan evdən, əşyalar dözdü və bir yığın içində qoyuldu.

❖ Hər şeyi bir xovluya (tərəqqi) tökün - bitdi. Təhlil etmədən, bir fərqli hadisəyə qarışdırılır, çirkindir. Vəhşi mala yığın! - nida, upotr. Bir uşaq oyununda, ümumi bir poliqonun razı qaldığı zaman.


İzahat lüğəti Ushakov. D.N. Uşakov. 1935-1940.


Sinonimlər:

Digər lüğətlərdə bir "dəstə" nə olduğunu izləyin:

    Arvadlar. Döş, ləkə, torpaq, əşyalar dağ; | izdiham, toplama; * çox; | Novg., Tver. Mis ot. | Mosk. Sürüdə bir sahibdən idarə olunan mal-qaranın sayı. Toxunan yığınlar. Bir yığın, insanlar. Mənə çox narahatlıq var. Bir dəstə qırxmaq. Anthill ... Dalyın izahlı lüğəti

    Yığın, toplu, yığın, təpə, kip, kupe, qar yağışı; Skyrov, yığın, ohm. Cəsədlər yaralar qoyur. Bu kənddə atlar yuvalardır. Ağaclar çimir. Yığın (dəri) ot. Plug (Odonya, Odonya, Ekrod) çörək. Yağ saman .. cf. . Xülasələrə baxın, qulaq ... Sinonim lüğəti

    Yığın və, arvadlar. 1. nənin yığılması. Şanslı. K. Qum. Bir dəstə qısa quru yarpaqlar. 2. Nə. N olan nəyin səyahət, n hər şeyin dəsti. K. Kitablar. K. etdim. K. Pul (çox). İzdiham yığın. Vəhşi mala yığın! Bir uşaq oyununda, Roma üçün ... ... ... Ozhegovun izahlı lüğəti

    safra - Baxış-icmal. Yığın, sinə, söhbət Yığın, danış Dağ ... Rus nitqinin Tezaurus sinonimlərindən lüğəti

    safra - yığın, dağ, pendir, kip, yığın. 0501 səh. 0502 pp. 0503 s. 0504 səh. 0505 ... Rus dilinin sinonimlərinin yeni izahlı lüğəti

    safra - Döş Başçısı Kip (Kağız) Tutu Paket Paketi - Mövzular Neft və Qaz Sənayesi Sinonimləri AnaBelKip (kağız) qablaşdırma təchizatı təchizatı təchizatı ... Texniki tərcüməçi qovluğu

    Yanmış yığın. Arch, uşaq. Eyni şey kiçikdir. AOS 9, 341. Bir dəstə ulduz. Sib. Bürc pleiad. FSS, 102. Xovlu Mala! Uşaqlıq Ümumi bir poliqon üçün bir siqnal olan oyunda Harked. F 1, 273; Fser, 219; BTS, 483, 517. Bir dəstə sinə. Arak. Böyük ... ... ... Rus kəlmələrinin böyük lüğəti

    Məbləğ., G., Upotr. Tez-tez morfologiya: (yox) nə? Yığınları nə? Yığın, (bax) Nə? Dəstə? Bug, nə? Yığın haqqında; Mn. nə? Yığınlar, (yox) nə? Kuch, nə? Yığın, (bax) Nə? Qoşqulardan? Yığın, nə haqqında? Bir dəstə haqqında 1. hər hansı bir şey, material və s. İzahat Lüğət Dmitrieva

    Safra - Böyük və ya qonşu (dor), Cher (Shör), Kiçik (Uudor) yığınları, İzhma funksiyaları. Üçün Buna görə 31 km, 33 km, 13 km, 13 km. Hiyonim bir yığın rus ilə əlaqələndirilir. Sərinlik "Sərin, Clutched Sahil; Xam çayda yüksək sahil. Sahillərdən biri yüksəlir, ... ... Komi Respublikasının toponimik lüğəti

    Bu müddətin digər mənaları var, bir dəstə (dəyərlərə) baxın. Kizille'de Fresco-da yığınların sakinlərinin görüntüsü. Yığın (həmçinin Kuchte və Kuchar) Qədim Buddist Dövləti ... Vikipediya

Kitablar

  • Yığın (ed. 2015), bibər nişanəsi. Bibəriliyin işarəsi - yəhudi şairi, dramaturq və romanist. 1922-ci ildə Eidis-də ilk dəfə nəşr olunan şeirində "Bir dəstə" də illər ərzində Ukraynadakı yəhudi pogromlarının nəticələrindən acı oldu ...

Daha az kod yazmağı və əla nəticələr əldə etməyə imkan verən getdikcə inkişaf etmiş proqramlaşdırma dillərindən istifadə edirik. Bunun üçün ödəməlisiniz. Getdikcə aşağı səviyyəli şeylər ilə məşğul olduğumuz üçün, bir çoxumuz, yığının və bir dəstənin əslində baş verdiyini, statik və dinamik yazma arasındakı fərq nədir və s. Demirəm ki, bütün proqramçılar bu anlayışlar haqqında bilmirlər - yalnız düşünürəm ki, bəzən belə köhnə məktəbə qayıtmağa dəyər.

Bu gün yalnız bir mövzuya dair danışacağıq: yığın və bir dəstə. Həm yığma, həm də bir dəstə yaddaş idarəçiliyinin baş verdiyi müxtəlif yerlərə aiddir, lakin bu nəzarətin strategiyası tamamilə fərqlidir.

Yığışdırmaq

Yığma, hər bir axın üçün yaradılan bir qoç sahəsidir. Lifo qaydasında (sonuncuda, əvvəlcə) işləyir, yəni, yəni bir yaddaş parçasının yığına əlavə olunan, yığından çəkilmək üçün ilk olaraq olacaqdır. Hər dəfə funksiya yeni bir dəyişən elan edir, yığınya əlavə olunur və bu dəyişən əhatə dairəsindən (məsələn, funksiya bitdikdə), yığından avtomatik olaraq çıxarılır. Yığma dəyişən sərbəst buraxıldıqda, yaddaşın bu sahəsi digər stall dəyişənləri üçün mövcud olur.

Yığın bu təbiətinə görə, yaddaş idarəetmə CPU-da çox məntiqli və asandır; Bu, yüksək sürətlə aparır, xüsusən Stack Bayte Yeniləmə dövrünün vaxtı çox kiçikdir, yəni I.E. Bu bayt çox güman ki, prosessor önbelleğe bağlanır. Bununla birlikdə, rəhbərliyin belə ciddi bir forması əlverişsizdir. Yığın ölçüsü sabit bir dəyərdir və yaddaş yığınıda seçilmiş həddən artıq olan hədd daşmaqla nəticələnəcəkdir. Bir axın yaratarkən ölçüsü təyin olunur və hər bir dəyişən məlumatların növündən asılı olan maksimum ölçüə malikdir. Bu, bəzi dəyişənlərin ölçüsünü (məsələn, tam) ölçüsünü məhdudlaşdırmağa və daha mürəkkəb məlumat növlərinin ölçüsünü (məsələn, serialların) ölçüsünü elan etməyə məcbur edir və yığışın dəyişdirməsinə imkan verməyəcəkdir. Bundan əlavə, yığma üzərində yerləşən dəyişənlər həmişə yerlidır.

Nəticədə yığın, yaddaşın yaddaşını ən səmərəli idarə etməyə imkan verir - ancaq dinamik məlumat strukturlarından və ya qlobal dəyişənlərdən istifadə etmək lazımdırsa, bir dəstəyə diqqət yetirməlisiniz.

Safra

Bir dəstə, dinamik yaddaş ayırmasına və yığma prinsipində işləmir, bu da çadırınızın prinsipi üzərində işləmir: bu dəyişənlər üçün bir anbardır. Bir dəyişən saxlamaq üçün bir dəstə bir dəstə bir dəstə ayırdığınız zaman, yalnız axında deyil, həm də tətbiq boyunca əlaqə saxlaya bilərsiniz. Qlobal dəyişənlərin necə müəyyənləşdirildiyi budur. Tətbiq başa çatdıqdan sonra, yaddaşın bütün seçilmiş bütün bölmələri buraxılır. Tətbiq başlandığı zaman yığın, ancaq yığmadan fərqli olaraq, bu yalnız fiziki cəhətdən məhduddur və bu, dinamik dəyişənlər yaratmağa imkan verir.

Adətən göstəricilərə istinadlar tərəfindən bir dəstə ilə qarşılıqlı əlaqə qurursunuz - bunlar dəyərləri digər dəyişənlərin ünvanları olan dəyişənlərdir. Bir göstərici yaratmaqla, dəyişənin ilkin dəyərini təyin edən və bu dəyərə daxil olacağınız proqramı bildirən bir yığındakı yaddaşın yerini göstərəcəksiniz. Dinamik təbiətə görə, CPU yığınları buna nəzarətdə iştirak etmir; Zibil kolleksiyaçısı olmayan dillərdə (C, C ++), geliştirici artıq lazım olmayan yaddaşın hissələrini əl ilə buraxmalıdır. Bu edilməyibsə, yığın işini xeyli yavaşlamayacaq yaddaşın sızması və parçalanması ola bilər.

Bir yığın ilə müqayisədə, bir dəstə daha yavaş olur, çünki dəyişənlər yaddaşdan səpələnir və yığının yuxarısında oturma. Bir yığındakı səhv yaddaş idarəetmə işində yavaşlamağa səbəb olur; Buna baxmayaraq, bu, onun əhəmiyyətini azaltmır - dinamik və ya qlobal dəyişənlərlə işləmək lazımdırsa, bir dəstədən istifadə edin.

Rəy

Beləliklə, yığın və yığın anlayışları ilə tanış oldunuz. Qısaca, yığın, lifo prinsipi və idarə olunan prosessor üzərində işləyən çox sürətli bir yaddaş yaddaşıdır. Lakin bu üstünlüklər məhdud yığma ölçüsünə və dəyər almaq üçün xüsusi bir üsula səbəb olur. Bu məhdudiyyətlərin qarşısını almaq üçün bir dəstədən istifadə edə bilərsiniz - dinamik və qlobal dəyişənlər yaratmağa imkan verir - ancaq yaddaşı ya zibil kollektoru, ya da bir proqramçı özü və daha yavaş işlərə nəzarət etməlisiniz.

Sinonimlər:

Yığın, toplu, yığın, təpə, kip, kupe, qar yağışı; Skyrov, yığın, ohm.

Cəsədlər yaralar qoyur. Bu kənddə atlar yuvalardır. Ağaclar çimir. Yığın (dəri) ot. Plug (Odonya, Odonya, Ekrod) çörək. Yağ saman ..

CF. . Santimetr. Vurğulamaq, yığın, çox

bir dəstə xəbər tökün, bir dəstə toplayın ... ..

Rus sinonimlərinin 4-cü sinonimlərinin lüğəti

safra

Sinonimlər:

cupsess, saymazlıq, qiyamsızlıq, vasitə, avtomobil, kim, ölü, dağa, pendir, dəstə, kütlə, boşluq, boşluq, güc, çoxluq, stap, sxem, qarmaq, qarmaqarışıqlıq, Qaranlıq mövzular, qaranlıq lal, ulm, sumsh

Yığın dəyəri

T.F. Efremova rus dilinin yeni lüğətidir. Bağlı söz formalaşdırıcıdır

safra

Dəyər:

üçün w.Cha

g.

a) bir təpə, donuz əti, sinə kimi.

b). Çox miqdarda çoxluq

2). İzdiham, yığılma (insanlar, heyvanlar).

3). Çox sayda, dəsti.

S.I. Ozhegov, N.Yu. Swedov rus dilinin izahlı lüğəti

safra

Dəyər:

Yığın, -i, g.

1. Bir şeyin yığılması. Şanslı. K. Qum. Bir dəstə qısa quru yarpaqlar.

2. nə. Bir şeyin səyahət., Birinin çoxu. K. Kitablar. K. etdim. K. pul (çoxlu). İzdiham yığın.

Vəhşi mala yığın! Uşaq oyununda keçirilən ümumi poliqon, Rom tərəfindən başlayır.

| Azaltmaq. kubok, - və, yaxşı. (1 mənası).

Rus dilinin kiçik akademik lüğəti

safra

Dəyər:

g.

Çox sayda şey, ümumiyyətlə toplu, kiçik, şişkin, bir yerdə yuyulur.

Bir yığın qum. Bir yığın daş.

Onun daxmaları, yüklərdə, yığınlar tərəvəz və günəşdə qurudulur.

Böyük bir miqdarda Bir-birinə qarışan obyektlər; yığın.

Otaq, bir dəstə səbət, şəbəkələrdə və bütün iqtisadi əşyalarda olan bir dəstə olan küçədən ayrıldı. Ketlin, cəsarət.

2. .

İnsanların, heyvanların çoxluğu.

Bir dəstə qara və qara qadın sahilə taclandı. I. Goncharov, "Pallada" Fregat.

Fransız qoşunları, ilk üç sütunun ilk növbəsində indi bir yığın idi. L. Tolstoy, müharibə və sülh.

(Qoyun), istilik və heedodesdən qaçaraq bir dəstəyə qaçaraq hərəkətsiz bir şəkildə dayanır. Serafimoviç, atəş.

kimsə. . Çox sayda; çoxlu.

Bu əsərlərin alıcıları (sinə rəsmləri) ümumiyyətlə bir az, lakin tamaşaçılar - bir dəstədir. Gogol, portret.

Əvvəlki fəsildə bir fəzilətli bir qadının bir dəstə cəfəngiyat etdiyini gördük. Pisarev, bir buket vətəndaş kədəri ilə kukla faciəsi.

"İdarəetmədə toplanmış bir dəstə var" dedi. Krım, Dərbənd tanker.

Vərəqdən sıfırdan yazıldıqdan sonra kifayət qədər tip, qeyri-dəqiqlik və səhvlər var. Bir typo və ya səhv görmüsünüzsə, onu seçin, CTRL + düyməsini basın və problemi təsvir edin. Daha çox yazmaq və onun həlli də arzu olunur.
Eynilə, bir neçə mətn parçası tamamilə anlaşılmaz olsa da edə bilərsiniz. Daha çox başa düşülən bir mətndə bir hissəsi üçün bir hissə üçün bir əvəz təklif edə bilsəniz - bu, sadəcə gözəl olacaqdır!

Giriş

Axı, kiçik bir araşdırılmamış "ən pis" - "sürətli" növləri öyrəndik. Artıq kvadrat dövr üçün işləyən bir neçə alqoritmləri sökmüşük - baloncuk, seçim, daxil etməklə sırala. Bu alqoritmlər sadədir, lakin böyük seriallara gəldikdə optimallaşdırma tələb edir. Onların hər biri üçün onları "sürətli" halına gətirən optimallaşdırma var - yəni işləyir n log n..

Köhnə çeşidləmə "yadda saxlamağın" olmasına başlayaq. Bəli, biz artıq bu vəzifələri həll etdik, ancaq yenidən onlar üçün kodu e-poçtla göndərin. İlin əvvəlində yaxşı bir məşq olacaq.

01: Bubble ilə sırala

Dan tam ədədlərin siyahısı. Qaydada sırala qeyri-kilsə dəyərlər. Ekrandakı yaranan siyahını göstərin.

qabarcıq çeşidləmə. Qərar Bubble_Sort (a) funksiyası şəklində abunə olun.

Bubble çeşidləmə alqoritmində keçid əvvəldən sonuna qədər siyahıda aparılır və əgər iki bitişik siyahı elementi səhv qaydada olduqda, düzgün qaydada yenidən qurulur. Nəticədə, siyahının minimum elementi sonuncu yerdə olacaqdır. Bəzilərini dəyişdirməyincə bu əməliyyatı təkrarlayacağıq.

Giriş Çıxış
1 4 2 3 4 4 4 3 2 1

02: Seçimlə sırala

Dan tam ədədlərin siyahısı. Bu siyahının bütün əşyalarını qaydada çıxartın qeyri-kilsə dəyərlər. Ekranda yeni bir siyahı göstərin.

Bu vəzifəni alqoritm ilə qərar verin seçimi çeşidləmək. Qərar Selection_Sort (a) funksiyasını izah edin.

Çeşidləmə alqoritmində siyahının ilkin hissəsi artıq sıralanır. Büstlə dolu siyahının qalan hissəsində ən böyük elementi tapırıq və sıralanmış hissənin sonuna qoyuruq (sadəcə mübadilə).

Köməkçi siyahısından istifadə edə bilməzsiniz.

Giriş Çıxış
1 4 2 3 4 4 4 3 2 1

03: Çeşidləmə daxil edin

Dan tam ədədlərin siyahısı. Qaydada sırala yaxınlıqdakı dəyərlər. Ekrandakı yaranan siyahını göstərin.

Bu vəzifəni alqoritm ilə qərar verin Çeşidləmək. Qərar Taxıl_sort (a) funksiyası şəklində abunə olun.

Bu vəzifə əlavə bir siyahı və çıxarılması və işləmə əməliyyatları istifadə edə bilməz.

Hər ixtiyari anda daxil etmə alqoritmində siyahının ilkin hissəsi artıq sıralanır. Sonrakı, siyahının sıralanmış hissəsinə uyğun olmayan hissədən ilk element əlavə olunur. Bunu etmək üçün elementi daxil etmək lazım olan bir mövqe var, sonra artıq çeşidlənmiş hissənin parçalanmasının tsiklik sürüşməsi aparılır.

Demək olar ki, çeşidlənmiş seriala diqqət yetirin, alqoritminiz kvadrat dövr üçün işləməməlidir.

Uyğun bir taxma axtarın ikili axtarış edilə bilər. BISECT modulundan istifadə edə bilərsiniz (sənədlərə və ruslara bax).

Giriş Çıxış
1 4 2 3 4 1 2 3 4 4

Piramidal çeşidləmə seçərək çeşidləmədən

Tərif üçün bir sıra artan bir sıra sıralayacağıq. (Daha doğrusu, uyğunsuzluqla, çünki serial təsadüf elementləri ola bilər).

Seçimlə əsas çeşidləmə sxemi qorunub saxlanılır. Array iki hissəyə bölünür, onlardan biri (sağ) artıq sıralanır və sıralanan hissənin hər hansı bir elementi hər hansı bir elementin səliqəsiz deyil:

Baxılmamış hissənin ölçüsü\u003e 1 yerinə yetirərkən | Maksimum element tap | Sonun çeşidlənmiş hissəsinin sonuna qədər yenidən qurulması. Burada nə sürətlənə bilər? Yalnız maksimum elementi axtarın: elementin köçürülməsi və belə aparılır O (1) (bütün massivdə hesablanır - O (n)).

Sadə çeşidləmədə, bizik k-1 müqayisə (harada k. - istenmeyen hissənin uzunluğu) yalnız maksimum (minimum) elementi tapdı. Eyni zamanda, tez-tez əşyaların bəzi parametrlərinin nisbi dəyərləri haqqında məlumat aldıq, ancaq "unudulmuş". Piramida çeşidlənməsi ilə bu məlumatı qeyd edəcəkdir. Başqa sözlə, istifadə olunmamış hissəsi olduqca təsadüfi olmayacaq - hər dəfə maksimum elementi tez bir zamanda seçməyə imkan verən daxili bir quruluşa sahib olacaqdır.

Bu "Saxla" həyata keçirmək üçün İkili (İkili) və ya Piramida adlı bir məlumat quruluşu tələb olunacaq (İngilis dilində bu məlumat quruluşu deyilir) qalaq, hərfi tərcümə - bir dəstə, ancaq termin piramidaBəzən istifadə olunan, işin mahiyyəti haqqında daha yaxşıdır. Burada nəzərdən keçirilən çeşidləmə alqoritmi bir yığın, piramidal çeşidləmə və ya daha az, bir ağac çeşidlənməsi ilə çeşidləmə adlanır.). Eyni zamanda, bir yığın əsasında prioritet prioriteti öyrənmək rahat olacaq. Maksimum elementi bir yığından nə qədər tez bir zamanda çıxara bilməsi lazımdır? Buna görə çeşidləmə mürəkkəbliyi idi O (N.) Giriş. n)seçmək üçün vaxt seçmək üçün kifayətdir O (giriş. n)). Yığın əsas ideyası budur ki, bir sıra ikili ağacın nümayəndəsi kimi hesab edirik və bu ağacın qovşaqlarında müəyyən bir sifariş təqdim edirik.

Beləliklə, belə bir quruluşu həyata keçirsək, çeşidləmə alqoritmi aşağıdakı formanı əldə edəcəkdir:

Bir yığın (piramida) bir dəstə (piramidaya) çevirin Maksimum elementi seçin və sıralanan hissəyə köçürün

Prioritet

Bir yığın icrası vəzifəsinin prioritet növbəni səmərəli həyata keçirmək vəzifəsi ilə əlaqəli olduğunu görmək asandır. (Bu, əvvəllər "qalxdı", amma daha çox "ən yaxşısı" vacib deyildir. Daha xüsusi: növbədə növbə olduqda, elementin prioriteti yerləşdirildikdə və Ən böyük prioritet olan elementlərdən biri seçilir. Sadəliyi üçün təlim tapşırıqlarında prioritet adətən element dəyərinə xidmət edir).

Axı və seçimi çeşidləmək və prioritet növbənin həyata keçirilməsində maksimum elementi tez bir zamanda çıxarmaq lazımdır. Bununla birlikdə, prioritet növbə, yanında daxili quruluşunu pozmadan tez yeni bir element əlavə edə bilməlidir.

Bir müddət çeşidləmədən yayındırmaq və bir yığın əsaslı prioritet növbənin tətbiqi ilə bağlı çeşidləmə və sökmək rahat olacaqdır.

İkili bir dəstə (piramida)

Aşağıdakı şəkil, serialın elementlərini ikili ağacın uclarında necə göstərəcəyini göstərir:

A / \\ a a / \\ / \\ a a / \\ a a / \\ a a / a tamamilə müəyyən bir forma ağacı çıxır: bütün səviyyələri, ehtimal ki, ən aşağı, tamamilə doldurulmuşdur. Və ən aşağı səviyyədə, bütün boş yerlərdə, əgər varsa, mövcud ucların hüququ var. Belə ikili ağacı çağıracağıq demək olar ki. Şəkildən, indekslə vertexin valideyninin olduğunu görmək asandır i. indeksi var (İ - 1) // 2və sol və sağ qızlar indekslərdir 2i + 1.2i + 2. müvafiq olaraq.

Ağac hündürlüyü ağacdakı səviyyələrə zəng edəcək (və ya eyni, kökdən çox sayda hesab üstə olan yolun uzunluğu bir). Beləliklə, bu rəqəmdəki ağac üçün, kökündən yarpağa olan yolun uzunluğu 3-dür və hündürlüyə bərabərdir. Hündürlük arasında bir əlaqə qurmaq faydalıdır. h. və ağac uclarının sayı s..

Məşq. Demək olar ki, tam bir ikili hündürlük ağacı ola bilər h.? Demək olar ki, tam ikili ağacın hündürlüyünü ucların sayına görə ifadə edin.

Bu ağacda maksimum tez baxmaq üçün, hər hansı bir element dəyəri bütün nəsillərinin dəyərlərindən (əgər varsa) dəyərindən az olmaması üçün serialın elementləri var. Bunun üçün hər kəs üçün kifayətdir i. İki bərabərsizliklər edildi: A [i] ≥ a (əgər varsa 2i + 1 ≤ s), Mən. A [i] ≥ a (əgər varsa 2i + 2 ≤ s). Ümumiyyətlə, tez-tez serialın bütün elementləri bu qaydaə tabe olmayacaq, ancaq bəzi giriş süjetinin elementləri olmayacaqdır. Bu sayt bir dəstə adlandırılacaq. Bütün serialın ölçüsünü təyin edəcəyik n.və yığın ölçüsü - s.. Yığın ölçüsü dəyişə bilər 0 əvvəlki n. İnklüziv.

Belə ki, İkili maksimum dəstə Bir başlanğıc a ... A serialı bir ... A, ( 0 ≤ s ≤ n) Hər bir element maksimum yığın əsas əmlakı varsa: onun dəyəri bütün nəsillərinin dəyərlərindən az deyil.

Belə bir yığındakı maksimum elementin maksimum elementinin serialda 0 indeksinə malik olduğunu sübut etmək asandır (ağacın kökündə yerləşir). Bir nəsilinizdən artıq olmamaq üçün elementə ehtiyacınız varsa, alırıq minimal yığma. (Əsasən maksimum yığınları nəzərdən keçirəcəyik). Unutmayın ki, "fiziki cəhətdən" bir dəstə serialın süjetidir. Və "məntiqi", bunu ikili bir ağac kimi hesab etmək rahatdır.

Bir dəstə ilə əməliyyatlar

Bir dəstə ilə, iki əsas əməliyyat etməliyik: maksimum elementi çıxarın, habelə yeni bir element əlavə edin. Maksimum elementi (sıfır bir indeksdə yerləşən) çıxarmaq üçün son elementi öz yerinə qoyacağıq. Və əlavə etmək - yalnız sonuna təklif edirik. Ancaq bundan sonra bir dəstə bir az "korlanmış" olacaq. Hər iki halda birdən çox "səhv" element yoxdur. Birinci halda bu bir və ikinci yerdədir. Birinci halda, onun mənası onun işğal etdiyi yer üçün çox kiçikdir və ikincisi çox böyükdür. Birinci halda, "səhv" elementin aşağı enməsi lazımdır və ikincisində böyümək lazımdır. Bəzi digər elementlər eyni zamanda, təbii ki, onlar da köçürülməli olacaqlar, ancaq izləməyimiz rahat olacaq, ilk növbədə "səhv" elementin hərəkəti üçündür.

Müvafiq olaraq, Sift_down (süzmək) və sift_up (süzmək) adlandıran "təmir" yığınları üçün iki prosedura ehtiyac duyacağıq. Onların hər biri tələb olunduğu göründüyündən daha ümumi bir hal üçün həyata keçiriləcəkdir. Məhz, hər hansı bir yığınların hər hansı bir elementinin "səhv" ola biləcəyini və yalnız birinci və ya sonuncu olmadığını, daha da zəruridir, daha da aydın olur). Ancaq yenə də belə bir elementin yalnız birinin olmasını tələb edəcəyik.

04: Etmək

Daha çox çəkilən yığın elementini süzmək, süzmək, sift_up funksiyasını həyata keçirin.

Birinci meydançada n yığın ölçüsü (1-dən 10-a qədər 5-dən 10-a qədər) qurulur. İkinci sətirdə bir dəstə özü təqdim olunur - n fərqli tam ədədlər. Bu nömrələrin düzgün maksimum xovlu olmasına zəmanət verilir).
Üçüncü sətir m nömrəsini - sorğuların sayı.
Aşağıdakı m xətlərdə, sorğuların özləri təqdim olunur - bir-bir simdə. Sorğu I və X iki tam ədəd təyin edir. X-də i-t th th th th th th th th th th th typ elementinin dəyərini artırmaq və yığını bərpa etmək üçün Sift_UP-ı yerinə yetirmək lazımdır.
Sorğunun cavabı olaraq bir nömrəni geri götürməlisiniz: Sift_UP-ı icra etdikdən sonra serialın dəyişdirilmiş bir element olduğu yerdəki yerlərdə məlumat vermək üçün. (Ayrı bir xəttdə qutu - müvafiq indeks). Bundan əlavə, bütün istəkləri icra etdikdən sonra son vəziyyətinə bir dəstə gətirmək lazımdır.


Daha yaxşıdır :)

Bu dəqiq çətinliklərdir?

Alqoritmi təsvir etməyin ən asan yolu. Bir [i] ağacın köküdürsə və ya valideynini aşmırsa, heç bir şey etməlidir. Əks təqdirdə, onu valideynlə dəyişdirmək lazımdır, bundan sonra yenidən "bir az korlanmış dəstə" alırıq, amma indi öz yerində tələb olunandan daha çox dəyər verə biləcək bir element indeksində (i - i - i - 1) // 2. Müvafiq olaraq, bu maddə üçün Sift_UP-ı icra etməlisiniz.

Ancaq həyata keçirərkən iki inkişaf etmək faydalıdır. Birincisi, rekursiyadan qurtulmaq çətin deyil. İkincisi, Siea elementini valideyninin yerinə həqiqətən kopyalaması üçün, yalnız Siea elementini kopyalamaq üçün hər bir addımına ehtiyac yoxdur - yalnız son yerdə Sieve-in sonunda qeyd edilə bilər.

Bu alqoritmin növbəti elementin növbəti elementin daxil edilməsi, əlavələrin sadə olduqda meydana gələn serialın müvafiq yerindəki növbəti elementin daxil edilməsi ilə fərqi görmək faydalıdır.

İş vaxtını qiymətləndirmək üçün qeyd edirik ki, süzən addımların sayı yığın hündürlüyündən çox deyil və hər addımın icrası müddəti sabitdir.

Kuçiin nəticəsi.

Bir ağac şəklində bir yığın göstərmək üçün aşağıdakı funksiyanı istifadə etmək üçün aşağıdakı funksiyanı istifadə edə bilərsiniz: def print_heap (AR): m-də X üçün ml \u003d max (str (str)) ARS \u003d [("(: 0" (: 0 "+ Str (ml) + ")"). \u003c). Format (x) (X) x-in ar] dp \u003d len (len (len (len (len ("*" * 2 ** (dp-2) * (ml +) (ml +) 1)) mənzilli mənada (1, dp + 1): str_space \u003d "" * max (0, 2 ** (dp-i-2) * (ml + 1) - 1 - ml // 2) sep_space \u003d "" * Max (0, 2 ** (dp-i-1) * (ml + 1) (ml) çap (ml) çap (str_space + sep_space.join (ARS)) çap ("*" * 2 ** (DP-2) ) * (Ml + 1)) print_heap (siyahı ((8)))

05: YAXIN

Kiçik olduğu ortaya çıxan yığın elementini aşağı salan Sift_down funksiyasını həyata keçirin.

Giriş məlumatları əvvəlki vəzifədən formatda verilmişdir.
Sorğu I və X iki tam ədəd təyin edir. I -Ho yığın elementinin dəyərini x-ə endirmək və yığınvanı bərpa etmək üçün Sift_down-ı həyata keçirmək tələb olunur.
Bir sorğuya cavab olaraq, bir nömrəni geri götürməlisiniz: sxe_down edamdan sonra serialın dəyişdirilmiş element olduğu yerdəki yerlərdə məlumat vermək üçün. (Ayrı bir xəttdə qutu - müvafiq indeks). Bundan əlavə, bütün istəkləri icra etdikdən sonra son vəziyyətinə bir dəstə gətirmək lazımdır.


Daha yaxşıdır :)

Bu dəqiq çətinliklərdir?

Alqoritmi təsvir etməyin ən asan yolu. Bir [i] bir ağacda oğulları yoxdursa və ya onu böyüklüyündə aşmasa, bir şey etmək lazım deyilsə. Əks təqdirdə, onu maksimum övladlarla dəyişdirmək lazımdır. (Bu oğullar bərabərdirsə, ümumiyyətlə danışırsa, onlardan hər hansı biri ilə dəyişə bilərsiniz. Ancaq sonrakı bütün vəzifələri sınaq sistemi tərəfindən qəbul edilməsi, solu dəyişdirmək lazımdır). Bundan sonra yenidən "lal korlanmış bir dəstə" alırıq, amma indi tələb olunandan daha az dəyər verə biləcək bir element yeni bir yerdədir. Müvafiq olaraq, bu maddə üçün sift_down edam etməlisiniz. Tətbiq edərkən rekursiya qurtarmaq olar. İş vaxtının qiymətləndirilməsi SIFT_UP üçün eynidir. Tipik bir səhv yalnız sol oğlu olduqda vəziyyətin səhv işlənməsidir.

06: maksimumu silmək

Maksimum elementi bir yığından çıxarmaq və quruluşunu bərpa etmək üçün çıxarış_max funksiyasını həyata keçirin. (Yuxarıdakı "tam əməliyyatlar" bölməsinə baxın)

Giriş əvvəlki vəzifədən bir dəstə format verilir.
N -1 simini, hər biri - iki ədəd çəkmək tələb olunur. Birincisi, sıfır yerə və sıfıra qədər yenidən qurulduqdan sonra yığın son elementinin son elementinin son mövqeyinin indeksidir; İkincisi, çıxarılmış elementin dəyəri (əvvəllər sıfırda idi).

Giriş Çıxış
6 12 6 8 3 4 7 2 12 2 8 1 7 0 6 0 4 12 8 7 6 4 3 / \ / \ / \ / \ / 6 8 6 7 6 4 3 4 3 / \ / / \ / 3 4 7 3 4 3

Elementlərin süzülməsi və bərabərliyi

Aşağıdakı vəzifələrdə bir yığında bərabər elementlər baş verə bilər. Bu, Sift_UP və Sift_down prosedurlarını icra edərkən bəzi özbaşınalılıq yaradır. Birmənalı cavab üçün onu məhdudlaşdırmalı olacaq. Buna görə iki qaydanı təqdim edirik:
1) Səsləmə prosedurları, maddəni həqiqətən lazım olduğundan daha çox hərəkət etməməlidir. Məsələn, əgər bir [i] \u003d A, Sift_Up zəngi (2 * i + 1) bu iki elementi dəyişdirməməlidir (mübadiləsi və bir dəstə korlamazsa da, yararsızdır).
2) Əgər süzdükdə, elementi hər ikisinə sola və sağa aşağıya doğru köçürə bilərsiniz (bu iki bərabər törəmə müəssisədən az olduqda olur), sonra istiqamət seçilməlidir.
İkinci qayda olduqca özbaşına və yalnız cavabın təmənnisini təmin etmək üçün tətbiq olunur. Birinci qayda, əksinə, yığın hər hansı bir məqsədəuyğun icrasını təmin etməlidir.

07: Prioritet

İki əməliyyatı dəstəkləyən bir yığınla prioritet növbəni həyata keçirmək tələb olunur: teeppush elementini əlavə edin və maksimum heappop elementini çıxarın.

Birinci sətirdə iki ədəd - prioritet növbənin maksimum ölçüsü və sorğuların sayı m. (1 ≤ m, n ≤ 10 5).
Növbəti bir xəttdə, hər sətirdə, bir istək. Sorgundakı ilk nömrə onun tipini, qalan nömrələri (əgər varsa) sorğu parametrləridir.
Tip 1 - maksimum (parametr olmadan) çıxarın,
Tip 2 - Bu elementi növbəyə əlavə edin.

Bir tip 1 tələbə cavab olaraq geri çəkilməlisiniz:
Silmək üçün bir şey yox idi (növbə boşdur), sonra -1.
Əks təqdirdə, əvvəlki tapşırıq içində olduğu kimi - birincisi: birincisi - bu elementin son mövqeyinin son mövqeyinin indeksi (son element çıxarıldığı və ölmək üçün heç bir şey yoxdu, onu çıxarın - 1); İkincisi - çıxarılmış elementin dəyəri.
Bir tip 2 sorğusuna cavab olaraq geri çəkilməlisiniz:
Əlavə edə bilmirsinizsə (yer yoxdur, çünki növbədə on artıq n elementlər var), sonra çıxın -1. (Eyni zamanda bir dəstə dəyişməməlidir).
Əks təqdirdə, əlavə elementin indeksi.
Bundan əlavə, bütün istəkləri icra etdikdən sonra son vəziyyətinə bir dəstə gətirmək lazımdır.

Giriş Çıxış Prosesdə bir ağac şəklində bir dəstə
4 7 1 2 9 2 4 2 9 2 9 2 7 1 -1 0 1 2 1 -1 1 9 9 4 9 9 9 9 9 9 9 / / \ / \ / \ / \ 4 4 9 9 9 9 9 4 9 / / 4 4

08: Çıxarma prioriteti

Bu vəzifənin vəziyyəti əvvəlki birinin vəziyyətindən yalnız başqa bir sorğu növünün olması ilə fərqlənir - göstərilən (mütləq maksimum deyil) elementi silmək istəyi ilə. Bu, bir yığından çıxarmaq istədiyiniz bir element indeksini göstərən bir parametr olan bir tipli bir tələb olacaq.

Bir tip 3 tələbə cavab olaraq geri çəkilməlisiniz:
-1, belə bir indeks və çıxarılması olan bir element yoxdursa, mümkün deyil. (Eyni zamanda bir dəstə dəyişməməlidir).
Əks təqdirdə, uzaq elementin dəyəri.

Giriş Çıxış Prosesdə bir ağac şəklində bir dəstə
4 10 1 2 9 2 4 2 9 2 9 2 7 1 3 3 2 1 3 2 -1 0 1 2 1 -1 1 9 -1 3 9 9 4 1 9 9 9 9 9 9 9 9 / / \ / \ / \ / \ / \ / \ 4 4 9 9 9 9 9 4 9 4 9 4 1 / / / 4 4 1

Bir sıra yığın

Xatırladaq ki, bir yığınla çeşidləmə ilk mərhələsi bir dəstə bütün serialı çevirməkdən ibarətdir. Eyni əməliyyatın faydalı və prioritet növbəsinin ilkin qurulması mümkündür, növbədə çox sayda əşyanı yerləşdirməyiniz lazımdırsa, yığıncaq əməliyyatının təkrar təkrarlanması əvəzinə bütün bu elementləri yaza bilərsiniz serialın ilkin sahəsi və bir dəstəyə çevirin. Sual, bu dönüşümün sadə birdən çox təkrarlanmasından daha sürətli olub-olmamasıdır?

İndiyə qədər bir dəstə olan bütün əməliyyatlar iki əsas - süzən (sift_up) və süzmək (sift_down) əsaslanır. Hər birini yazmaq və yığma proseduru istifadə etmək üçün istifadə etməyə çalışaq. Sifting (Build_Heap1) bir yığın qurmaq bir sıra verilir. Sifting prosedurundan istifadə edərək onu bir dəstəyə çevirmək tələb olunur. Giriş formatı. Birinci sətir, növbəti sətirdə serialın uzunluğunu təqdim edir, massivin elementləri - n tam ədədlər daxildir. Çıxış formatı. N tam ədədlər - qaydada yığın elementləri.

09: Ey ilə bir yığın qurmaq

Sifting proseduru yuxarıya doğru istifadə edərək bir dəstə yaradan Heapify1 funksiyasını həyata keçirin.


Bir dəstəni bir dəstə çevirin və elementlərini qaydasına çıxarın.


Daha yaxşıdır :)

Bu dəqiq çətinliklərdir?

Güman edilə bilər ki, əvvəldən son elementin işğal olunmuş yer üçün tələb olunduğundan daha çox əhəmiyyət verə biləcəyi bir "bir az korlanmış xovlu" ölçülü S \u003d 2 var. Sift_UP (1) adlandırmaqla onu quraraq "bir az korlanmış xovlu" ölçülü S \u003d 3 əldə edirik, bu da öz növbəsində Sift_UP (2) adlandırmaqla düzəldilə bilər. Və s. Qeyd edək ki, bu, elementlərin ardıcıllıqla əlavə edilməməsi, A, A, ... prioritet növbədə olan bir şeydir.

10: Sifting bir yığın qurmaq

Sifting prosedurundan istifadə edərək bir dəstə meydana gətirən teapify2 funksiyasını həyata keçirin.

Birinci sətir, mstray N-nin uzunluğunu təqdim edir. Növbəti sətirdə bir massivin elementləri - n tam ədədlər təqib olunur.
Bir sıra bir dəstəyə çevirin və qaydada çıxın.

Giriş Çıxış
6 1 2 3 4 5 6 6 5 3 4 2 1

Daha yaxşıdır :)

Bu dəqiq çətinliklərdir?

Əsas fikir aşağıdakı kimidir. Son oğulları yarpaqları olan hər hansı bir vertex üçün Sift_down-a zəng edə bilərik. Bütün bu qədər ucları üçün zəng edərək, hər biri yığın əsas xüsusiyyəti olan Hündürlüyü 2-nin dəstəyini alırıq. Beləliklə, yeni Sift_down zəngləri yığınların əsas əmlakının alt mülkiyyətinin daha çox və daha çoxunu həyata keçirməsini təmin edəcəkdir. Bu dövr üçün istifadə edərək bu, serialın bütün elementləri üçün, sağa sola, sağa soldan istifadə edərək bunu həyata keçirmək asandır.

Nə qədər sürətli?

Bu tətbiqlərdən hansı daha sürətli işləyir? Niyə? (Riyaziyyat haqqında biliklərinizin iş vaxtındakı fərqi ölçməyə imkan vermədiyi təqdirdə keyfiyyətcə başa düşülə bilər).

(Yaxşı bilikli riyaziyyat üçün), işlərin hər birinin işləməsinin hər birinin artıq olduğuna dair olduqca aydındır O (N.) Giriş. n)Çünki həyata keçirilir O (n) hər biri işləyən zənglər O (h). Bununla birlikdə, mümkündür ki, daha dəqiqdirsə, daha yaxşı bir qiymətləndirmə tapa bilərsiniz, çünki yalnız son problemlər yaxın bir yığın bir yığın üzərində baş verir n., və birincisi daha kiçik bir dəstə və buna görə daha az vaxt işğal edir.
Tapmaq üçün hər bir tətbiq üçün ikisindən birini etmək lazımdır:
Ən azı bəzi hallarda iş vaxtı həqiqətən sifariş etdiyini sübut edin n. Giriş. n. (Qeyd etmək adətdir O (N.) Giriş. n)).
Az olan vaxtın daha dəqiq bir qiymətləndirməsini tapın və sübut edin O (N.) Giriş. n).

Daha yaxşıdır :)

Bu dəqiq çətinliklərdir?

İlk icrada (Sift_UP əsasında), çox sayda sights böyük bir dərinlikdə, kiçik bir dərinliyə qədər çox süzülür. İkinci həyata keçirildikdə, əksinə, böyük bir dərinliyə və çox şeyə çox şey var. Buna görə, ikinci tətbiqin daha sürətli işlədiyini güman etmək (və sübut edə bilərsiniz).

İkinci icranın (Sift_down əsasında) ikinci tətbiqə (məsələn, kurmenlər kitabı və s.) Sübut edə bilərsiniz O (n)və ən pis vəziyyətdə birincisi - üçün O (N.) Giriş. n).

11: Bir dəstə çeşidləmək - Ətraflı

Tədqiq olunan alqoritmdən istifadə edərək, işin bəzi ara nəticələrini geri götürərək, öyrənilmiş alqoritmdən istifadə edərək bir tam ədəddən istifadə edərək sıralamaq lazımdır. Məhz, əldə edilməlidir:
Teepify2 çağırışı ilə tikilmiş ilkin yığın;
Hər bir elementi çıxarıldıqdan sonra yığın (yəni xarici dövrün hər iterasiyasından sonra);
Sıralanmış massiv.

Heapq paketi

Əlbəttə ki, bir dəstə ilə işləmək kimi vacib bir şey Standard Python Kitabxanasında həyata keçirilir. Bütün vəzifələrdə bu kitabxanadan istifadə edə bilərsiniz (və hətta tercihen) istifadə edə bilərsiniz. Sənədlərlə səhifədə özünüzü tanış edə bilərsiniz. Yaxşı rusdilli bir mətn tapmadım, birdən taparsan, linki paylaşdım :)

Qabarcıqla çeşidləməkdən hoara tez çeşidlənməsi və median axtarmaq

Beləliklə, indi çeşidlənməyi bir qabarcıqla optimallaşdıracağıq. Nəticədə baş verənlər deyilir sürətli çeşidləmə və ya hoara çeşidlənməsi (quickSort.). Bu alqoritmin yalnız ən "sadəlövhlük" versiyasını həyata keçiririk.

Bubble tərəfindən çeşidlənərkən elementi yalnız növbəti yerə dəyişdiririk, mümkün qədər "paçın". Eyni zamanda, "üzən "dən sonra hələ də bu elementlə müqayisə etdik. Tez çeşidləmə zamanı elementi mümkün qədər tez "doldurma" elementləri daha kiçik və "açılmış" elementləri böyük götürürük. Beləliklə, element çeşidlənmiş serialda bunun üçün tələb olunan vəziyyətdədir. Bundan sonra, daha kiçik və ayrı-ayrılıqda rəvayət edirik, bu elementlə müqayisə etmək ehtiyacı heç vaxt olmayacaq.

Daha doğrusu, alqoritmin bazası siyahı siyahısını, habelə siyahıları və siyahını sıralamaq üçün lazım olan vəzifələri qəbul edən bir rekursiv funksiyadır. Bütün siyahını çeşidləyərkən standart dəyərlər istifadə olunur - başdan sona qədər sırala.

DEF QuickSort (a, başlayın \u003d 0, son \u003d1): Məzmunu keçmək kifayət qədər sadədir: əvvəlcə seçin dəstək elementi - Siyahıdakı ilk element ya da (daha yaxşı) təsadüfi. Sonrakı, siyahıdan bir keçiddə, elementlərin birinci, sərt, daha böyük, daha böyük və ya arayışa bərabər olması üçün serialın bir hissəsini yenidən sıralayırıq. Bu vəziyyətdə, bəzi istinad elementinin indeksini qeyd edin. Ayrılıqdan sonra bu dəstək elementini yalnız ona ciddi şəkildə daha kiçik və ya daha sonra isə daha çox olduğu üçün yenidən təşkil etmək olar. Sonra, ondan qalan şeyləri və nə sağda olanları recursively sıralayırıq.

Bu alqoritm kifayət qədər gülməli bir əmlakı var: hər dəfə bir dəstək elementi yazırıq (məsələn, ciddi və ya maksimum), sonra onun vaxtı sifariş veriləcək n + (n-1) + ... + 1, i.e O (n 2). Ancaq bu həqiqət deyil və bu alqoritm tez-tez bəzi digərlərindən daha sürətli olur, bunun üçün zəmanət verir n. Giriş. n..

Serialın ayrılması qaydası, bir medianı tapmaq üçün də faydalıdır (sıralanan serialda ortada olan bir element) və daha ümumi olan bir şeydir: k.sifariş statistikası (sıralanan serialda olan element gedir k.-Biz). Aralımızın uzunluğu varsa n., sonra nömrələri olan statistika 0.05n., 0.25n., 0.5n., 0.75n.0.95n. Serialdakı nömrələrin paylanması haqqında çox şey deyə bilərsiniz. Məsələn, 2007-ci ildə bu statistikalar da aşağıdakılardır: 2000, 5000, 9000, 9000, 15000, 15000, 35000, 35000, 35000, bu paylama ilə orta əmək haqqı yüksək ola bilər (2007-ci ildə təxminən 15.000 idi) ). Əhalinin 75% -i 15000rdan çox deyil və əhalinin yarısından çoxu - ümumiyyətlə 10000 rubldan az olan bir maaş aldı.

Axtarış fikri k.Sorinal statistika növbəti. Təsadüfi bir istinad elementi seçin və elementlərin ilk növbədə getməsi, daha kiçik, sonra arayışa bərabər və nəhayət böyük istinad etməsi üçün serialı seçin. Qeyd edək ki, bu böhran Hoara çeşidləmək üçün lazım olan daha sadə olduğundan biraz daha mürəkkəbdir. Qoy, ciddi bir istinad S.< İstinada bərabərdir - S \u003d.. Sonra nömrəni müqayisə edin k. dən S.< S.< +S = Cavab axtarmalı olduğunuz serialın hansı hissəsini başa düşmək asandır.

Bu alqoritm bir daha ehtimal edir və çox şanslı deyilsə, işləyəcək O (n 2)serialın çeşidlənməsi və götürməsindən daha pis nə var k.- element. Ancaq ümumiyyətlə sifariş qaydasında işləyir O (n)Buna görə də çox faydalı olur.

13: serialın ayrılması

Serialın ayrılması prosedurunu həyata keçirin.

Birinci sətirdə n ədədləri serialın uzunluğu var və x dəstək elementidir. İkinci sətirdə, n tam ədədlərin ardıcıllığı X-də olan X.

Elementlərin ilk növbədə getdiyini, daha kiçik istinad X, sonra X elementi və bundan sonra elementlərdən daha çox və ya daha sonra elementlərin ardından yenidən sıralandı.

Giriş Çıxış
7 3
1 7 2 4 3 2 3
1 2 2 3 4 7 3

tövsiyə etmək

Mən bir tərəvəzəm və düşünmək istəmirəm

Serialın yenidən sifariş edilməsi əməliyyatı:
İki indeks - l.r., müvafiq olaraq ortaq bir sıra minimum və maksimum indeksinə bərabərdir.
İndeks hesablanır m. İstinad elementi;
İndeks l. ardıcıl olaraq qədər artır l.Element istinaddan böyük və ya bərabər olmayacaqdır.
İndeks r. ardıcıl olaraq azalır r.- Element daha az istinad olmayacaq. İstinaddan bərabər bir element meydana gəlirsə, indeksi dəyişənə daxil edilir m.;
Əgər a l. R - bir neçə maddə yerləri mübadilə və bu dəyərlərdən ayrılma əməliyyatını davam etdirdi l.r.nail olanlar (əgər varsa) l.Element, arayışa bərabər idi, sonra birjadan sonra r.- Element istinad kimi çıxsa, indeks yenilənəcək m.)
Əgər a r. = l. - Serialın ortası tapıldı - ayrılma əməliyyatı demək olar ki, başa çatmışdır. İndi bu "ortada" dəstək elementini yerləşdirməlisiniz. Bunu etmək üçün istinad elementini indekslə dəyişdirməlisiniz m.həm də indeks olan bir element l. və ya l + 1. Asılılıqdan asılı olaraq l.İstinad elementi.

14: Sürətli çeşidləmə

Hoara'nın sürətli çeşidlənməsi tətbiq edin.

Birləşmədən əvvəl çeşidləmədən çeşidləmədən

Hər ixtiyari anda daxil etmə alqoritmində siyahının ilkin hissəsi artıq sıralanır. Sonrakı, siyahının sıralanmış hissəsinə uyğun olmayan hissədən ilk element əlavə olunur. Beləliklə, biz n. Bir dəfə bir dəfə istehsal edirik birləşmə İki sıralanan siyahı: bir uzunluq 1, 2 və s. n-1, və ikincisi - hər zaman uzunluğu 1.

Ancaq iki uzunluq siyahısının olduğunu bilirik n.m. Sifariş zamanı bir sıralanan bir siyahıya bir araya gətirə bilərsiniz n + m.. Əvvəlcə uzunluğu 2-də həll edən cütlərdəki elementləri bölüşsək, onda onda uzunluğu 4 və sair, sonra yalnız xərcləyin O (N.) Giriş. n) Əməliyyatlar.

Recursiya ilə təsvir etməyin ən asan yolu. Serialın uzunluğu 1-i keçməzsə, onda artıq sıralanır. Əks təqdirdə, massivin ilk yarısını sıralayın, ikinci yarısını sıralayın, bundan sonra hər şey birlikdə.

16: İki çeşidli massivin birləşməsi

İki çeşidli massivin birləşməsi üçün bir funksiyanı həyata keçirin.

Birinci sətir n və m - seriallara aiddir. İkinci sətirdə, n tam ədədlərin ardıcıllığı verilir və üçüncüsündə - m tam ədədlərindən. Bu vəziyyətdə hər bir ardıcıllıqlar uyğunsuzluğa görə sıralanır.

Bu ardıcıllığın birləşməsini düşünülmüşdür.

Məlumatlar RAM-a uyğun gəlmirsə nə etmək lazımdır

Bir çox məlumat varsa, RAM-a uyğunlaşmayacaqlar və standart çeşidləmə metodları mümkün olmayacaqdır. Xarici məlumat daşıyıcılarının fərqli bir xüsusiyyəti giriş sürətidir. Deyək, müasir bir kompüterdə RAM-dan məlumat əldə etməyin vaxtı təxminən 50 və sərt diskdən - təxminən 5 s. Yüz qat daha çoxdur. Sərt diskdən ardıcıl oxu sürəti təxminən 200MB / s, RAM-dan oxumaq sürəti 20GB / S-in sifarişinə 100 qat daha sürətli bir sifarişdir. Sabit diskə uyğunsuz giriş ilə, gecikmə artır, sürət çox aşağı düşür.

Periferik cihazlarda saxlanılan məlumatların çeşidlənməsi (məsələn, sabit disklər) və qoçda yerləşdirilmir xarici. Xarici çeşidlənmənin tez olması üçün periferik cihazlara giriş sayını minimuma endirmək və yalnız uzunmüddətli ardıcıl girişin maksimum istifadəsini minimuma endirmək lazımdır. Xarici çeşidləmə yollarının çoxu birtəhər birləşmənin çeşidlənməsi ilə əlaqəlidir.

Məsələn, orijinal ardıcıllığı götürə və RAM-da yerləşdirilən seriallara bölünə bilərsiniz. Standart yolu sıralamaq və sabit diskdə çeşidləmək üçün hər seriya. Bundan sonra, bütün serial sıralanana qədər birləşmə etmək lazım olacaq.

Tutaq ki, qoç yerləşdirir P. elementlər və biz sıralamaq lazımdır P × 2 k Elementlər. Sonra ilk dəfə oxuyuruq və seriyanı hazırlayarkən hər elementi yazdıq. Nəticə olaraq P × 2 k Qeydlər bir sıra uzunluğa çıxacaq P.. İlk birləşdikdən sonra bir sıra uzunluq alırıq P × 2 1, sonra P × 2 2 və s. Nəticədə lazım olacaq (K + 1) Diskə tam oxunuş və məlumat qeydləri.

Sürəti artırmaq üçün oxunan oxunuşların sayını azaltmaq lazımdır. Burada iki istiqamətdə hərəkət edə bilərsiniz: ilk keçiddə əldə edilən çeşidli seriyanın uzunluğunu artır və sonrakı birləşmə zamanı oxunan oxunuşların sayını azaltmaq.

İlk keçidin hələ də çeşidlənmiş seriyalar əldə etməsindən sonra imkan verən gözəl bir fikir var P., və orta hesabla 2p.. Məlumat qismən sıralanacaqsa, onda serialın uzunluğu daha da olacaqdır. Bu fikir haqqında bir vəzifə var.

İndi təsəvvür edin ki, 2 massivin effektiv birləşməsi, lakin bir anda 4-də. Sonra, ilk birləşmədən sonra dərhal bir sıra uzunluq alırıq P × 2 2və məlumat qeydlərinin son miqdarı demək olar ki, iki dəfə az olacaq!

4-cü massiv deyil, ancaq dərhal, deyirsən, 1024? Ya da 1048576 (əgər varsa) P.\u003e 1048576)? Sonra oxumaq yazma qeydləri demək olar ki, 10 dəfə az (və ya 20-də) olacaq! Bununla birlikdə, burada bir problem var: çox drenaj varsa və diskdə məlumat əldə etmək daha təsadüfi və ardıcıl olmayacaqdır. Və giriş vaxtı artacaq. Hər 10-100 dəfə. Və əldə etdikləri hər şeyi itirəcəyik. Ən yaxşısı, əgər bir neçə sabit diskimiz varsa, onda onlarla birlikdə onlarla əlaqə qura bilərik və eyni zamanda sürət itkisi olmadan serialları qurudulmuş sayını artıra bilərik.

18: Bir neçə sifarişli serialları birləşdirin

Çox çeşidlənmiş massivləri birləşdirmək üçün bir funksiyanı həyata keçirin.

Birinci sətir təbii bir nömrə ndir - serialların sayı. Aşağıdakı n xətlərdə serialların mümkünlüyü ilə sıralanır.

Bu ardıcıllığın birləşməsini düşünülmüşdür. Bu, massivlərin hər biri üçün yalnız bir ötürmə həll edir.

Giriş Çıxış
3
1 4 5
1 3 5
1 2 5
1 1 1 2 3 4 5 5 5

tövsiyə etmək

Mən bir tərəvəzəm və düşünmək istəmirəm

Heç kim necə casus olduğumu görmür ...

Bir dəst n üçlü (ilkin element toplamaq lazımdır i.- masaj, i.0). Bundan sonra, yığından minimum üçlü ardıcıllıqla ardıcıllıqla çıxartmalısınız. Troyanın ilk elementi minimum hələ də alınmayan elementdir, nəticəyə göndərilməlidir. Troyanın ikinci elementi, bir dəstə əlavə etmək üçün elementi və geri qayıtmaq üçün lazım olan serialın sayıdır və üçüncüsü bu serialın son elementinin indeksidir.

19: Xarici çeşidləmə üçün bir sıra meydana gətirmək

Bu vəzifədə, P nömrələrində qoçumuz və çeşidlənməli olan tam ədədlərin ardıcıllığımızın olduğunu təsəvvür edəcəyik. Uzunluğu daha çox p.

İlkin ardıcıllığın bir sıra əlçatmaz nömrələrə bölündüyü bir siyahı yaratmalısınız və hər seriyanın uzunluğu P-dən az deyil. Ən sadə halda, p nömrələri ilə oxuya, onları sıralaya və yenidən diskə yaza bilərdik (standart çıxışa yaz). Bununla birlikdə, dərhal 2p uzun seriyalı bir sıra yaratmağa imkan verən gözəl bir alqoritm var.

İlk P nömrələrini hesab edirik və onlardan minimal bir dəstə meydana gətiririk. Əlavə olaraq minimum elementi yığından çıxarın və dərhal cari seriyaya əlavə edin. Bundan sonra ardıcıllığın növbəti elementini oxuyun. Yalnız gətirdiyimiz elementə bərabərdirsə, onu seriala (çıxışa) əlavə edə və daha da davam edə bilərsiniz. Daha cari olsa, gələcəkdə bir sıra əlavə edilə bilər. Bunu etmək üçün bir dəstə daxil olmaq və işə davam etmək lazımdır. Ancaq yeni maddə caridən azdırsa, cari seriyaya əlavə edilə bilməz. Sonra ikinci dəstəyə əlavə edin. İlk yığın ölçüsü 1-i azalacaq və ikinci ölçüsü yenə də p elementləri saxladığımız miqdarda 1 artacaq. Bütün p elementləri cari seriyaya əlavə etmək üçün yararsız hala qədər davam edəcəkdir (və birincisi boş qalacaq). Bu o deməkdir ki, cari seriya bitməlidir, yerlərdə yığınları dəyişdirin və yeni bir seriyaya başlayın.

Bu yanaşma ilə nəticələnən seriyanın uzunluğu orta hesabla 2p, əlbəttə ki, ən azı p olacaq. Eyni zamanda, mənbə məlumatlarında çox sayda çeşidli parçalar varsa, onda seriyanın uzunluğu daha böyük, tamamilə sıralanmış məlumatlardakı bir sıra qədər daha böyük olacaqdır!

Birinci sırada iki ədəd p və n verilir - RAM-da yerləşdirilən elementlərin sayı və sıralanma üçün ardıcıllığın uzunluğu. İkinci sətirdə n uzunluğundakı tam ədədlər ardıcıllığı var.

Təsvir edilən alqoritmə görə serialda sifariş edilmiş bu ardıcıllığı çıxartdı. Siyahıya əlavə olaraq vəziyyətdən bir ardıcıllıqla əlavə olaraq, ümumi uzunluğunun siyahısından daha çox p.

Növbəti sətir, iki onluq yerinə yuvarlanan seriyanın orta uzunluğunu çıxartdı.

Giriş Çıxış
4 21 31 12 50 14 8 59 9 43 91 93 32 81 67 52 41 52 63 67 77 74 65 12 14 31 50 59 91 93 8 9 32 43 52 52 63 67 67 74 77 81 41 65 7.0

20: Xarici çeşidləmə

Kifayət qədər təsirli bir xarici çeşidləmə aşağıdakı kimi həyata keçirilə bilər: əvvəlcə ilkin seriyanı (əvvəlki tapşırığda etdikləri kimi) formalaşdırırıq və N Fərqli "Fayllar" da seriyasında yazırıq (ilk sənəddə, ikincisi ikinci və s.). Bundan sonra, çeşidlənmiş seriyaların n-parçaları, digər n müxtəlif "fayllara" qeyd etmək üçün yaranan seriyaların birləşməsinə başlayırıq. Serialın bütün NS birləşdirildikdən sonra birləşdirildikdən sonra ikinci sifariş ns birləşməyə və ilk N sənədlərinə yazmağa başlayırıq. Bütün serial sıralanana qədər əməliyyatı davam etdirəcəyik.

Birinci sətirdə üç nömrə P, N və L - RAM-da yerləşdirilən elementlərin sayı, çeşidləmə zamanı istifadə edilməli olan faylların sayı və sıralanma üçün ardıcıllığın uzunluğu verilir. Daimi siyahıları fayl kimi istifadə edə bilərsiniz.

Təsvir edilən alqoritmə görə xarici məlumatların çeşidlənməsi ilə həyata keçirin.

Həqiqi faylların istifadə olunduğu üçün proqramınızı yenidən yazın. Kompüterinizdə maksimum çeşidləmə performansı nədir?

Giriş Çıxış
4 2 21 31 12 50 14 8 59 9 43 91 93 32 81 67 52 41 52 63 67 77 74 65 8 9 12 14 31 32 41 43 50 52 52 59 63 65 67 67 74 77 81 91 93

Bir dəstə ilə alqoritm Daekstra

Bütün kənarların uzunluğu - təbii nömrələr olsun. Sonra ən qısa yolu axtarmaq vəzifəsi uzunluğu 1 uzunluğu 1-i "vetal dirəkləri" qoyaraq, yeni ucları (qabırğalı soyğunçuluq) bəyan etmək və onları bəyan etmək üçün uzunluğu 1 uzunluğu vəziyyətinə endirilə bilər. Köhnə ucları və beynəlxalq məsafələr dəyişməz qalacaq, buna görə də yeni bir sütunda eni axtarmaqla bu məsafələri tapa bilərsiniz. Belə bir qərarın açıq-aşkar dezavantajı budur ki, uzun loobers ilə bir çox köməkçi uclara ehtiyacınız var və alqoritm bir postdan digərinə keçir, alqoritm çox vaxt sərf edəcəkdir.

Məsələn, qrafiki nəzərdən keçirin G. və qrafik G " Yuxarıdakı rəqəmdə göstərilən əlavə ucları ilə. Başlamaq S. Axtarış genişliyi (dəqiqədə bir qabırğa sürəti ilə). Sonra əvvəlcə 99 dəqiqə birlikdə hərəkət edəcək S.A.S.B. Sütundan vəzifəyə qədər. Bu barədə və cansıxıcı görünür, buna görə baş verən ana qədər daha yaxşı yatacağıq - bu maraqlıdır (əsl ucuna gəlirik). İki zəngli saat qoyun: bir müddət 100 Ucları üçün A., ikinci - üzərində 200 üçün B. Birincisi əvvəl işləyəcək: Axtarış əvvəlcə başına gələcək A. Biri A. Yeni bir hərəkət başlayacaq, bu da gələcək B. anda 150 (hərəkətdən daha erkən S.).

Vəziyyəti ümumi formada təsvir edirik: genişlikdə axtarış qrafikin kənarı boyunca hərəkət edir G.Və hər bir vertex üçün zəngli saat üçün artıq işləyən hərəkətin gözlənilən vaxtında quraşdırılmışdır. (Həqiqətən, axtarış, bu, başqa bir vertexdən keçərək, başqa bir vertexdən keçə bilər. . Siqnal zəngi, eni axtarışın orijinal qrafikin bir qədər ucuna çatması deməkdir u.V. Bu nöqtədə, dağıntılardakı hərəkətlər gəlir u.Sonuncu uclarında nəzərə almaq və bu ryubersin ucundakı həyəcan siqnallarını yenidən başlatmaq lazımdır (əgər yeni gəliş vaxtı əvvəlki əvvəl). Budur alqoritm sxemi:
- Üçün zəngli saat sınayın s. bir anlıq 0.
- Təşkilatlar var, lakin zəngli saatlar işlənməmişdir:
- - Onların ən erkənini götürün (başında qoyun) u. anda T.).
--- məsafəni bildirin s. əvvəlki u. bərabərcə T.
--- Hər bir vertex üçün v.bitişik s u. içində G.: Yuxarı üçün v. Zəngli saat hələ başlamayacaq, bir müddət başlamaq üçün T + L.(u., v.);; Zəngli saat bir müddətə daha çox başlasa T + L.(u., v.), sonra bu daha qısa müddətə yenidən düzəldin (və əks halda olduğu kimi idi).

Zəngli saatlarla alqoritm, müsbət çəkilərlə qrafiklərdə ən qısa yolları tapır. Demək olar ki, istifadəyə hazırdır, yalnız birtəhər həyəcan siqnalları mexanizmini həyata keçirmək qalır. Bu məqsədlər üçün uyğun olan məlumatların quruluşu prioritetlər ilə növbə adlanır; Adətən bir yığınla həyata keçirilir.

21: Ən qısa yolun uzunluğu (Dikstra alqoritmi)

Sizə ölkənin yol şəbəkəsinin təsviri verilir. Taskınız şəhərlər arasında ən qısa yolu tapmaqdır. AMMAB.

Giriş məlumatları. Yol şəbəkəsi giriş sənədində aşağıdakı kimi qurulur: Birinci sətirdə nömrələr var N.K. (1≤n≤100000., 0≤k≤300000.), harada K. - Yolların sayı. Aşağıdakıların hər biri K. Xətlər iki tərəfli hərəkətlə yolun təsviri var - üç tam ədəd a I., b I.l I. (1≤A i, b i ≤n, 1≤l i ≤10 6). Bu o deməkdir ki, uzunluq uzunluğu var l I.şəhərdən aparan a I. şəhərdə b. Son sətirdə iki ədəd var AMMAİçində - ən qısa məsafəni hesablamaq üçün lazım olan şəhərlərin otaqları ( 1≤A, b≤n.).

Çıxış. Yalnız nömrəni çıxış faylına - tələb olunan şəhərlər arasındakı məsafə göstərməlisiniz. Şəhərdən yollarda olarsa A 1. əvvəlki N.. Menecerin vəzifəsi yaddaşın seçilməsi və sərbəst buraxılması üçün tətbiqləri idarə etməkdir.

Yaddaş ayırması üçün tələb bir parametr var K.. Belə bir tələb, tətbiqin onu ayırmağı xahiş etdiyini bildirir K. Seriyalı yaddaş hüceyrələri. Menecerin ən azı bir pulsuz bloku varsa K. Serial hüceyrələr, sonra belə bir blok ayırmaq istəyinə cavab olaraq borcludur. Eyni zamanda, yaddaşın pulsuz bir yaddaş hüceyrəsi ilk hüceyrə yaddaş hüceyrəsindən dərhal əvvəl yerləşdirilməməlidir. Bundan sonra, seçilmiş hüceyrələr məşğul olur və yaddaşı sərbəst buraxılana qədər vurğulamaq üçün istifadə edilə bilməz. Blok varsa K. Ardıcıl pulsuz hüceyrələr yoxdur, sorğu sapır.

Yaddaşın sərbəst buraxılması üçün bir parametr var T.. Belə bir tələb, menecerin ardıcıllıq nömrəsi ilə bir sorğu işləyərkən daha əvvəl ayrılan yaddaşı azad etməsi deməkdir. T.. Vahiddən başlayaraq sorğular nömrələnir. Nömrənin tələbinə zəmanət verilir T. - Seçim üçün tələb və yaddaşın sərbəst buraxılması hələ ona tətbiq olunmayıb. Yaddaşı vurğulamaq üçün sərbəst hüceyrələr yenidən istifadə edilə bilər. Nömrəsi olan sorğu varsa T. Rədd edildi, sonra yaddaşın sərbəst buraxılması üçün hazırkı tələbi nəzərə alınmır.

Meyarları qane edən bir yaddaş meneceri yazmalısınız. Giriş məlumatları

Giriş məlumatlarının birinci sətri nömrələr verilir N.M. 1 ≤ n ≤ 2 311 ; 1 ≤ m ≤ 10 5). Aşağıdakıların hər biri M. İ + 1.)- mən giriş məlumatlarının bir xəttiyəm ( 1 ≤ i ≤ m K., əgər a mən K. (1 ≤ K ≤ n) və ya mənfi bir nömrə - T., əgər a mən T. (1 ≤ t). Çıxış

Hər bir yaddaş ayırması tələbi üçün bu sorğu emalının nəticəsini çıxarın: Müvəffəqiyyətli sorğular üçün, xüsusi blokdakı ilk yaddaş hüceyrəsinin sayını, rədd edilmiş sorğular üçün çıxışı çap edin. 1 . Giriş məlumatlarında sorğular üçün nəticələr göstərmək lazımdır

Giriş məlumatları Giriş məlumatlarının birinci sətri nömrələr verilir N.M. - yaddaş hüceyrələrinin sayı və müvafiq olaraq sorğuların sayı ( 1 ≤ n ≤ 2 311 ; 1 ≤ m ≤ 10 5). Aşağıdakıların hər biri M. Lines bir nömrə ehtiva edir: ( İ + 1.)- mən giriş məlumatlarının bir xəttiyəm ( 1 ≤ i ≤ m) Ya müsbət bir nömrəni ehtiva edir K., əgər a mənİstəyirəm - parametrlə seçim üçün bir sorğu K. (1 ≤ K ≤ n) və ya mənfi bir nömrə - T., əgər a mənİstəyirəm - parametrlə sərbəst buraxın T. (1 ≤ t).

Çıxış Hər bir yaddaş seçimi tələbi üçün bu sorğu ilə işləmə nəticəsində, uğurlu sorğular üçün, rədd edilmiş sorğular üçün ilk yaddaş hüceyrəsinin sayını çap edin, -1 nömrəsini çap edin. Giriş məlumatlarında sorğular üçün nəticələr göstərmək lazımdır

Giriş Çıxış
42 9 7 3 8 -2 6 5 -5 9 4 1 8 11 19 25 30 19

24: Tupika

Oradakı qatar stansiyasında K. qatarın gəldiyi ölü sonu. Bu stansiya onların son stansiyasıdır, buna görə elektrik qatarları, gəlişlər, gəlişlər, stansiyada bir müddət dayan və sonra yeni bir uçuşa (digər şəkildə mənfəətdən) keçirin.

Bu, hər bir qatar üçün gəlişinin vaxtı, habelə növbəti uçuşda gediş vaxtının olduğu cədvəl cədvəli verilir. Cədvəldəki elektriklər gəliş vaxtı ilə sifariş olunur. Stansiya son stansiya olduğundan, qatarın üstündə uzun müddət dayana bilər, xüsusən də digərindən əvvəl gələn elektrik qatarı, daha sonra geri göndərilə bilər.

UPCOM nömrələri nömrələnir 1 əvvəlki K.. Qatar gələndə minimum sayı olan pulsuz bir çətinliklə qoyulur. Ancaq qatar varsa - sonra Deadlock vaxt vaxtında getdi X.Sonra zamana çatan qatar X.Bu çətinliyi və bu anda qatarın gəlməsi mümkün deyil X + 1. - bacarmaq.

Hər bir qatar üçün bu cədvəldə bu qatarın gələcəyi yoxlama nömrəsini müəyyənləşdirən bir proqram yazın.

Giriş məlumatları Əvvəlcə nömrəni daxil edin K. - Son tarixlərin sayı və sayı N. - Elektrik qatarlarının sayı ( 1≤k≤100000., 1≤n≤100000.). Növbəti təqib edin N. hər birində xətlər qeyd olunur 2 Nömrələr: Gəliş vaxtı və gediş vaxtı. Vaxt həddindən artıq olmayan təbii bir nömrə ilə verilir 10 9 . Heç bir iki qatar eyni anda gəlmir, eyni zamanda eyni anda bir neçə qatar göndərilə bilər. Bu da bu mümkündür - hər hansı bir qatar (və ya hətta bir neçəsi) gəlmə zamanı nədən ibarətdir - bir başqa qatar. Hər bir qatarı gəlişinə ciddi şəkildə göndərmə vaxtı.

Bütün qatarlar gəliş vaxtı ilə sifariş olunur. Zero anında, stansiyadakı bütün çətinliklər pulsuz olduğuna inanılır.

Çıxış Çıxış N. Nömrələr - hər bir qatar üçün biri: Müvafiq qatarın gəldiyi yoxlama nömrəsi. Ölü sonu cədvələ görə elektrik qatarlarının hərəkətini təşkil etmək üçün kifayət deyilsə, iki nömrəni çıxartın: Birincisi bərabər olmalıdır 0 (sıfır) və stansiyaya gələ bilməyəcək qatardan birincisinin sayını ehtiva edən ikinci.

Giriş Çıxış
1 1 2 5 1
1 2 2 5 5 6 0 2
2 3 1 3 2 6 4 5 1 2 1

25: Ticarət Kalkulyatoru

Möhkəm Oisac Kalkulyatorun yeni bir versiyasını buraxdı. Bu kalkulyator istifadəçi pulundan görülən arifmetik əməliyyatlar üçün istifadə edir. Dollardakı hər bir əməliyyatın dəyəri bərabərdir 5 əməliyyatın nəticəsi olan nömrənin%. Bu kalkulyator miqdarı hesablamalıdır N. Təbii nömrələr (nömrələr məlumdur). Bu nömrələri hansı qaydada əlavə edəcəyimizi görmək asandır, bəzən bu nömrələrin sayının hesablanmasının hansı miqdardan asılıdır (bu, klassik prinsip tərəfindən pozulur ", dəyişmir şərtlərin yerlərinin yenidən qurulması.). Məsələn, nömrələr əlavə etməliyik 10 , 11 , 12 13. Sonra əvvəlcə yatsaq 10 11 (bu bizə başa gələcək 1.05 €), sonra nəticəsi 12 (1.65 €) və sonra ilə 13 (2.3 €), onda ödəyəcəyik 5 €, əvvəlcə ayrıca əlavə etsəniz 10 11 (1.05 €), o zaman 12 13 (1.25 €) və nəhayət alınan iki nömrəni qatladı ( 2.3 €), sonunda yalnız ödəyəcəyik 4.6 €. Məlumatın miqdarını tapa biləcəyiniz minimum məbləği təyin edəcək bir proqram yazın N. nömrələri.

Giriş məlumatları Girişin birinci sətirində sayı var N. (2 ≤ n ≤ 10 5). İkinci sətir dəsti N. Hər biri aşmayan təbii nömrələr 10000.

Çıxış Bunların miqdarını tapmaq üçün nə qədər pul lazım olduğunu müəyyənləşdirin N. nömrələri. Nəticədə onluq nöqtədən sonra iki əlamətlə çıxarılmalıdır.

Giriş Çıxış
4 10 11 12 13 4.60
2 1 1 0.10

26: Üçün sürüşmə pəncərəsində maksimum axtarın O (n)

Giriş pəncərənin eni - təbii bir nömrə və tam ədədlərin ardıcıllığı verilir.

Pəncərənin genişliyindəki hər kəsik uzunluğundakı maksimum nömrəni aradan qaldırmaq lazımdır.

Birinci sətirdə W və N - Sürətli pəncərələr və ardıcıllıq uzunluğu var. İkinci sətirdə n tam ədədlər var. N-nin w-dən az olmamasına zəmanət verilir.

Pəncərə ardıcıllıqla 1-ci addımda sürüşür. Hər addımda, pəncərədəki maksimum elementi tapmalısınız.

Bu vəzifənin sadəlövh həlli asimptotiklərdir O (nw). Bu vəzifəyə bir qərar var O (n)Ancaq bu müddət ərzində qərar O (N.)giriş. W) Də getmək.

Giriş Çıxış
3 8 1 2 3 4 5 4 3 2 3 4 5 5 5 4

 

 

Bu maraqlıdır: