جب آپکا طریقہ کار بہت بڑا ہوتا ہے چھوٹے انگرس کا عدد — جیسے ڈگری، عمر یا پھر اس سے متعلقہ کوڈ — کلاسیکی موازنہ پر مبنی الجبرا جیسے جلدی شور یا میرج سائیڈ کی طرح محسوس کر سکتے ہیں. یہ یقینی مقداریں او(ن لاگ n) وقت میں دوڑنے کے قابل ہوتے ہیں، لیکن اگر ممکنہ مقداریں محدود ہیں تو آپ ترتیب وار اوور(ن لاگ) کے ساتھ ترتیب دے سکتے ہیں [Tools/Tools]]] مگر یہ آپ دونوں کا موازنہ کر سکتے ہیں
کام کے حساب سے کیا مُراد ہے ؟
اس سے حاصل ہونے والے ذرات کو اس بات کا اندازہ ہوتا ہے کہ انتہائی معمولی مقدار میں موجود انفنٹریز (fLT:0] سے بنے ہوتے ہیں ۔
بنیادی مقاصد : درست دوبارہ تعمیر
شمارندی طرز کا سب سے آسان نسخہ دو سیر میں کام کرتا ہے:
- رقبہ فریکوئنسی – Incent struction کے ذریعے اور ہر قیمت کے لیے ایک مقابلہ آپ دیکھ سکتے ہیں.
- اتارنے کی صلاحیت – کرنٹ کے ذریعے چلنے والا ایک چھوٹا سے بڑے سے بڑے قطروں سے گزرتا ہے اور ہر قیمت کے لیے اسے اپنی گنتی کے لحاظ سے بہت بار ان پٹ میں شامل کر کے دوبارہ شامل کر لیتا ہے۔
یہ تقسیمی پیداوار کرتا ہے لیکن نہیں [1] [1] کوئي متعلقہ ترتیب محفوظ رکھیں (سي طور پر قائم نہیں ہے).
اسٹیبل وریبات: Comulative countys -
نظام کو مستحکم بنانے کے لیے ہم ایک تیسرے دور کو شامل کرتے ہیں:
- پہلے کی طرح نمبر فریکوکینس۔
- [ فٹنوٹ : ۲۰ ]
- اِس کے بعد کے اجزا کو واپس موڑ کر اُس کے گرد رکھ دیں ( پچھلے عناصر سے شروع تک ) ۔
کیونکہ ہم پیچھے چلتے ہیں، برابر عناصر کی ترتیب محفوظ ہے. خروج کی فضاء ان پٹ سے الگ ہے، اس طرح یہ نسخہ برآمد کے لیے O(n) اضافی جگہ استعمال کرتا ہے جبکہ بنیادی نسخہ ان پٹ پر درج کرنے سے اس طرح میں موجود ہو سکتا ہے۔
سی# میں شمار کرنے کا طریقہ
نیچے دو سی# عمل آوری: بنیادی طور پر بنیادی نسخے (جس میں استحکام ضروری ہو) اور وہ پائیدار نسخہ جو کسی معاون (Ad مدد) کو استعمال کرتا ہو، دونوں کو آگے کی طرف سے سب سے زیادہ قیمت معلوم کرنا پڑتی ہے۔
بنیادی (Non ⁇ stable) قسم کا حساب دینا
یہ ایک غیرمعمولی پیداوار کے بغیر براہِراست مختلف قسم کے داخلی نظام رکھتا ہے ۔
public static void CountingSortBasic(int[] array, int maxValue)
{
int[] counts = new int[maxValue + 1];
// Count each element's frequency
for (int i = 0; i < array.Length; i++)
{
counts[array[i]]++;
}
// Overwrite the original array in sorted order
int index = 0;
for (int value = 0; value <= maxValue; value++)
{
while (counts[value]-- > 0)
{
array[index++] = value;
}
}
}
معیاروں کے حساب
اسکے علاوہ ، یہ بہت اہم ہے کہ ہم اپنے نصبالعین کو درست طور پر مرتب کرنے کیلئے بھی استعمال کریں ۔
public static int[] CountingSortStable(int[] array, int maxValue)
{
int[] counts = new int[maxValue + 1];
int[] output = new int[array.Length];
// Step 1: Count occurrences
foreach (int num in array)
{
counts[num]++;
}
// Step 2: Transform counts to cumulative counts
for (int i = 1; i <= maxValue; i++)
{
counts[i] += counts[i - 1];
}
// Step 3: Build the output array (iterate input in reverse for stability)
for (int i = array.Length - 1; i >= 0; i--)
{
int value = array[i];
output[counts[value] - 1] = value;
counts[value]--;
}
return output;
}
دونوں عمل میں سب سے بڑا انفنٹری ہے جو صف میں ظاہر ہوتا ہے اگر سچن زیادہ معلوم نہیں ہوتا تو آپ اسے پریفیکچر (O((n)) سے شمار کرسکتے ہیں ۔
پیچیدہ تجزیہ
[1] [1] عناصر اور ]]] = Max – Min + 1 (ایک ممکنہ اقدار کا قطر)۔
- وقت: حساب (conking) [n + K]] [FLT]. . [foming field. . [n].]. Congoding field O(n), k), Crething on(n), line line line), linestrict plans lines lines on), plans past on (Tran), on), on on), on linestric), linestric), on (Thiman), on), on, lines liness on), on,
- بنیادی نسخہ شمارندی جلدوں کے لیے o(k) اضافی جگہ استعمال کرتا ہے. اس مستحکم نسخہ میں O(n + k) بھی استعمال ہوتا ہے کیونکہ یہ برآمدی قطروں کو بھی تقسیم کرتا ہے یہ شمارندی نظام کو بناتا ہے جب حدیث کی تعداد بڑی ہو۔
- دیگر اقسام کے ساتھ Commonssion: Constitous profiles fomport as futwort and Merge Surt surt follows ital v(مثلاً، K <؛ 10000 اور N >؛ حسابِ ابجد کے حساب سے حجم کے بڑے بڑے احکامات ہو سکتے ہیں۔
مختلف چیزوں اور وسیعوعریض چیزوں
منفی احساسات کو ختم کرنا
مثلاً حسابکتاب کے حساب سے حسابکتاب کے حساب سے غیر متعین کرنے کے لئے منفی اقدار کو پورا کرنا اور تمام تر حد تک کم سے کم فاصلہ طے کرنا ۔ اگر اعدادوشمار −1000 سے لے کر 1000 تک تک ہر عنصر کو دوبارہ شامل کِیا جائے تو اس کے بعد حساب لگایا جا سکتا ہے ۔
public static int[] CountingSortWithNegative(int[] array)
{
if (array.Length == 0) return array;
int min = array.Min();
int max = array.Max();
int range = max - min + 1;
int[] counts = new int[range];
int[] output = new int[array.Length];
foreach (int num in array)
counts[num - min]++;
for (int i = 1; i < range; i++)
counts[i] += counts[i - 1];
for (int i = array.Length - 1; i >= 0; i--)
{
int value = array[i];
output[counts[value - min] - 1] = value;
counts[value - min]--;
}
return output;
}
نقشکاری کرنا
شمارندی طرز کے حساب سے intger کلیدوں کی ضرورت ہوتی ہے۔اگر آپ کے اعداد و شمار انصناف (bytes) پر مشتمل ہوں جن کو انگرس میں ڈالا جا سکتا ہے تو آپ اس کا اطلاق بھی کر سکتے ہیں۔ بڑے عناصر کے لیے آپ ایک انٹریگر کلید اور اس کی شکل میں استعمال کر سکتے ہیں— بالکل اسی طرح
ریڈیکس کا رابطہ
ریڈیکس قسم کے نظامات انفرادی طور پر (یا بٹ) ہوتے ہیں اور شمارندے کو شمار کرنے کا طریقہ یہ ہوتا ہے کہ ہر گزربسر کے لیے جب بنیاد (مثلاً 10 یا 256) چھوٹے ہوں ۔
سی# میں عملی معاملات پر غور کریں
یادداشت کی خطرناک اور بڑی قِسم
سب سے بڑی کمیت (انگریزی: ] [n][FLT]] کی جمع ایک عددی مقدار ہے جو دستیاب میموری سے کہیں بڑے پیمانے پر وسیع ہے. مثلا 1000 عناصر کے ساتھ فضاء میں استعمال کرنا.
پیرالزم اور سپن<؛ ٹی>؛
بہت بڑے قطروں کے لیے آپ شماروں کو آپس میں بانٹ کر ترتیب سکتے ہیں ہر دھاگے کو نجی شکل میں شمار کر کے اس کے ٹکڑوں کو ایک دوسرے سے ملا سکتے ہیں اور پھر جزوی نتائج کو بھی استعمال کرتے ہیں اور کے لیے حساب سے حساب کم کر سکتے ہیں۔
مقدمات
- Empty settlection – فوری طور پر واپس آنا.
- سنگل عناصر – طرز تعمیر بہت معمولی ہے۔
- تمام مساوی اقدار – کاؤنٹیوں کے پاس ایک غیر منافع بخش داخلی داخلی عمل ہے؛
- Large settlement لیکن settlection data[1] – شمارندی انداز (fLT:1]) بن جاتا ہے کیونکہ زیادہ تر شمارندی ہندسے صفر ہوتے ہیں. ایک ہیش پر مبنی شمارندی انداز یا Bucket Provice پر غور کریں.
پیشگی تجاویز
شمارندے کی قسم استعمال کریں جب آپ جانتے ہیں کہ ان پٹ انگرجروں کو چھوٹے سے چھوٹے حصے میں گرتا ہے (مثلاً 0–100, عمر 0–120, یا غلطی کوڈ 0–255)۔ بڑے پیمانے کے لیے، ریڈیکس کینگ یا ایک ایسے ہیبر کا جائزہ لیں جو ہائی زے کے لیے تیز رفتار کی طرف گر جاتا ہے۔
( ا ) ہمیں کن باتوں کو مدِنظر رکھنا چاہئے ؟
| Situation | Recommendation |
|---|---|
| Small integer range (k ~ n) | Excellent choice – linear time, simple code. |
| Large integer range (k >> n) | Avoid – memory waste and O(k) overhead. |
| Need stability | Use the stable variant (cumulative counts). |
| Strings or objects | Consider Radix Sort or a comparison sort. |
| Extremely large datasets | Counting Sort can be parallelized; but watch memory. |
کھیلکود اور پرفارمنس
ایک عام بونڈ میں جس میں n = 1,000,000 اور K = 1000،000، شمارندی طرز تعمیر کا سلسلہ تقریباً 20–30% میں پورا ہوتا ہے (جس میں استعمال ہوتا ہے انٹریس کی کمی کے طور پر.
n = 1,000,000 | k = 1,000
Array.Sort (QuickSort variant) : 68 ms
CountingSortBasic : 12 ms
CountingSortStable : 18 ms
جب یہ فضا ۰۰۰، ۱۰ تک بڑھ جاتی ہے تو شمارشُدہ قسم کی تعداد میں کمی واقع ہوتی ہے لیکن قاتل تنگوغریب ہوتی ہے ۔
کُنَّا
شمارندی نظام (انگریزی: number) ایک نہایت سادہ الجبرا ہے جو جب ڈیٹا روک ٹوکوں پر لگے گا تو اس کے دباؤ کو حل کرتا ہے. C# Develers بڑی حد تک چھوٹی چھوٹی چھوٹی چھوٹی چھوٹی چھوٹی باتوں سے نمٹنے والے کے لیے، یہ ایک قیمتی اوزار ہے جو بظاہر کم اور نا معلوم ہوتا ہے،
مزید پڑھنے کے لیے ویکیپیڈیا کے مضمون کو شمار کرنے کے بارے میں، ، ، پر موٹروے ڈویزن پر، اور سے ایک عملی ہدایت [FLT:Gekksfos Gekeks[5:]. [5].