معرفی بازی با Bucket Type برای شماره های شناور

نوع سطل یک الگوریتم مرتب سازی مبتنی بر توزیع است که داده های ورودی را به تعداد محدودی از "buckets" تقسیم می کند و سپس محتویات هر سطل را به صورت جداگانه تنظیم می کند، هنگامی که برای اعداد شناور که به طور یکنواخت در یک فاصله شناخته شده توزیع می شوند - به طور معمول (FLT:0) - نوع سطل می تواند به پیچیدگی زمان به طور متوسط خطی دست آورد، و آن را قوی برای عملکرد بالا تبدیل کند.

ایده اصلی ساده است: به جای مقایسه هر جفت از عناصر (مانند انواع مقایسه مانند سرعت یا ادغام)، نوع اول عناصر را در سراسر سطل ها بر اساس ارزش های خود توزیع می کند.هر سطل به طور طبیعی گروه ها طیف محدودی از ارزش ها را جمع می کنند.پس از آن، یک الگوریتم ساده - اغلب تایپ یا حتی یک تماس بازگشتی برای به پایان رساندن کار - در نهایت به شکل گیری آرایه.

این مقاله نگاهی عمیق به اجرای نوع سطل برای اعداد شناور در پایتون، پوشش مکانیک، پیچیدگی، نقاط قوت، مشکلات و کاربردهای دنیای واقعی ارائه می دهد.

چگونه بازی های بات

نوع بات فرض می کند که ورودی به طور یکنواخت در محدوده شناخته شده توزیع می شود، به طور معمول (FLT:1) الگوریتم در سه مرحله ادامه می یابد:

  1. [[۱] [۱۰] [۱] [۱۰] [۱] [۱] [۱۰] [۱]] [[۳]] [۱] [۱]] [۱۰]] [۱] [۱۰] [۱]] [۱۰]] [۱] [۱۰]] [۱]] [۱۰] [۱] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۵] [بر تعداد عناصر [بر تعداد عناصر [بر [بر [بر [بر [بر [بر [بر [بر [براى] [براى] [براى] [براى] [براى] [براى] [براى] [براى [براى] [براى [براى [براى [براى [براى] [براى [براى] [براى] [براى] [براى] [براى [براى] [براى] [براى] [براى] [براى] [براى] [براى] [براى] [براى] [براى [براى] [براى] [براى] [براى] [براى]
  2. [[۱] [۱۰] [[۱]] [۱۰] [۱] [۱]] [۳] [۳] [[۳]] [[۳]]] [[۳]] [[۳]]] [[۳]]] [[۳]]] [[۳]]] [و [براى هر عنصر] در آن سطل قرار می گیرند.
  3. [[۱]:۱۰] [۱۰] [۱۰] [۱] [۱۰] [۱] [۱] [۱]: هر سطل را به صورت جداگانه (با استفاده از هر گونه گونه فضای پایدار یا کارآمد) تقسیم کنید، سپس سطل ها را به منظور تولید آرایه نهایی، به صورت جداگانه در بیاورید.

بینش کلیدی این است که به دلیل اینکه داده ها به طور یکنواخت توزیع می شوند، هر سطل تقریباً (FLT:0)n / n = 1 عنصر به طور متوسط است که هزینه مرتب کردن سطل های فردی را بسیار کم می کند - اغلب زمان ثابت در هر سطل.

مدیریت پرونده های Edge Cases

هنگامی که یک عدد شناور دقیقاً برابر با 1.0 باشد، شاخص محاسبه شده (FLT:5) که از حد و مرز خارج می شود، یک اصلاح مشترک این است که شاخص را برای چنین ارزش هایی در عمل، در صورتی که داده های شما به شدت (FLT-7) است، اما عاقلانه است که در برابر آن محافظت کنید.

پیاده سازی سطل در پایتون

در زیر یک پیاده سازی تمیز و آماده برای ساخت سطل برای اعداد شناور در محدوده (FLT:8) است.

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

این تابع از عناصر ساخته شده پایتون (FLT:10) برای مرتب کردن هر سطل استفاده می کند.برای سطل هایی که کوچک هستند (معمولا 0-2)، این بسیار سریع است.

دسته بندی برای محدوده های خودسرانه

اگر اطلاعات شناور شما از محدوده ای دیگر از برخوردار باشد، می توانید ارزش ها را قبل از توزیع نرمال کنید.

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

این نسخه کلی تر است، اما نیاز به دانستن یا محاسبه دامنه دارد.این به خوبی کار می کند زمانی که توزیع داده ها تقریبا یکنواخت در آن محدوده است.

تحلیل پیچیدگی

درک هزینه محاسباتی نوع سطل برای تصمیم گیری در مورد استفاده از آن ضروری است.

پیچیدگی زمان

  • [[ویرایش] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱۰] [۱] [۱۰] [۱۰]] [۱۰] [۱۰] [۳] [۱۰] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۲] [۲] [۲] [۲] [۲] [۲] [۲] [۲] [۲] [۲] [۲] [۲] [۲] [۲] [۳] [۲] [۲] [۳]] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۲] [۲] [۳] [۳] [۲] [۲] [۲] [۲] [
  • [[ویرایش] [۱] [۱۰] [۱۰] [۱۰] [۱۰] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳]] [۳] [۳] [بر [۳] [۳] [بر [۳] [۳] [بر [۳] [۳] [بر [۳] [۳] [۳] [۳] [بر [بر [بر [و [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [و] [و [بر [بر [بر [بر [بر [بر [بر [و] [بر [بر [بر [بر [بر [بر [و] [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [بر [و]]]]]] [و] [و] [و] [و]] [بر [بر [و] [و]]]] [بر [بر [
  • [[۱] [۱۰] [[۱۰]] [[۱۰]] [[۱۰]]] [[۳]]] [۳] [۳]] [۳] [۳]] هنگامی که همه عناصر به یک سطل سقوط می کنند، این اتفاق می افتد که داده ها به طور یکنواخت توزیع نمی شوند یا هنگامی که دامنه بسیار کوچک است نسبت به تعداد عناصر.

پیچیدگی فضایی

در این میان، به |O|n+k| فضای اضافی برای سطل ها و محتویات آن نیاز دارد.

مزایا و استفاده از موارد

نوع سطل در سناریوهای خاص که فرضیات آن را نگه می دارد، می درخشد:

  • داده های شناور توزیع شده (FLT:1) - به عنوان مثال، خواندن سنسور، خروجی شبیه سازی مونت کارلو یا احتمالات عادی.
  • [[۱] [۱۰] [۱] [۱۰] [۱] [۱۰] [۱]] [۱۰] [۱] [۱] [۱۰] [۱] [۱]] [۱۰] [۱] [۱۰] [۱] [۱۰] [۱] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [به طور متوسط [برای مرتب کردن میلیون ها شناور جذاب است که در آن ها [در مقایسه [در آن ها [در مقایسه [در آن ها [در مقایسه [به اندازه ی [در مقایسه [مشرکان] کمتر کارآمد است] کارآمد است.
  • مرتب سازی غیر مستقیم - هنگامی که داده ها بر روی دیسک قرار می گیرند، سطل ها می توانند به طور مستقل پردازش شوند و برای فایل های جداگانه نوشته شوند، سپس به هم متصل شوند.
  • ]Parallel و GPU Computing [FLT 1 ] - هر سطل را می توان به طور مستقل مرتب کرد و اجازه داد که موازین عظیم را بدهد.

یکی از قدرت های قابل توجه این است که نوع سطل (FLT:0) قابل توجه است (اگر نوع چنگال ثابت باشد)، به این معنی است که نظم نسبی عناصر برابر حفظ می شود.

محدودیت ها و ملاحظات

با وجود ظرافت آن، نوع سطل دارای محدودیت های متعددی است که می تواند آن را برای مرتب سازی عمومی مناسب کند:

  • [در این باره] اگر [در برابر آیات و روایات] به [وحیّت] تقسیم شود، اکثر عناصر به چند سطل تقسیم می شوند، و هزینه های مرتب سازی شده برای O] افزایش می یابد.
  • دانش قبلی را از محدوده [FLT 1] می گیرد: بدون دانستن حداقل و حداکثر ارزش، شما نمی توانید به طور موثر ایجاد سطل.
  • [FLT: 1 ] [ [ [ [ [ ] فهرست پایتون می تواند حافظه قابل توجهی مصرف کند، به ویژه برای آرایه های بسیار بزرگ.
  • Overhead of Per-bucket مرتب سازی : مرتب کردن بسیاری از سطل های کوچک با پایتون تولید تماس های عملکردی است که می تواند به سطل های بسیار کوچک اضافه کند، یک نوع قرار دادن صریح ممکن است سریعتر باشد.

وقتی از سطل استفاده نکنید

از این رو، وقتی که داده ها به صورت یکنواخت توزیع نمی شوند، از آن جا که دامنه نسبت به تعداد عناصر بسیار زیاد است یا زمانی که حافظه به شدت محدود می شود، یک نوع مقایسه مانند (FLT:0quicksort یا heapsort [F3] انتخاب امن تر است.

مقایسه با سایر الگوریتم های مرتب سازی

نوع بات یک طاقچه منحصر به فرد در میان الگوریتم های مرتب سازی را اشغال می کند، در اینجا چگونگی مقایسه آن با گزینه های مشترک است:

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

برای اعداد شناور، اغلب فرم های رادکس را (که نیاز به دستکاری کمی از شناورها دارند) و می توانند سریعتر از O (n log n) باشند انواع مقایسه زمانی که داده ها یکنواخت است.

نکات عملی پایتون و بهینه سازی

انتخاب تعداد سطل ها

تنظیم تعداد سطل ها برابر با تعداد عناصر (k = n یک قاعده استاندارد از حجم کم کننده است که اندازه سطل متوسط و عملکرد دو درجه را افزایش می دهد؛ حافظه بیشتر سطل بدون بهبود سرعت هدر می رود.

استفاده از بازی های اکشن برای سطل های کوچک

اگر می خواهید کنترل های ریز را جایگزین کنید، جایگزین (FLT:17) با یک نوع قرار دادن سفارشی برای سطل های کوچکتر از آن، 20 عنصر:

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

این می تواند سربار را کاهش دهد زیرا پایتون (FLT 19) دارای سربار تابع و رفتار کلی هدف است که برای لیست های 0 یا 1 پر شده است.

توزیع های غیر جهانی

اگر می دانید توزیع داده یکنواخت نیست، اما هنوز هم می خواهید از نوع سطل استفاده کنید، می توانید مرزهای سطل را تطبیق دهید، به عنوان مثال، اگر داده ها از توزیع نرمال پیروی کنند، می توانید سطل های عرض نابرابر را برای تعادل بار ایجاد کنید، این نیاز به تجزیه و تحلیل قبلی از داده ها دارد و به ندرت در عمل انجام می شود.

منابع خارجی

برای مطالعه بیشتر، مرجع معتبر زیر را در نظر بگیرید:

نتیجه گیری

نوع بات یک الگوریتم ظریف و کارآمد برای مرتب کردن اعداد شناور است - به ویژه هنگامی که داده ها به طور یکنواخت توزیع شده و دامنه شناخته شده است. پیچیدگی زمان زمان خطی آن را یک ابزار ارزشمند در ابزار داده دانشمند یا مهندس ابزار به دقت استفاده می کند، با این حال حساسیت آن به توزیع ورودی و نیازهای حافظه اضافی بدان معنی است که آن را نباید به طور کور استفاده شود و درک کنید که چگونه می توانید با استفاده از انواع عملکرد کلی، به طور دقیق و مناسب با استفاده کنید.

این که آیا شما میلیون ها اندازه گیری سنسور یا عادی سازی خروجی از شبیه سازی تصادفی را مرتب می کنید، نوع سطل یک راه حل سریع، پایدار و موازی را ارائه می دهد – تا زمانی که داده های شما توسط قوانین بازی می کنند.