Sibil & Inhinyeriyang Pampasabog
Kung Paano Sinasalungat ng Pagbilang ang Pag - uuri sa Maliliit na mga Himaton ng Integer
Table of Contents
Pagpapakilala sa Uri ng Pagbibilang
Ang Pagbibilang ng Uri ay isang hindi-pare-based na pang-uring algorithm na nakahihigit kapag nag-uuri ng mga integrasyon sa isang maliit, alam na lawak. di tulad ng mga uring pang-ilalim na pang-ilalim tulad ng Quicksort o Mergesort, na umaasa sa mga pares-pares na elementong paghahambing, nabibilang ang naturang kaayusan sa pamamagitan ng pagbibilang ng dalas ng bawat natatanging halaga. Ang pamamaraang ito ay nagbibigay ng linear time complex sa ilalim ng mga kaaya-ayang kondisyon, na gumagawa ng isang top-to na pagpili para sa maraming mga aplikasyong pang-kritikal kung saan ang input ay limitado.
Ang algorithm ay unang inilarawan ni Harold H. Seward noong 1954 at nananatiling isang pamamaraang pang-konstruksyon sa agham pangkompyuter. Ang pagiging simple at kahusayan nito ay gumagawa ritong huwaran para sa mga gawaing katulad ng pag-uuri ng mga edad, grado, o anumang integrasyong datos na may katamtamang pagkalat. Sa pamamagitan ng pag-ebolb ng mga auxiliary na imbakang proporsiyonal sa saklaw ng halaga, ang pagbibilang ng Uri ay umiiwas sa O(n log n) mas mababang grut ng pag-uri, pagkakamit ng O(n + k) panahon kung saan ang k ay ang saklaw ng input.
Kung Paano Gumagana ang Pagbilang sa Uri
Ang pinaka - buod na mekanismo ng pagbilang ng Uri ay tuwiran: binibilang nito kung ilang beses na lumilitaw ang bawat halaga sa input array, pagkatapos ay ginagamit ang bilang na iyon upang pagtugmain ang pangwakas na posisyon ng bawat elemento. Ang proseso ay binubuo ng tatlong magkakaibang yugto:
- Pagtuklas: Lumikha ng isang bilang ng sukat na k (ang hanay ng mga pagpapahalagang input), inisyal hanggang sero.Inutukoy sa pamamagitan ng input array at inkretuhin ang bilang para sa bawat halaga.
- Computing unlapi: Ang pagbabago ng hanay ng bilang ay nagiging isang prefix sum array, kung saan ang bawat elemento sa index i ay humahawak ng pinagsamang bilang ng mga elemento na mas mababa o katumbas ng i. Ang hakbang na ito ang nagtatakda ng mga simulang posisyon para sa bawat natatanging halaga sa nai-uring output.
- Mga elementong pang-Placing: [[T] I-verse ang input array mula kanan pakaliwa (para sa katatagan), gamitin ang numerong hanay upang mahanap ang tamang index sa hanay ng output, ilagay ang elemento doon, at i-decrement ang bilang. Ang pangwakas na output ay isang nai-bukud-tanging kopya ng input.
Ang algorithm ay nagbabalik ng bagong naibukud-tanging hanay, na nag-iiwan ng orihinal na hindi nagbabago.Ang isang variant na tinatawag na in-place na pagbilang ng Scripty ay umiiral ngunit bihirang ginagamit dahil ito ay nakipagkompromiso alinman sa katatagan o kahusayang pangkalawakan.
Halimbawa ng Hakbang sa Pamamagitan ng Pag - aayos ng Motorque
Isaalang - alang ang uri ng hanay [4, 2, 8, 3, 1] kung saan ang mga pamantayan ay mula 0 hanggang 8.
- Ang kondehan ay 9 (0–8) → [0,1,2,1,0,0,0,1]. (Ang Index 1 ay lumilitaw nang minsan, ang index 2 ay makalawa, ang index ay 3 beses, ang index ay 4 na beses, ang index ay 8 beses.)
- [ Ang pagbabagong upang tipunin ang → [0,1,3,5,6,6,6,6,6,7]. Ngayon ang bawat halaga ay nagsasabi sa atin ng panimulang posisyon para sa bilang na iyan sa naibukod na output.
- Output: [[FLT:] Ang unang elementong binabasa ay 1 → posisyon = bilang[1] - 1 = 0 → output[0]=1, dekrementong bilang[1] hanggang 0. Ang kasunod ay 3 → posisyon = bilang[3] - 1 = 4 → output[4]=3]=3, bilang[3]=4. Patuloy hanggang sa lahat ng elementong na na nakalagay.
Ipinakikita ng halimbawang ito kung paano lubusang iniiwasan ng mga nagbibilang na Uri ang paghahambing, anupat umaasa lamang sa mga operasyon sa aritmetika.
Pagkasalimuot ng Komputasyonal
Pagiging Masalimuot ng Panahon
- [Best, Average, and Most Case: O(n + k]), kung saan ang n ang bilang ng mga elemento at k ang saklaw ng input na mga halaga. Kapag ang k ay maliit na kamag-anak ng n, ang algorithm ay tumatakbo sa linear time.
- Commarson upang ihambing ang mga uri: Ang Quicksort at Mergesort ay may O(n log n) average complexing. Para sa n = 106 at k = 1000, ang pagbilang ng mga Script ( ⁇ 1,001,000 operasyon) ay halos 13 beses na mas mabilis kaysa sa isang karaniwang uri ng O(n log n).
Pagkasalimuot sa Kalawakan
- [ O(k) para sa hanay ng pagbilang, plus O(n) para sa hanay ng output. Ang memoryang ito sa itaas ay maaaring ipagbawal kung ang k ay malaki (e.g., pag-uuri ng 32-bit integers kung saan k = 232).
- [Talaksan:[[kailangan ng akawnt:1] Ang isang auxiliary output na hanay ng sukat n; in-poin-point variants na naghahain ng katatagan o gumagamit ng masalimuot na pag-aapula ng index.
Kung Kailan Gagamitin ang Uri ng Pagbilang
Ang pagbilang ay pinakamabisa sa ilalim ng sumusunod na mga kalagayan:
- Ang input ay binubuo ng mga integers (o data na maaaring i-place sa isang maliit na integer range, tulad ng mga character o discrete na kategorya).
- Ang range k ay hindi kapansin-pansing mas malaki sa n. Ang isang karaniwang tuntunin ng hinlalaki ay k ⁇ O(n).
- Ang memorya ay hindi lubhang napipigil, sapagkat ang hanay ng bilang at ang mga lente ng output ay nangangailangan ng karagdagang espasyo.
- Kailangan ang matatag na pag-aayos (hal., pag-uuri sa pamamagitan ng multiple keys). Ang pamantayang pagpapatupad ay matatag kapag ang mga elemento ay nakalagay mula kanan pakaliwa.
Kabilang sa mga mahusay na paggamit ng mga kaso ang pag-uuri ng mga grado (0–100), edad (0–120), kategoryang produkto (hanggang ilang daang SKU), o bilang isang subroutine sa [Radix Spectment.
Mga Kahinaan at Pagpapakundangan
Sa kabila ng bilis nito, ang pagbilang ng Uri ay may mga disbentaha na nagtatakda sa pagiging madaling tanggapin nito:
- [[Talaksan: Hindi nito tuwirang mauri ang mga lumulutang na bilang o kuwerdas malibang ito ay gawing contiguous integer set.
- [Large range: Kung ang mga k dwarfs ⁇ i ⁇ e ⁇ , na nag-uuri ng 100 bilang na may mga halaga sa pagitan ng 1 at 107°i ⁇ ang hanay ay kumukunsumo ng napakalaking memorya habang nag-uuri lamang ng ilang mga elemento.
- Non anna adaptive:[[kailangan ng masusing pagsusuri sa buong input at pagbuo ng hanay ng mga konde, kahit na kung ang data ay nauri na o halos nauri na.
- [[[C] Mga pamantayang pang-egative: Pamantayang Pagbilang ng Uri ay nagpapalagay ng mga hindi-negative integers. Upang harapin ang mga negatibo, maaari mong baguhin ang mga halaga sa pamamagitan ng pagbabawas ng minimum (paggawa ng range 0 hanggang max – mi).
Ang mga limitasyong ito ay nangangahulugan ng pagbilang ng Uri ay isang espesyalisadong kasangkapan, hindi isang unibersal na kapalit para sa mga pangkalahatang-layuning algorithms.
Paghahambing sa Nauugnayng mga Algorithm
Pagbilang ng Uring vs.
Ang Radix Uri ay nagpapalawig ng ideya sa pamamagitan ng pag-uuri ng mga numero mula sa hindi gaanong mahalaga hanggang sa pinakamahalaga, gamit ang isang matatag na uri (kadalasang pagbibilang ng Uri) sa bawat numero. Habang ang pagbibilang ng mga gawa sa isang verage k, ang Radix Sari ay nagsasagawa ng multiple stage sa isang mas maliit na numerong distansya (e., base 256), ang pagbabawas ng paggamit ng memorya para sa malaking k. Halimbawa, ang pag-uri ng 32-bit integers na may pagbibilang ng mga multiple na 232 ent, samantalang ang Radix na may 8-bit ay nangangailangan lamang ng 256 at apat na ent.
Pagbilang ng Uri ng mga v.
Ang Bucket Sander ay namamahagi ng mga elemento sa isang bilang ng mga timba at uri ng bawat timba bawat isa (kadalasan sa pamamagitan ng institution type). Ang pagbilang ng Uri ay maaaring ituring bilang isang espesyal na kaso ng Bucket Scrime kung saan ang bawat timba ay katumbas ng isang natatanging halaga. Ang Bucket Skin ay gumagana ng maayos sa pare-parehong ipinamahaging lumulutang-puntong data, ngunit ang pagbibilang ng Sanggalang-uri ay limitado sa mga integer domain.
Pag - aani ng Isang Matatag na Uri ng Pagbilang
Mahalaga ang katatagan kapag ang pag - uuri sa isang susi samantalang iniingatan ang relatibong kaayusan ng pantay na mga elemento mula sa isa pang susi. Ang pamantayang pagbilang ng Sari - saring Uri ay likas na matatag kapag ang mga silo ng output ay humaharang sa input mula kanan pakaliwa.
- Comptable count array gaya ng inilarawan.
- Komberte sa prefix sumpers (mga posisyon ng bawat halaga sa naibubukod na output).
- I-interate ang input array sa baligtad na pagkakasunud-sunod. Para sa bawat elemento, ilagay ito sa posisyong ipinapakita ng bilang nito, pagkatapos ay i-decrement na ang bilang.
Dahil inihahanda natin ang mga elemento mula sa katapusan, ang huling paglitaw ng isang ibinigay na halaga ay nasa pinakamataas na posibleng indise, anupat iniingatan ang relatibong kaayusan. Ang matatag na bersiyong ito ay mahalaga para gumana nang tama ang Radix Cylde sa bawat numero.
Praktikal na mga Pakinabang
- Mga sistemang pang-Eduksyonal na grading: Paghahati ng daan-daang iskor sa pagsusulit (ranggo 0–100) sa O(n) panahon.
- Bioinformatics: Ang Paghahati sa integer ay nagbabasa ng mga aspeto o DNA k ⁇ mer frequency kapag ang sukat ng alpabeto ay maliit (A, C, G, T).
- [Database index maintenance: Paghahati ng mga natatanging integer na may lawak na maliit na sapat upang magkasya sa memorya.
- Pagproseso ng : Paghahati ng mga histagram bin o color intensities (0–255) kapag ang gusali ay mukhang mga mesang caltrop.
- [[[[T:] Ginagamit sa loob ng Radix Sarice, na siyang kabayong pangtrabaho para sa mahusay na pag-uuri sa maraming aklatan at wika (e.g., ang .NET runtime ay gumagamit ng isang adaptibong paghahalo ng mga algoritmo kabilang ang pagbilang ng mga Sariwado para sa maliliit na mga hanay).
Para sa higit pang impormasyon tungkol sa teoriya at mga pagkakaiba, sumangguni sa mapananaligang mga reperensiya na gaya ng Wikipedia: Pagbilang ng Sari - saring Uri[ at GeksforGeks: Pagbibilang ng Uri. Praktikal na paghahambing sa iba pang mga algorithm ang matatagpuan sa Brilliantenses na nagbibilang sa mga Uri[T][5].
Optimikong Pagbilang ng Uri Para sa Malalaking Hibla
Kapag malaki ang k subalit malaki rin ang n, ang purong pagbilang ng mga Uri ay nagiging memory calculustensive.
- Cominadong Kakaunti: Gumamit ng mapa ng hash sa halip na isang kontiguous array kapag ang saklaw ng mga ginagamit na mga halaga ay malaki ngunit ang bilang ng mga natatanging halaga ay maliit. Ang kalakalang ito ay patuloy-time indexing para sa hashing sa itaas ngunit binabawasan ang pagkonsumo ng memorya.
- [[Hybrid] Mga paraan: Pagbilang ng Uri sa iba pang mga algorithm. Halimbawa, kung ang range ay lumampas sa 106, gamitin ang Radix Sari - saring may base na nagpapanatili sa digit ranges maliit.
- Sa mga variant ng calclace: Ang ilang mga optimisasyon ay nagbabawas ng ekstrang espasyo sa O(k) nang walang hanay ng output, ngunit ang mga ito ay pangkalahatang naghahain ng katatagan o nangangailangan ng mga siklo upang mahanap ang mga posisyon.
Pagsasaayos
Ang Pagbibilang ng Uri ay namumukod-tangi bilang isang kapansin-pansing algorithm para sa pag-uuri ng mga integers kapag ang saklaw ng halaga ay maliit na relatibo sa bilang ng mga elemento. Ang O(n + k) na oras na komplikado at linear na pagganap nito ay gumagawa ritong mahalaga sa mga senaryo tulad ng pag-uuri ng grado, Radix Sarix Saride subroutinaes, at mga aplikasyon na may mga naka-taling integor. Gayunpaman, ang algorithmiminthmextectex ay gumagawa ng mga sistemang ent:[T] [[T] [[T] [[T] [[T] [[T] [[T] [[T] [[T] [[T] [[T] [[T] [[T] [[T] Ang mga sistemang ] ay hindi nakikita:"] [[T] [[T] [[CCCCCCCCCCOL] ay mas mabilisang [[T] ay hindi [[T] [[T] [[T] [[T] [[