নাহলে সে হাফ-ফুফফুঁক করবে এবং আপনার বাড়িটি নীচে ফেলে দেবে!
এটি সম্পূর্ণ অপ্রাসঙ্গিক ছিল। এই চ্যালেঞ্জটি হফম্যান কোডিং সম্পর্কে । এর সংক্ষিপ্তসারটি হ'ল একটি প্রদত্ত পাঠ্যের অক্ষরের ফ্রিকোয়েন্সিটি এর প্রতিনিধিত্বকে সংক্ষিপ্ত করতে ব্যবহৃত হয়। অন্য কথায়, আসুন আমরা আমাদের বর্ণমালা এবং স্থান a
মাধ্যমে বলা যাক z
। এটি ২ 27 টি অক্ষর। তাদের প্রত্যেককে মাত্র 5 টি বিটকে অনন্যভাবে এনকোড করা যায় কারণ 5 টি বিটের 32 টি অক্ষরের জন্য পর্যাপ্ত জায়গা রয়েছে। তবে, অনেক পরিস্থিতিতে (যেমন ইংরেজি, বা সাধারণ ভাষাগুলি), কিছু চরিত্রগুলি অন্যদের চেয়ে বেশি ঘন ঘন হয়। আমরা ঘন ঘন অক্ষরগুলির জন্য কম বিট এবং কম ঘন ঘন চরিত্রগুলির জন্য আরও সম্ভবত বিট ব্যবহার করতে পারি। সম্পন্ন হয়েছে, বিটের সংখ্যায় সামগ্রিক সঞ্চয় রয়েছে এবং মূল পাঠ্যটি এখনও স্বতন্ত্রভাবে পুনর্গঠন করা যায়।
উদাহরণস্বরূপ "এই প্রশ্নটি হাফম্যান কোডিং সম্পর্কে" নেওয়া যাক। এই পাঠ্যটি 37 টি অক্ষর দীর্ঘ, যা সাধারণত 37 * 8 = 296 বিট হবে যদিও আমরা প্রতিটি অক্ষরের জন্য কেবলমাত্র 5 বিট ব্যবহার করি তবে কেবলমাত্র 37 * 5 = 185 বিট । মন যে রাখতে.
এখানে প্রতিটি চরিত্রের একটি (সার্টা) সারণি এবং পাঠ্যে তাদের ফ্রিকোয়েন্সি রয়েছে, যা বেশিরভাগ থেকে কমপক্ষে ঘন ঘন (যেখানে _ কোনও জায়গার জন্য দাঁড়িয়েছে) সাজানো হয়:
_ 5
i 4
n 3
o 3
s 3
t 3
u 3
a 2
f 2
h 2
b 1
c 1
d 1
e 1
g 1
m 1
q 1
একটি সম্পর্কিত অনুকূল কোডিং হতে পারে:
_ 101
i 011
n 1100
o 1101
s 1110
t 1111
u 001
a 10011
f 0001
h 0101
b 00000
c 00001
d 01000
e 01001
g 10000
m 10001
q 10010
এটি অবিলম্বে পরিষ্কার হওয়া উচিত যে প্রতিটি চরিত্রের জন্য কেবল 5 বিট ব্যবহার করার চেয়ে এটি আরও ভাল এনকোডিং হবে। আসুন জেনে নেওয়া যাক আরও কত ভাল, যদিও!
145 বিট , তুলনায় 185! এটি 40 বিটের সঞ্চয় বা 20% এরও বেশি! (এটি অবশ্যই ধরে নেওয়া যায় যে কাঠামো সম্পর্কে তথ্য ডিকোডিংয়ের জন্য উপলব্ধ)) এই কোডিংটি সর্বোত্তম কারণ কোনও চরিত্রের উপস্থাপনা পরিবর্তন করে কোনও বিট বাদ দেওয়া যাবে না।
কাজটি
- একটি পরামিতি সহ একটি প্রোগ্রাম বা ফাংশন লিখুন যা ...
- STDIN (বা সমতুল্য) থেকে অথবা একক যুক্তি হিসাবে ইনপুট নেয়।
- উপরের মত একটি সর্বোত্তম হাফম্যান কোডিং আউটপুট আউটপুট হিসাবে ফ্রিকোয়েন্সি অনুসারে বাছাই করা অক্ষর (একটি ফ্রিকোয়েন্সি ক্লাসের মধ্যে অর্ডার কোনও ব্যাপার না)।
- আপনি ধরে নিতে পারেন যে ইনপুটটির অক্ষরগুলি ASCII রেঞ্জের
32..126
সাথে একটি নতুন লাইন সীমাবদ্ধ । - আপনি ধরে নিতে পারেন ইনপুটটি 10,000 অক্ষরের চেয়ে বেশি নয় (আদর্শভাবে, তত্ত্ব অনুসারে, ইনপুটটি আনবাউন্ড করা উচিত)।
- আপনার কোডটি যুক্তিসঙ্গত দ্রুত শেষ করা উচিত। উপরের প্রদত্ত উদাহরণটি এক মিনিটের বেশি বেশি খারাপ হওয়া উচিত নয়। (এটি নিষ্ঠুর শক্তিকে উড়িয়ে দেওয়ার উদ্দেশ্যে করা হয়েছে।)
- স্কোরিং বাইটে রয়েছে।
উদাহরণ
x
---
x 0
xxxxxxxxx
---
x 0
xxxxxxxxy
---
x 0
y 1 (these may be swapped)
xxxxxyyyz
---
x 0
y 10
z 11
uuvvwwxxyyzz
--- (or)
u 000 000
v 001 001
w 100 010
x 101 011
y 01 10
z 11 11
this question is about huffman coding
---
101
i 011
n 1100
o 1101
s 1110
t 1111
u 001
a 10011
f 0001
h 0101
b 00000
c 00001
d 01000
e 01001
g 10000
m 10001
q 10010
শুভ কোডিং!
মনে রাখবেন যে এই অনুরূপ প্রশ্নটি নিবিড়ভাবে সম্পর্কিত, এমনকি এটি এই যে এটি একটি সদৃশ। যাইহোক, মেটার বিষয়ে এখন পর্যন্ত sensক্যমত্যটি হ'ল বয়স্ক ব্যক্তিকে এটির একটি সদৃশ হিসাবে বিবেচনা করা উচিত।
this question is about huffman coding
, আমি বিটের সংখ্যা 136 নয় 145 হিসাবে গণনা করেছি