Table of Contents
Pengantar untuk Menghitung Jenis
Counting Sort adalah algoritme pengurutan berbasis non-komparison yang unggul ketika mengurutkan integer di atas kisaran yang kecil dan dikenal. Berbeda dengan urut berbasis perbandingan seperti Quicksort atau Cangesort, yang mengandalkan perbandingan elemen pasanganwise, Counting Sort menentukan urutan diurutkan dengan menghitung frekuensi setiap nilai yang berbeda. Pendekatan ini menghasilkan kompleksitas waktu linier di bawah kondisi yang menguntungkan, menjadikannya pilihan go-to untuk banyak aplikasi kinerja-kritis di mana domain input terbatas.
Algoritme tersebut pertama kali dideskripsikan oleh Harold H. Seward pada 1954 dan tetap menjadi teknik dasar dalam ilmu komputer.Kesederhanaan dan efisiensinya membuatnya ideal untuk tugas-tugas seperti menyortir usia pelajar, nilai, atau data integer apapun dengan penyebaran yang bersahaja.Dengan mengungkit proporsi penyimpanan tambahan ke kisaran nilai, Counting Sort menghindari O(n log n) Batas bawah dari pemilahan perbandingan, mencapai O(n + k) waktu dimana k adalah kisaran nilai masukan.
Berkarya dengan Cara Menghitung Jenis
Mekanisme inti dari Counting Sorch adalah mudah: ini menghitung berapa kali setiap nilai muncul dalam input array, kemudian menggunakan hitungan tersebut untuk menghitung posisi akhir masing-masing elemen. proses terdiri dari tiga fase berbeda:
- [[CANFAIL:0]]Counting: Buat sebuah array hitungan ukuran k (jangkauan nilai input), diinisialisasi ke nol. Iterate melalui array input dan increment penghitungan untuk setiap nilai.
- [[OGNOLT:0]]Ear awalan computing: Jelmakan array hitung menjadi sebuah array awalan sum, di mana setiap elemen pada indeks i memegang hitungan kumulatif unsur kurang dari atau sama dengan i. Langkah ini menentukan posisi awal untuk setiap nilai berbeda dalam keluaran yang diurutkan.
- [[EULANDAFLT:0]]Placing elemen: Traice array input dari kanan ke kiri (untuk stabilitas), gunakan array hitung untuk menemukan indeks yang benar dalam array output, tempatkan elemen di sana, dan decrement count. Keluaran akhir adalah salinan yang diurutkan dari masukan.
Algoritma ini mengembalikan susunan yang baru diurutkan, meninggalkan yang asli tidak berubah. Sebuah varian yang disebut in-place Counting Sort ada tetapi jarang digunakan karena kompromi baik stabilitas atau efisiensi ruang.
Langkah ⁇ oleh ⁇ Langkah Contoh
mempertimbangkan penyortiran array [4, 2, 8, 3, 1] dimana nilai berkisar antara 0 hingga 8.
- [[ZOZOFLT:0]]Count: Count array size 9 (0 ⁇ 8) → [0 ⁇ 1,2,2,2,1,0,0,0,0 ⁇ 1]. (Indeks 1 muncul sekali, indeks 2 dua kali, indeks 3 dua kali, indeks 4 sekali, indeks 8 sekali.)
- [8]NexpanyFLT:0]]Prefix sums: Transform to cumulative → [0,1,3,5,6,6,6,6,6,7]. Sekarang setiap nilai memberitahu kita posisi awal untuk nomor tersebut dalam keluaran terurut.
- [6]]]
] Traice array orisinal dari akhir: first element read is 1 → posisi = count[1] - 1 = 0 → output[0]=1, jumlah pengurangan[1] ke 0. Selanjutnya adalah 3 → posisi = count[3] - 1 = 4 → keluaran[4]=3, count [3]=4. Lanjutkan sampai semua elemen ditempatkan. Keluaran akhir: [1,2,2,3,3,4,8].
Contoh ini menunjukkan bagaimana Counting Sort menghindari perbandingan sepenuhnya, hanya mengandalkan operasi aritmetika.
Kompleksitas Komputasi
Kompleksitas Waktu Ekodinas
- [[ZOUBLT:0]]Best, Average, and Worst Case: O(n + k), dimana n adalah jumlah elemen dan k adalah rentang nilai input. Ketika k kecil relatif terhadap n, algoritme berjalan dalam waktu linear.
- [[OGNOFLT:0]]Comparson to change perbandingan: Quicksort and Cangesort memiliki O(n log n) kerumitan rata-rata. Untuk n = 106 dan k = 1000, Penghitungan Sort ( ⁇ 1,001.000 operasi) adalah sekitar 13 kali lebih cepat daripada sortir O(n log n) biasa.
Kompleksitas Ruang Angkasa
- [[EUZOFLT:0]]Primary: O(k) untuk array hitungan, ditambah O(n) untuk array output. Overhead memori ini dapat bersifat affective jika k adalah besar (misalnya, mengurutkan bilangan bulat 32-bit di mana k = 232).
- Parameter tools Stable variant: Memerlukan array keluaran tambahan ukuran n; in-place varians victory stability atau menggunakan manipulasi indeks kompleks.
Dipakai untuk Menghitung
Urutan Penghitungan Ukur paling efektif di bawah kondisi berikut:
- Input morfid terdiri dari integer (atau data yang dapat dipetakan ke kisaran integer kecil, seperti karakter atau kategori diskret).
- Kisaran k tidak secara signifikan lebih besar dari n. Aturan umum ibu jari adalah k Á O(n).
- Memori lema tidak terlalu dibatasi, karena array count dan penyangga output membutuhkan ruang tambahan.
- Stabilitas ketak-kestabilan diperlukan (misalnya, penyortiran dengan beberapa tombol). Pelaksanaan standar stabil ketika unsur ditempatkan dari kanan ke kiri.
Kasus penggunaan yang sangat baik termasuk sorting grade (0 ⁇ 100), usia (0 ⁇ 0), kategori produk (hingga beberapa ratus SKU), atau sebagai subroutine dalam Radix Sort.
Batasan dan Pertimbangan
Meskipun kecepatannya, Counting Sort memiliki kelemahan yang membatasi kemampuan yang sesuai:
- Integer hanya: Ini tidak dapat langsung mengurutkan bilangan titik pecahan atau string kecuali jika mereka dikonversi ke set integer yang berdampingan.
- [[Efleksif:0]] Kisaran besar: Jika k kerdil n ⁇ misalnya, mengurutkan 100 bilangan dengan nilai antara 1 dan 107 ⁇ array hitung mengkonsumsi memori yang sangat besar saat mengurutkan hanya beberapa elemen.
- [[ULARAN-ANFAIL:0]]Non ⁇ adaptive: Penghitungan Penyisihan selalu memerlukan pemindaian seluruh input dan membangun array hitungan, meskipun data sudah diurutkan atau hampir diurutkan.
- Nilai-nilai egatif: Penghitungan Standar Menghitungan Selisih asumsi integer non-negatif. Untuk menangani negatif, anda dapat menggeser nilai dengan menipiskan minimum (membuat kisaran 0 hingga max ⁇ min).
Keterbatasan ini berarti Counting Sort adalah alat khusus, bukan pengganti universal untuk algoritma tujuan umum.
Perbandingan dengan Algoritma Penyortiran yang Berkaitan
Urutan Berhitung dengan Radiks
Urutan Zifaz Radix memperluas ide dengan mengurutkan digit dari paling tidak signifikan ke paling signifikan, menggunakan sebuah sortir stabil (sering Menghitung Selisih) di setiap digit. Sementara Counting Sort bekerja pada satu melewati jangkauan penuh k, Radix Sort melakukan multiple melewati kisaran digit yang lebih kecil (misalnya, base 256), mengurangi penggunaan memori untuk k besar. Sebagai contoh, mengurutkan bilangan bulat 32-bit dengan Counting Sort akan membutuhkan sejumlah count array dari 232 entri, sedangkan Radix Sort dengan 8-bit digit membutuhkan 256 entri per pass dan hanya empat yang lewat.
Urutan Ukuran Urutan Ukuran
Penyisihan Bucket mendistribusikan unsur ke dalam sejumlah ember dan urut setiap ember secara individual (sering dengan penyisipan urut). Penghitungan Selisih dapat dipandang sebagai kasus khusus Buket Sort di mana setiap ember sesuai dengan nilai tunggal yang berbeda. packet Sort bekerja dengan baik pada data titik pecahan yang didistribusikan secara seragam, tetapi Counting Sort terbatas pada domain integer.
Mengimplementasi Jenis Penghitungan yang Stabil
Stabilitas-Luar Kestabilan penting ketika diurut oleh satu kunci sementara menjaga urutan relatif dari unsur yang sama dari kunci lain. Algoritma Penghitungan Standar stabil secara inheren ketika penempatan output loop traverses input dari kanan ke kiri Berikut adalah garis luar tekstual dari varian stabil:
- Penghitungan hitungan array seperti yang dijelaskan.
- ¡Aqh convert to prefix sums (posisi setiap nilai dalam keluaran terurut).
- Buat setiap elemen, letakkan pada posisi yang ditunjukkan oleh jumlah, lalu kurangkan jumlah itu.
Karena kita memproses elemen dari akhir, kejadian terakhir dari nilai yang diberikan masuk ke dalam indeks yang mungkin tertinggi, menjaga tatanan relatif. versi stabil ini sangat penting untuk Radix Sort untuk berfungsi dengan benar pada setiap digit.
Aplikasi Praktis Praktis
- ] Sistem penilaian pendidikan: Mengurutkan ratusan nilai ujian (range 0 ⁇ 100) dalam waktu O(n).
- Bioinformatics: Mengurutkan bilangan bulat baca hitungan atau frekuensi DNA k ⁇ mer ketika ukuran alfabet kecil (A, C, G, T).
- Entabase index Pemeliharaan: Mengisihkan pengenal-pengcam integer unik dalam jangkauan cukup kecil untuk muat dalam memori.
- [[ZOBILT:0]]Pemrosesan gambar: Mengurutkan bins histogram atau intensitas warna (0 ⁇ 5) ketika building look ⁇ up tabel.
- [[ObjekFLT:0]]Isih oleh kunci sekunder: Digunakan di dalam Radix Sort, yaitu workhorse untuk penyortiran efisien dalam banyak pustaka dan bahasa (misalnya, runtime .NET menggunakan campuran adaptif dari algoritme termasuk Counting Sort untuk rentang kecil).
Untuk lebih lanjut mengenai teori dan varian, berkonsultasi referensi berotorisasi seperti Wikipedia: Menghitung Urut dan GeeksforGeeks: Menghitung Urut. Perbandingan praktis dengan algoritme lain dapat ditemukan dalam Brilliant's Counting Sorch artikel].
Mengoptimasi Penghitungan yang Memotasi Jenis untuk Jangkauan Besar
Bila k besar tetapi n juga besar, Urut Penghitungan murni menjadi memori ⁇ intensif. Beberapa optimasi ada:
- [[ENOFLT:0]]Pengurangan yang dipres: Gunakan peta hash daripada array coconlice ketika rentang nilai yang digunakan besar tetapi jumlah nilai yang berbeda adalah kecil. Ini memperdagangkan pengindeksan waktu-berterusan untuk hashing overhead tetapi mengurangi konsumsi memori.
- Hybrid pendekatan: Kombinasi Menghitung Selisih dengan algoritme lain. Sebagai contoh, jika rentang melebihi 106, gunakan Radix Sort dengan dasar yang menjaga jarak digit kecil.
- [5] ⁇ ]In ⁇ place varians: Beberapa optimasi mengurangi ruang tambahan ke O(k) tanpa array output, tetapi mereka umumnya mengorbankan stabilitas atau membutuhkan siklus untuk menemukan posisi.
Kekecualian Kesimpulan
Urutan Terhitung yang menonjol sebagai algoritme yang sangat efisien untuk menyortir integer ketika nilainya kecil relatif terhadap jumlah elemen. O(n + k) waktu kompleksitas dan kinerja linear membuatnya dapat diintensifkan dalam skenario seperti pengurutan nilai, subroutines Urutan Radix, dan aplikasi dengan tombol integer terikat. Namun, ketergantungan algoritma pada masukan integer dan memorinya yang berlebihan untuk jangkauan besar mengingatkan kita bahwa tidak ada sortir tunggal yang optimal untuk semua situasi. Dengan pemahaman ketika Counting Sorts ⁇ and ketika gagal ⁇ pengembangan dapat membangun, lebih cepat dapat diprediksi sistem. Untuk membaca lebih lanjut tanpa-berbagi berdasarkan urutan [[TFLTFL]] dan urutan:[FL2]] dan urutan:[TFL]]