İnşaat & Yapısal Mühendislik
Wining Point Numbers için Logo Sortileri Uygulamayı Uygulayın
Table of Contents
Astroing-Point Numbers için Fragr Sorte Giriş
Kova türü, bölümlerin giriş verilerini son derece sayıda “buckets”e ve sonra her kovanın bireysel olarak dağıtıldığı bir dağıtım tabanlı tür algoritmadır.Gerekli olarak bilinen bir aralığın üzerindeki yüzen sayılara uygulanırken - genellikle 0,0 - kovalama süresi karmaşıklığı elde edebilir, yüksek performanslı bir tür görev için güçlü bir aday yapabilir.
Temel fikir basittir: her bir elementle karşılaştırmak yerine (en hızlı veya bir araya gelen gibi karşılaştırmak gibi), kova tür ilk olarak, değerlerine dayanarak kovadaki elementleri dağıtır.Her kova doğal gruplar birlikte basit bir tür algoritmayı karşılaştırır - sık sık sık sık sık sık sık sık sık sık sık sık ekleme veya hatta bir recursive çağrıyı kovalama - işi bitirin.Son olarak, kovalar sıralamayı üretmek için kontenjanlar.
Bu makale, Python'daki yüzen sayılar için kova türlerini uygulamak, mekaniklerini, karmaşıklığını, güçlülerini, pitfalls'ı ve gerçek dünya uygulamalarını kapsayan kapsamlı bir görünüm sağlar.
nasıl Kova Sort Works
Kova türü, girişin bilinen bir aralıkta eşit olarak dağıtıldığını varsayar, tipik olarak ESFLT:1). Algoritma üç aşamada devam eder:
- [FONT=0)Initialization[Dönetici: 1 ): Bir dizi [[Dönetici:2|Döntgenlik[Dönetici:0)) boş kovalar, DÜDÜDÜDÜDÜDÜDÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜ
- [FONT:0]Distribution[[[DÜDÜT:1): Her bir elementur için:2), kova indeksini hesaplar.(değerler varsayılır) ve bu kovaya yerleştirir.
- [FONT:0]Sorting and Concatenation[[Döntme: Her kova bireysel olarak (bir stabil veya verimli iç tür kullanarak), sonra son sıralamayı üretmek için kovaları birleştirin.
Anahtar bilgisi, verilerin düzgün bir şekilde dağıtılması nedeniyle, her kova kabaca [[Dönetici:0)n / n = 1) ortalama olarak bir takım başına maliyet tutar.Bu, bireysel kovalar için son derece düşük tutar - genellikle sürekli zaman.
Edge Cases
Yüzücü nokta sayısı 1.0'a tam olarak eşit olduğunda, hesaplanmış indeks meydana gelmez, bu sınır dışı edilmenin akıllıca olduğu. Ortak bir düzeltme, bu tür değerler için indeksi değiştirilebilir.Eğer verileriniz kesinlikle öyleyse 7'dir, ancak buna karşı korumanın akıllıca olduğu anlamına gelir.
Implementing Platinum in Python
Aşağıda, serileri [[DüzFLT:8'de yüzen sayı için bir kova türünin temiz, üretime hazır bir uygulamasıdır.
def bucket_sort(arr):
"""Sort an array of floats uniformly distributed in [0, 1)."""
n = len(arr)
if n <= 1:
return arr
# Create empty buckets
buckets = [[] for _ in range(n)]
# Distribute elements into buckets
for num in arr:
index = int(num * n)
# Guard against floating-point index = n (e.g., when num == 1.0)
if index == n:
index = n - 1
buckets[index].append(num)
# Sort each bucket and concatenate
sorted_arr = []
for bucket in buckets:
sorted_arr.extend(sorted(bucket)) # Python's Timsort is efficient
return sorted_arr
İşlev Python'un inşa edilmiş-inurFLT:10'u her kovaya dönüştürmek için kullanır. Küçük kovalarda (tipik olarak 0-2 element), bu çok hızlı. Üretim kullanımı için, [[Şamping|sepsiyon|daha düşük yüksek tepeye kadar yerini alabilirsiniz.
Kova Sort için Arbitrary Ranges
Eğer yüz nokta verileriniz, dağıtımdan önce değerleri normalleştirebilirsiniz. Aşağıdaki varyasyon haritaları herhangi bir wwwFLT:13) aralığına göre:FLT:14.
def bucket_sort_scaled(arr, min_val=None, max_val=None):
if not arr:
return arr
if min_val is None:
min_val = min(arr)
if max_val is None:
max_val = max(arr)
# Guard against identical values
if max_val == min_val:
return arr
n = len(arr)
buckets = [[] for _ in range(n)]
for num in arr:
# Normalize to [0, 1)
normalized = (num - min_val) / (max_val - min_val)
index = int(normalized * n)
if index == n:
index = n - 1
buckets[index].append(num)
sorted_arr = []
for bucket in buckets:
sorted_arr.extend(sorted(bucket))
return sorted_arr
Bu sürüm daha geneldir, ancak aralığı bilmek veya hesaplamak gerekir. Bu sürüm, veri dağıtımının bu aralıkta yaklaşık üniforma olduğu zaman iyi çalışır.
Kompleksi Analiz Analizi
Hesaplama maliyetinin anlaşılması, onu kullanmaya karar vermek için önemlidir.
Zaman Kompleksi
- [FONT:0) En iyi durumda [DÜDÜDÜDÜDÜDÜDÜ:0)[Üye Olmayanlar İçindekiler (DÜDÜDÜDÜDÜDÜ)[Üye Olmayanlar (DÜye Olmayanlar)[Üye Olmayanlar İçindekiler (DÜye Olmayanlar)[Üye Olmayanlar)[Üye Olmayanlar İçindekiler)[Üye Olmayanlar İçindekiler)
- [FONT:0]Average davası[[[Döntilmiş: 1)[Dönem:2)[B][/FONT)[FONT=FONT=FONT=FONT=)[[0|0|0|0|0|0|0|0|0|x|x|x|x|x|x|x|x|x|x|x|x|x|x|x|k|k|k|k=======)))))
- [FONT:0]Worst davası[[[Dönetici:0)[0]: [[))[0]Döneticiler aynı kovaya düştüğünde, veriler düzgün bir şekilde dağıtıldığında veya aralık element sayısına göre çok küçük bir bağız.
Uzay Kompleksi
Kovalar ve içerikleri için ekstra alan (=0)O(n + k))[Uygunlar ve içerikleri için ekstra alan).
Avantajları ve Kullanım Vakaları
Kova türü, varsayımlarının nerede tuttuğu özel senaryolarda parlıyor:
- [FONT:0)Uniformly, yüzen veri[Dönemli:0) dağıtıldı). – e.g., sensör okumaları, Monte Carlo simülasyon çıktıları veya normalleştirilmiş olasılıklar.
- [FONT:0]Large veri setleri[[[Dönetici:0) - [Dönetici:0)[Dönetici:0))[Dönetici:0)) Ortalama dosya performansı, karşılaştırma türünin daha az verimli olacağı milyonlarca yüz türü için çekici hale getirir.
- [FONT:0]Dönege[[Dönetici:0))[[Döneticiler disk üzerinde olduğunda, kovalar bağımsız olarak işlenebilir ve ayrı dosyalar için yazılabilir, sonra koncatened.
- [0]Parallel ve GPU Hesaplama[Dönetici: 1 ) - her kova bağımsız olarak sıralanabilir, büyük paralelliğe izin verebilir.
Önemli bir güç, kova türünin İLFLT:0) (eğer per-bucket tür stabilse), eşit elementlerin göreceli siparişinin korunması anlamına gelir.
Sınırlar ve Tahminler
Onun zarafetine rağmen, kova türü genel amaçlı tür için uygun olmayan birkaç sınırlamaya sahiptir:
- [FONT=0]Katılım dağıtımına dikkat edin[Dönetici: Eğer veriler skewed (e.g., birçok değer birlikte kümelenmiş), çoğu element birkaç kovaya girer, bu tür maliyeti artırır ).
- [FONT:0)Ehberler aralığın bilgisinden önce bilgi[DÜDÜT:1): En az ve maksimum değerleri bilmeden, bu yöntemin üzerindeki ölçeklenmiş sürümleri etkili bir şekilde oluşturamazsınız, ancak hesaplama aralığı ekstra bir geçiş ekler.
- [FONT:0)Memory Master[[Dönetici: 1 ): Yaratılış[Dönetici:0)[0) Python listeleri önemli hafızayı kullanabilir, özellikle çok büyük diziler için. Linked listeleri veya diziler listesi, ancak Python listelerini azaltır.
- [FONT:0) per-bucket sorting[[Dönetici: Python'sULLFLT:16 ile birçok küçük kovayı sıralayın) son derece küçük kovalar için ekleyebileceğiniz işlev aramaları yapar.For Extreme small kovas, an open insertion sort might be more.
Ne zaman Fragr Sort Sorti Kullanmayın
Veriler düzgün bir şekilde dağıtılmadığında, aralıkların element sayısına çok büyük ölçüde bağlıdır veya hafıza son derece kısıtlanmış durumda.Bu durumlarda, karşılaştırma tabanlı bir tür [[ŞUYU:0) ya da ).
Diğer Sorting Algorithms ile Karşılaştırma
Kova türü, tür algoritmaları arasında eşsiz bir niş kaplar. İşte ortak alternatiflerle nasıl karşılaştırılır:
| Algorithm | Average Time | Space | Stable | Best For |
|---|---|---|---|---|
| Bucket Sort (with k = n) | O(n) | O(n) | Yes (if per-bucket sort is stable) | Uniform floats in known range |
| Quicksort | O(n log n) | O(log n) | No (typical) | General-purpose, in-place |
| Mergesort | O(n log n) | O(n) | Yes | Stable sorting, linked lists |
| Counting Sort | O(n + k) | O(k) | Yes | Integer data with limited range |
| Radix Sort | O(n × w) | O(n + 2^w) | Yes (LSD) | Integers or strings of fixed length |
Yüz noktaları için, kova türü genellikle radix tür (bazı yüzlerin manipülasyonu gerektirir) ve [[0)O(n log n)) her zaman veri üniforması olduğunda karşılaştırma yapılabilir.
Pratik Python İpuçları ve Optimizasyonlar
Kovaların Sayılarını Seçme
Bir takım kovanın sayısını element sayısına eşit ayarlama ([Dön:0)k = n) standart bir başparma kuralıdır. Daha az kovalar ortalama kova boyutunu ve degrad performansını arttırır; daha fazla kovalar hız geliştirmeden hafıza alır.
Küçük Kovalar için Addion Sorti Kullanımı
İyi bir kontrol istiyorsanız, özel bir eklenti ile kovalar için daha küçük bir ekleme türü yerine, 20 element:
def insertion_sort(arr):
for i in range(1, len(arr)):
key = arr[i]
j = i - 1
while j >= 0 and arr[j] > key:
arr[j + 1] = arr[j]
j -= 1
arr[j + 1] = key
def bucket_sort_insertion(arr):
n = len(arr)
if n <= 1:
return arr
buckets = [[] for _ in range(n)]
for num in arr:
index = int(num * n)
if index == n:
index = n - 1
buckets[index].append(num)
sorted_arr = []
for bucket in buckets:
insertion_sort(bucket)
sorted_arr.extend(bucket)
return sorted_arr
Bu, yükü azaltabilir çünkü Python'un 03.03.2012 tarihli çalışma, 0 veya 1-element listeleri için aşırıya giden bir genel amaçlı davranışa sahiptir.
Non-Uniform Dağıtımları
Veri dağılımının üniforma olmadığını biliyorsanız, ancak hala kova tür kullanmak istiyorsanız, kova sınırlarını adapte edebilirsiniz. Örneğin, veriler normal bir dağıtım izlerse, yüklemeyi dengelemek için eşitsiz genişlik kovaları oluşturabilirsiniz. Ancak, bu, verilerin önceden analizi gerektirir ve nadiren pratikte yapılır.
Dış Kaynaklar
Daha fazla okuma için aşağıdaki yazar referansları düşünün:
- [[ ⁇ :0)Wikipedia: Kova Sort[[Dönetici: 1) ayrıntılı açıklama ve karmaşık kanıtlar.
- [[Deks forGeeks:WinT:0)GeeksforGeeks:Win Sort Sort Sort Sort).
- [FONT:0)Python'unFLT:20] Belgeleri) - alt Timsort'u anlayın.
- [FONT:0)Real Python: Python'da Algoritmaları [Dön 1: 1) - kova ile diğer algoritmaları karşılaştıran pratik kılavuz.
Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç
Kova türü, yüzen sayılarını türlendirmek için zarif, verimli bir algoritmadır - özellikle de veriler düzgün bir şekilde dağıtılır ve aralık bilinir. Lineer ortalama zaman karmaşıklığı, veri bilimcisi veya mühendisinin aracında değerli bir araç yapar. ancak, giriş ve ek hafıza gereksinimlerine olan duyarlılığı, körüne nasıl kullanılmaması gerektiği anlamına gelir.
Bir stochastic simülasyondan milyonlarca sensör ölçüm veya normalleme işlemine yer verdiğinizde, kova türü hızlı, istikrarlı ve paralel bir çözüm sunar - verileriniz kuralları tarafından oynadığı sürece.