Table of Contents
معرفی بازی Counting Type
شمارش مرتب یک الگوریتم مرتب سازی مبتنی بر غیر رابط است که وقتی اعداد را بر یک محدوده کوچک و شناخته شده تنظیم می کند، بر خلاف انواع مقایسه مانند Quicksort یا Mergesorort، که بر مقایسه عناصر جفتی تکیه می کند، شمارش مرتب سفارش را با شمارش فرکانس هر ارزش متمایزی که این رویکرد به پیچیدگی زمان می دهد، تعیین می کند که در آن، گزینه های محدود برای استفاده از آن است.
الگوریتم برای اولین بار توسط هارولد H. Seward در سال 1954 توصیف شد و یک تکنیک بنیادی در علوم کامپیوتر باقی مانده است. سادگی و کارایی آن را برای وظایف مانند مرتب کردن سن دانش آموز، نمرات یا هر گونه داده صحیح با یک گسترش کوچک ایده آل می کند.با استفاده از ذخیره سازی کمکی متناسب با محدوده، شمارش مرتب اجتناب از O (n log n) مقایسه محدود، دستیابی به زمان (O) است که در آن مقدار ورودی + k است.
چگونه شمارش انواع کارها
مکانیسم اصلی شمارش مرتب ساده است: به نظر می رسد که چقدر هر مقدار در آرایه ورودی ظاهر می شود، سپس از آن شمارش برای محاسبه موقعیت نهایی هر عنصر استفاده می کند.
- [FLT 1:1] ایجاد یک آرایه شمارش از اندازه k (محدود مقادیر ورودی)، به صفر تبدیل شده است.
- پیشوندهای مقایسه: آرایه شمارش را به یک آرایه پیشوند تبدیل کنید، که در آن هر عنصر در شاخص من شمارش تجمعی عناصر کمتر یا برابر با من را دارد.این مرحله تعیین موقعیت های شروع برای هر مقدار متمایز در خروجی مرتب.
- عناصر پرلاک: آرایه ورودی از سمت راست به چپ (برای ثبات)، استفاده از آرایه شمارش برای پیدا کردن شاخص صحیح در آرایه خروجی، عنصر در آن قرار دهید و شمارش نهایی یک کپی از ورودی است.
الگوریتم یک آرایه جدید را باز می گرداند و نسخه اصلی را بدون تغییر رها می کند.(FLT:0) در محل شمارش مرتب وجود دارد، اما به ندرت استفاده می شود زیرا ثبات یا بهره وری فضا را به خطر می اندازد.
مثال گام به گام
در نظر بگیرید که در آن، به صورت زیر به صورت زیر به صورت زیر به صورت زیر به صورت زیر به صورت زیر به صورت زیر به صورت زیر به صورت زیر تقسیم می شود.
- اندازه آرایه 9 (0-8) [0،1,2,1,2,1,0,0,1]. (Index 1 به نظر می رسد یک بار، شاخص 2 دو بار، شاخص 3 دوبار، شاخص 4 بار، شاخص 8 بار.)
- مبالغی را پیش از تثبیت: تبدیل به تجمع [0,1,3,5,6,6,6,6,7] در حال حاضر هر مقدار به ما می گوید موقعیت شروع برای آن عدد در خروجی مرتب.
- خروجی: آرایه اصلی تر معکوس از پایان: عنصر اول خوانده شده 1 - موقعیت = [۱] - ۱ = 0 → خروجی [۱] = ۱) = شمارش کسر[۱] [۱] تا ۰، ۳ → موقعیت = ۱ = ۴ {\displaystyle3،=====-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
این مثال نشان می دهد که چگونه شمارش مرتب از مقایسه ها به طور کامل اجتناب می کند و تنها به عملیات محاسباتی متکی است.
پیچیدگی محاسباتی
پیچیدگی زمان
- [بهترین، متوسط و بدترین مورد: O(n + k)، که در آن n تعداد عناصر و k دامنه مقادیر ورودی است.
- Comparison برای مقایسه انواع: Quicksorort و Mergesorort دارای O(n log n) پیچیدگی متوسط است. برای n = 106 و k = 1000، شمارش مرتب (کمتر از 1،0010.000 عملیات) حدود 13 برابر سریعتر از یک نوع O(n log n) معمولی است.
پیچیدگی فضایی
- هزینه: O [k] برای آرایه شمارش، به علاوه O(n] برای آرایه خروجی، این سربار حافظه می تواند ممنوع اگر k بزرگ (به عنوان مثال، مرتب 32 بیتی صحیح که k = 232).
- نوع قابل انکار: نیاز به یک آرایه خروجی کمکی از اندازه n؛ در مکان جایگزین ثبات قربانی و یا استفاده از دستکاری شاخص پیچیده است.
هنگام استفاده از دسته بندی شمارش
شمارش مرتب در شرایط زیر موثر است:
- ورودی شامل اعداد صحیح (یا داده هایی که می توانند به یک محدوده کوچک صحیح مانند شخصیت ها یا دسته های مجزا نقشه برداری شوند) است.
- محدوده k به طور قابل توجهی بزرگتر از n نیست، یک قاعده مشترک از انگشت شست k ≤ O (n) است.
- حافظه به شدت محدود نمی شود، زیرا آرایه شمارش و بافر خروجی نیاز به فضای اضافی دارد.
- ثبات لازم است (به عنوان مثال، مرتب سازی توسط چندین کلید) پیاده سازی استاندارد زمانی پایدار است که عناصر از سمت راست به چپ قرار می گیرند.
موارد استفاده عالی شامل نمرات مرتب (0-100)، سنین (0 تا 120)، دسته های محصول (تا چند صد SKUs)، و یا به عنوان یک زیر روتین در رادیکس مرتب .
محدودیت ها و ملاحظات
علی رغم سرعت آن، شمارش کننده گان دارای مشکلاتی است که قابلیت کاربرد آن را محدود می کند:
- [در این باره] تنها [به طور مستقیم نمی تواند اعداد یا رشته های شناور را به طور مستقیم مرتب کند مگر اینکه به یک عدد صحیح تبدیل شوند.
- محدوده: اگر کوتوله های n - به عنوان مثال، با اندازه گیری 100 عدد با مقادیر بین 1 تا 107 - آرایه شمارش حافظه عظیم مصرف می کند در حالی که فقط چند عنصر را مرتب می کند.
- غیر انطباق: دسته بندی شمارش همیشه نیاز به اسکن کل ورودی و ساخت آرایه شمارش، حتی اگر داده ها در حال حاضر مرتب شده یا تقریبا مرتب شده است.
- مقادیر عددی استاندارد فرض می کند اعداد صحیح غیر منفی، برای رسیدگی به منفی، شما می توانید مقادیر را با کم کردن حداقل (ساخت محدوده 0 به حداکثر - من).
این محدودیت ها به معنای شمارش مرتب یک ابزار تخصصی است، نه جایگزینی جهانی برای الگوریتم های عمومی.
مقایسه با الگوریتم های متنوع سازی مرتبط
شمارش دسته در مقابل رای گیری
راکس مرتب ایده را با مرتب کردن اعداد از حداقل قابل توجه ترین گسترش می دهد، با استفاده از یک نوع پایدار (اغلب شمارش مرتب) در هر رقم، در حالی که شمارش مرتب بر روی یک پاس از محدوده کامل k کار می کند، رایکس چندین عبور از محدوده کوچکتر (به عنوان مثال، پایه 256)، کاهش استفاده از حافظه برای شمارش بزرگ، به عنوان مثال، به طور منظم 32 بیتی تنها نیاز به یک عدد صحیح دارد.
شمارش دسته در مقابل.چگون
به طور جداگانه، گروه های جمع آوری عناصر را به تعدادی از سطل ها و انواع هر سطل تقسیم می کنند (اغلب با نوع وارد کننده) شمارش مرتب می تواند به عنوان یک مورد خاص از دسته بندی های باچ که در آن هر سطل با یک ارزش جداگانه مطابقت دارد، به خوبی در داده های یکپارچه توزیع شده کار می کند، اما شمارش مرتب محدود به دامنه های صحیح است.
پیاده سازی یک دسته بندی پایدار شمارش
ثبات زمانی مهم است که یک کلید را مرتب کنید در حالی که حفظ نظم نسبی عناصر برابر از کلید دیگر مهم است. الگوریتم استاندارد شمارش مرتب به طور ذاتی پایدار است زمانی که حلقه قرار دادن خروجی از سمت راست به سمت چپ ورودی عبور می کند.در اینجا یک طرح متنی از نوع پایدار است:
- آرایه شمارش دقیق همانطور که شرح داده شده است.
- تبدیل به مبالغ پیشوند (موقعیت هر ارزش در خروجی مرتب شده)
- آرایه ورودی را به ترتیب معکوس تنظیم کنید.برای هر عنصر، آن را در موقعیت نشان داده شده توسط شمارش آن قرار دهید، سپس تخریب که شمارش می شود.
از آنجا که ما عناصر را از پایان پردازش می کنیم، آخرین اتفاق یک ارزش معین به بالاترین شاخص ممکن می رود، حفظ نظم نسبی این نسخه پایدار برای رایکس برای عملکرد صحیح در هر رقمی ضروری است.
برنامه های کاربردی عملی
- سیستم های تحصیلات تکمیلی: صدها نمره امتحان (range 0-100) در زمان O(n) را مرتب می کند.
- مرتب کردن اعداد صحیح خواندن و یا فرکانس های DNA kmer هنگامی که اندازه الفبا کوچک است (A، C، G، T).
- نگهداری شاخص داده ها: ، مرتب کردن شناسه های صحیح منحصر به فرد در محدوده به اندازه کافی کوچک برای قرار دادن در حافظه.
- پردازش حجم: مرتب کردن سطل های هیستوگرام یا رنگ intensities (0- 255] هنگام ساخت جداول نگاه.
- تغییر در کلید ثانویه: در داخل رایکس استفاده می شود، که اسب کار برای مرتب سازی کارآمد در بسیاری از کتابخانه ها و زبان ها (به عنوان مثال، اداره کننده .NET از ترکیبی سازگار از الگوریتم ها از جمله شمارش مرتب برای محدوده های کوچک استفاده می کند.
برای بیشتر در تئوری و انواع، مشورت با مراجع معتبر مانند وکیپزیت: شمارش مرتب و Geeks forGeeks: Counting مرتب مقایسه عملی با الگوریتم های دیگر می تواند در Brilliant شمارش مقاله [F مرتب سازی:5:5:5] یافت.
بهینه سازی دسته بندی برای محدوده های بزرگ
هنگامی که k بزرگ است، اما n نیز بزرگ است، دسته شمارش خالص به حافظه فشرده می شود.
- کمپرسی فشرده: استفاده از یک نقشه هش به جای یک آرایه فشرده زمانی که دامنه ارزش های استفاده بزرگ است، اما تعداد مقادیر متمایز کوچک است.این معامله شاخص زمان ثابت برای هش کردن سربار اما کاهش مصرف حافظه.
- [FLT: 1] روش های فشرده: [FLT 1] ترکیب شمارش با الگوریتم های دیگر، به عنوان مثال، اگر دامنه بیش از 106، استفاده از راکیکس با یک پایه است که محدوده های کوچک نگه می دارد.
- انواع مختلف در محل: برخی از بهینه سازی ها فضای اضافی را بدون آرایه خروجی کاهش می دهند، اما به طور کلی ثبات را قربانی می کنند یا نیاز به چرخه برای پیدا کردن موقعیت دارند.
نتیجه گیری
شمارش مرتب به عنوان یک الگوریتم کارآمد قابل ملاحظه برای مرتب کردن اعداد صحیح تعریف می کند (هنگامی که محدوده ارزش نسبت به تعداد عناصر کوچک است)، پیچیدگی زمان O(n + k) و عملکرد خطی آن را در سناریوهایی مانند مرتب سازی کلاس، مرتب سازی زیر روتین ها و برنامه های با کلید های صحیح محدود ضروری است.