স্ট্রিংয়ে প্রতিটি অক্ষর বা শব্দের ফ্রিকোয়েন্সি (ঘনত্ব) গণনা করার জন্য ডিকশনারি বা অ্যারে ব্যবহার করা হয়। নিচে অক্ষর-ভিত্তিক এবং শব্দ-ভিত্তিক দুটি পদ্ধতি দেখানো হলো।
পদ্ধতি ১: অক্ষর ফ্রিকোয়েন্সি (Character Frequency) - অ্যারে ব্যবহার
ASCII অক্ষরের জন্য ২৫৬ সাইজের অ্যারে দ্রুততম।
using System;
public class CharFrequency
{
public static void Main()
{
string s = "Football!";
int maxChars = 256; // ASCII রেঞ্জ
int[] freq = new int[maxChars];
// ফ্রিকোয়েন্সি গণনা
foreach (char c in s)
{
freq[c]++;
}
// ফলাফল প্রিন্ট (শুধু যেগুলো ১টির বেশি)
Console.WriteLine("অক্ষর ফ্রিকোয়েন্সি (১টির বেশি):");
for (int i = 0; i < maxChars; i++)
{
if (freq[i] > 1)
{
Console.WriteLine($"Character '{((char)i)}' Occurrence = {freq[i]} times");
}
}
// সব অক্ষর প্রিন্ট
Console.WriteLine("\nসব অক্ষর:");
for (int i = 0; i < maxChars; i++)
{
if (freq[i] > 0)
{
Console.WriteLine($"'{((char)i)}': {freq[i]}");
}
}
}
}
আউটপুট
অক্ষর ফ্রিকোয়েন্সি (১টির বেশি):
Character 'l' Occurrence = 2 times
Character 'o' Occurrence = 2 times
সব অক্ষর:
'F': 1
'o': 2
't': 1
'b': 1
'a': 1
'l': 2
'!': 1
পদ্ধতি ২: শব্দ ফ্রিকোয়েন্সি (Word Frequency) - Dictionary ব্যবহার
using System;
using System.Collections.Generic;
using System.Linq;
public class WordFrequency
{
public static void Main()
{
string text = "the quick brown fox jumps over the lazy dog the fox";
// শব্দে ভাগ করুন (স্পেস, puntuаtion হ্যান্ডলিং সহ)
string[] words = text.Split(new[] { ' ', '\t', '\n', '\r', ',', '.', '!', '?' },
StringSplitOptions.RemoveEmptyEntries);
var freq = new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase);
foreach (string word in words)
{
if (freq.ContainsKey(word))
freq[word]++;
else
freq[word] = 1;
}
// ফ্রিকোয়েন্সি অনুযায়ী সর্ট করে প্রিন্ট
Console.WriteLine("শব্দ ফ্রিকোয়েন্সি (ঘনত্ব অনুযায়ী):");
foreach (var kvp in freq.OrderByDescending(x => x.Value))
{
Console.WriteLine($"'{kvp.Key}': {kvp.Value}");
}
}
}
আউটপুট
শব্দ ফ্রিকোয়েন্সি (ঘনত্ব অনুযায়ী):
'the': 3
'fox': 2
'quick': 1
'brown': 1
'jumps': 1
'over': 1
'lazy': 1
'dog': 1
আধুনিক LINQ পদ্ধতি (সংক্ষিপ্ত)
using System.Linq;
// অক্ষর ফ্রিকোয়েন্সি
var charFreq = text.GroupBy(c => c)
.Select(g => new { Char = g.Key, Count = g.Count() })
.OrderByDescending(x => x.Count);
// শব্দ ফ্রিকোয়েন্সি
var wordFreq = text.Split(new[] { ' ', ',', '.', '!', '?' }, StringSplitOptions.RemoveEmptyEntries)
.GroupBy(w => w, StringComparer.OrdinalIgnoreCase)
.Select(g => new { Word = g.Key, Count = g.Count() })
.OrderByDescending(x => x.Count);
ইউনিকোড সাপোর্ট (Dictionary ব্যবহার)
// ASCII ২৫৬ এর বাইরে যেতে হলে (ইউনিকোড, ইমোজি ইত্যাদি)
var freq = new Dictionary<char, int>();
foreach (char c in s)
{
if (freq.ContainsKey(c)) freq[c]++;
else freq[c] = 1;
}
পারফরম্যান্স তুলনা
| পদ্ধতি | টাইম | স্পেস | সviraলতা |
|---|---|---|---|
| int[256] অ্যারে | O(n) - দ্রুততম | O(1) - ২৫৬ ইন্ট | শুধু ASCII |
| Dictionary<char,int> | O(n) - দ্রুত | O(k) - ইউনিক চের | ইউনিকোড সাপোর্ট |
| LINQ GroupBy | O(n log n) - স্লোয়ার | O(k) | পঠনীয়, ফাংশনাল |
সারসংক্ষেপ
- ASCII অক্ষর ফ্রিকোয়েন্সি:
int[256]অ্যারে (সর্বোচ্চ দ্রুত) - ইউনিকোড/সাধারণ:
Dictionary<char, int> - শব্দ ফ্রিকোয়েন্সি:
Dictionary<string, int>+Split+ LINQ - কেস-ইনসেনসিটিভ:
StringComparer.OrdinalIgnoreCaseব্যবহার করুন