পার্ল, 2 · 70525 + 326508 = 467558
predictor
$m=($u=1<<32)-1;open B,B;@e=unpack"C*",join"",<B>;$e=2903392593;sub u{int($_[0]+($_[1]-$_[0])*pop)}sub o{$m&(pop()<<8)+pop}sub g{($h,%m,@b,$s,$E)=@_;if($d eq$h){($l,$u)=(u($l,$u,$L),u($l,$u,$U));$u=o(256,$u-1),$l=o($l),$e=o(shift@e,$e)until($l^($u-1))>>24}$M{"@c"}{$h}++-++$C{"@c"}-pop@c for@p=($h,@c=@p);@p=@p[0..19]if@p>20;@c=@p;for(@p,$L=0){$c="@c";last if" "ne pop@c and@c<2 and$E>99;$m{$_}+=$M{$c}{$_}/$C{$c}for sort keys%{$M{$c}};$E+=$C{$c}}$s>5.393*$m{$_}or($s+=$m{$_},push@b,$_)for sort{$m{$b}<=>$m{$a}}sort keys%m;$e>=u($l,$u,$U=$L+$m{$_}/$s)?$L=$U:return$d=$_ for sort@b}
এই প্রোগ্রামটি চালানোর জন্য আপনার এখানে এই ফাইলটি দরকার যা নামকরণ করা উচিত B
। ( উপরের অক্ষরের দ্বিতীয় উদাহরণে আপনি এই ফাইলের নামটি পরিবর্তন করতে পারেন B
)) কীভাবে এই ফাইলটি তৈরি করা যায় তার জন্য নীচে দেখুন।
প্রোগ্রামটি মার্কভ মডেলের সংমিশ্রণটি মূলত ব্যবহারকারীর 6999 এর উত্তর অনুসারে ব্যবহার করে তবে কয়েকটি ছোট পরিবর্তন করে। এটি পরবর্তী চরিত্রের জন্য বিতরণ তৈরি করে । আমরা কোনও ত্রুটি গ্রহণ করবেন কিনা বা B
এনকোডিং ইঙ্গিতগুলিতে সঞ্চয়স্থানের বিটগুলি ব্যয় করতে হবে কিনা তা সিদ্ধান্ত নিতে তথ্য তত্ত্ব ব্যবহার করি (এবং যদি তা হয় তবে কীভাবে)। আমরা মডেল থেকে ভগ্নাংশ বিটগুলি সর্বোত্তমভাবে সঞ্চয় করতে গাণিতিক কোডিং ব্যবহার করি ।
প্রোগ্রামটি 582 বাইট দীর্ঘ (একটি অপ্রয়োজনীয় চূড়ান্ত নিউলাইন সহ) এবং বাইনারি ফাইলটি B
69942 বাইট দীর্ঘ, তাই একাধিক ফাইলগুলি স্কোর করার নিয়ম অনুসারে আমরা L
582 + 69942 + 1 = 70525 হিসাবে স্কোর করি ।
প্রোগ্রামটি প্রায় অবশ্যই একটি 64-বিট (লিটল এন্ডিয়ান?) আর্কিটেকচারের প্রয়োজন। m5.large
অ্যামাজন ইসি 2 তে একটি দৃষ্টান্ত চালাতে প্রায় 2.5 মিনিট সময় নেয় ।
পরীক্ষার কোড
# Golfed submission
require "submission.pl";
use strict; use warnings; use autodie;
# Scoring length of multiple files adds 1 penalty
my $length = (-s "submission.pl") + (-s "B") + 1;
# Read input
open my $IN, "<", "whale2.txt";
my $input = do { local $/; <$IN> };
# Run test harness
my $errors = 0;
for my $i ( 0 .. length($input)-2 ) {
my $current = substr $input, $i, 1;
my $decoded = g( $current );
my $correct = substr $input, $i+1, 1;
my $error_here = 0 + ($correct ne $decoded);
$errors += $error_here;
}
# Output score
my $score = 2 * $length + $errors;
print <<EOF;
length $length
errors $errors
score $score
EOF
পরীক্ষার জোতা ফাইলটি জমা দেওয়ার অনুমান করে submission.pl
তবে এটি সহজেই দ্বিতীয় লাইনে পরিবর্তন করা যায়।
পাঠ্য তুলনা
"And did none of ye see it before?" cried Ahab, hailing the perched men all around him.\\"I saw him almost that same instant, sir, that Captain
"And wid note of te fee bt seaore cried Ahab, aasling the turshed aen inl atound him. \"' daw him wsoost thot some instant, wer, that Saptain
"And _id no_e of _e _ee _t _e_ore__ cried Ahab, _a_ling the __r_hed _en __l a_ound him._\"_ _aw him ___ost th_t s_me instant, __r, that _aptain
Ahab did, and I cried out," said Tashtego.\\"Not the same instant; not the same--no, the doubloon is mine, Fate reserved the doubloon for me. I
Ahab aid ind I woued tut, said tashtego, \"No, the same instant, tot the same -tow nhe woubloon ws mane. alte ieserved the seubloon ior te, I
Ahab _id_ _nd I ___ed _ut,_ said _ashtego__\"No_ the same instant_ _ot the same_-_o_ _he _oubloon _s m_ne_ __te _eserved the __ubloon _or _e_ I
only; none of ye could have raised the White Whale first. There she blows!--there she blows!--there she blows! There again!--there again!" he cr
gnly towe of ye sould have tersed the shite Whale aisst Ihere ihe blows! -there she blows! -there she blows! Ahere arains -mhere again! ce cr
_nly_ _o_e of ye _ould have ___sed the _hite Whale _i_st_ _here _he blows!_-there she blows!_-there she blows! _here a_ain__-_here again!_ _e cr
এই নমুনা ( অন্য উত্তরে নির্বাচিত ) পাঠ্যের পরিবর্তে দেরীতে দেখা দেয়, সুতরাং মডেলটি এই বিন্দু দ্বারা বেশ উন্নত। মনে রাখবেন যে মডেলটি "ইঙ্গিতগুলি" এর 70 কিলোবাইট দ্বারা বাড়ানো হয়েছে যা অক্ষরগুলি অনুমান করতে সরাসরি সহায়তা করে; এটি কেবল উপরের কোডের সংক্ষিপ্ত স্নিপেট দ্বারা চালিত নয়।
উত্সাহ জেনারেট করা হচ্ছে
নিম্নলিখিত প্রোগ্রামটি উপরের সঠিক জমা কোড গ্রহণ করে (স্ট্যান্ডার্ড ইনপুটটিতে) এবং B
উপরের সঠিক ফাইলটি তৈরি করে (স্ট্যান্ডার্ড আউটপুটে):
@S=split"",join"",<>;eval join"",@S[0..15,64..122],'open W,"whale2.txt";($n,@W)=split"",join"",<W>;for$X(0..@W){($h,$n,%m,@b,$s,$E)=($n,$W[$X]);',@S[256..338],'U=0)',@S[343..522],'for(sort@b){$U=($L=$U)+$m{$_}/$s;if($_ eq$n)',@S[160..195],'X<128||print(pack C,$l>>24),',@S[195..217,235..255],'}}'
এটি অনুরূপ গণনা সম্পাদন করার সাথে সাথে সাবমিশনটি চালাতে প্রায় দীর্ঘ সময় নেয়।
ব্যাখ্যা
এই বিভাগে, আমরা এই সমাধানটি পর্যাপ্ত বিশদে কীভাবে বর্ণনা করে যা আপনি নিজে "বাড়িতে এটি চেষ্টা" করতে পারতেন তা বর্ণনা করার চেষ্টা করব। এই উত্তরটি অন্যগুলির থেকে পৃথক করার মূল কৌশলটি "রিওয়াইন্ড" প্রক্রিয়া হিসাবে কয়েকটি বিভাগ নীচে রয়েছে তবে সেখানে পৌঁছানোর আগে আমাদের বেসিকগুলি সেট আপ করতে হবে।
মডেল
সমাধানের মূল উপাদানটি একটি ভাষা মডেল। আমাদের উদ্দেশ্যগুলির জন্য, একটি মডেল এমন এক জিনিস যা কিছুটা ইংরাজির পাঠ্য নেয় এবং পরবর্তী অক্ষরটিতে সম্ভাব্য বন্টন প্রদান করে। আমরা যখন মডেলটি ব্যবহার করব, ইংরেজী পাঠ্যটি মবি ডিকের কিছু (সঠিক) উপসর্গ হবে। দয়া করে নোট করুন যে কাঙ্ক্ষিত আউটপুটটি একটি বিতরণ এবং কেবলমাত্র সম্ভবত সম্ভাব্য চরিত্রের জন্য একক অনুমান নয়।
আমাদের ক্ষেত্রে, আমরা মূলত এই উত্তরটিতে মডেলটি ব্যবহারকারীর মাধ্যমে 69999 ব্যবহার করি । আমরা আন্ডারস ক্যাসেরগের সর্বাধিক স্কোরিং উত্তর (আমাদের নিজস্ব ছাড়া অন্য) থেকে মডেলটি ব্যবহার করিনি কারণ আমরা একক সেরা অনুমানের চেয়ে কোনও বিতরণ বের করতে পারিনি। তত্ত্বের ক্ষেত্রে, এই উত্তরটি একটি ওজনযুক্ত জ্যামিতিক গড়কে গণনা করে, তবে আমরা যখন এটি খুব আক্ষরিক অর্থে ব্যাখ্যা করি তখন আমরা কিছুটা দুর্বল ফলাফল পেয়েছিলাম। আমরা অন্য উত্তর থেকে একটি মডেল "চুরি" করেছি কারণ আমাদের "সিক্রেট সস" মডেল নয় বরং সামগ্রিক পদ্ধতির। কারও কাছে যদি "আরও ভাল" মডেল থাকে, তবে তাদের আমাদের বাকি প্রযুক্তি ব্যবহার করে আরও ভাল ফলাফল করতে সক্ষম হওয়া উচিত।
একটি মন্তব্য হিসাবে, বেশিরভাগ সংক্ষেপণ পদ্ধতি যেমন লেম্পেল-জিভকে এইভাবে একটি "ভাষার মডেল" হিসাবে দেখা যায়, যদিও এতে কিছুটা হলেও স্ক্রিন্ট হতে পারে। (এটি কোনও বারো-হুইলারের রূপান্তরকারী কোনও কিছুর জন্য বিশেষত জটিল!) এছাড়াও, উল্লেখ্য যে ব্যবহারকারী 2699-এর মডেলটি একটি মার্কভ মডেলের একটি পরিবর্তন; মূলত অন্য কিছু কিছুই এই চ্যালেঞ্জের জন্য বা এমনকি সাধারণভাবে এমনকি মডেলিং পাঠ্যের পক্ষে প্রতিযোগিতামূলক নয়।
সামগ্রিক স্থাপত্য
বোঝার উদ্দেশ্যে, সামগ্রিক আর্কিটেকচারটি কয়েকটি টুকরো টুকরো টুকরো করা ভাল। সর্বোচ্চ-স্তরের দৃষ্টিকোণ থেকে, রাষ্ট্র পরিচালনার কোডের কিছুটা দরকার। এটি বিশেষ আকর্ষণীয় নয়, তবে সম্পূর্ণতার জন্য আমরা জোর দিয়ে বলতে চাই যে প্রতিটি পর্যায়ে প্রোগ্রামটি পরবর্তী অনুমানের জন্য জিজ্ঞাসা করা হয়, এটি এটি মবি ডিকের একটি সঠিক উপসর্গ উপলব্ধ করেছে। আমরা আমাদের অতীতের ভুল অনুমানগুলি কোনওভাবেই ব্যবহার করি না। দক্ষতার জন্য, ভাষা মডেল সম্ভবত প্রথম এন অক্ষর থেকে তার রাষ্ট্রটিকে প্রথম (এন + 1) অক্ষরের জন্য তার রাজ্যটি গণনা করতে পুনরায় ব্যবহার করতে পারে, তবে নীতিগতভাবে, এটি প্রতিবার যখনই অনুরোধ করা হয় তখন স্ক্র্যাচ থেকে জিনিসগুলি পুনরুদ্ধার করতে পারে।
আসুন প্রোগ্রামটির এই বেসিক "ড্রাইভার" কে আলাদা করে রেখে সেই অংশের মধ্যে উঁকি দেওয়া যাক যা পরবর্তী চরিত্রটি অনুমান করে। এটি ধারণাগতভাবে তিনটি অংশ পৃথক করতে সহায়তা করে: ভাষার মডেল (উপরে আলোচনা করা হয়েছে), একটি "ইঙ্গিত" ফাইল এবং একটি "দোভাষী"। প্রতিটি পদক্ষেপে, দোভাষী পরবর্তী চরিত্রের জন্য একটি বিতরণের জন্য ভাষা মডেলকে জিজ্ঞাসা করবেন এবং সম্ভবত ইঙ্গিতগুলি ফাইল থেকে কিছু তথ্য পড়বেন। তারপরে এটি এই অনুচ্ছেদগুলিকে অনুমানের সাথে একত্রিত করবে। ইঙ্গিত ফাইলে কী তথ্য রয়েছে পাশাপাশি কীভাবে এটি ব্যবহৃত হয় তাও পরে ব্যাখ্যা করা হবে তবে আপাতত এটি এই অংশগুলি মানসিকভাবে পৃথক রাখতে সহায়তা করে। নোট করুন যে প্রয়োগ অনুসারে, ইঙ্গিতগুলি ফাইলটি আক্ষরিক অর্থে একটি পৃথক (বাইনারি) ফাইল তবে এটি কোনও স্ট্রিং বা প্রোগ্রামের অভ্যন্তরে সঞ্চিত কিছু হতে পারে। আনুমানিক হিসাবে,
যদি এই উত্তর হিসাবে কোনও স্ট্যান্ডার্ড সংকোচনের পদ্ধতি যেমন bzip2 ব্যবহার করে থাকে তবে "ইঙ্গিতগুলি" ফাইলটি সংকোচিত ফাইলের সাথে মিলে যায়। "দোভাষী" ডিকম্প্রেসারের সাথে সম্পর্কিত, যখন "ভাষার মডেল" কিছুটা অন্তর্নিহিত (উপরে বর্ণিত হিসাবে)।
কেন একটি ইঙ্গিত ফাইল ব্যবহার করবেন?
আরও বিশ্লেষণ করার জন্য একটি সাধারণ উদাহরণ বেছে নেওয়া যাক। মনে করুন যে পাঠ্যটি N
অক্ষরগুলি দীর্ঘ এবং একটি মডেলের দ্বারা সান্নিধ্যযুক্ত যেখানে প্রতিটি অক্ষর (স্বতন্ত্রভাবে) E
সম্ভবত অর্ধেকের চেয়ে সামান্য কম অক্ষরযুক্ত, T
অনুরূপভাবে অর্ধেকের চেয়ে সামান্য কম এবং A
সম্ভাবনার সাথে 1/1000 = 0.1% রয়েছে। আসুন ধরে নেওয়া যাক অন্য কোনও অক্ষর সম্ভব নয়; যে কোনও ক্ষেত্রে, A
নীল রঙের বাইরে পূর্বের অদেখা একটি চরিত্রের ক্ষেত্রে একই রকম।
যদি আমরা এল 0 পদ্ধতিতে পরিচালনা করি (তবে বেশিরভাগই নয়, তবে এই প্রশ্নের অন্যান্য উত্তরগুলির মধ্যে সবচেয়ে বেশি রয়েছে), দোভাষীর পক্ষে একটি বেছে নেওয়ার চেয়ে ভাল কৌশল E
আর নেই T
। গড়ে, এটি প্রায় অর্ধেক অক্ষর সঠিক পাবে। সুতরাং E ≈ N / 2 এবং স্কোর ≈ N / 2ও। তবে, যদি আমরা একটি সংক্ষেপণ কৌশল ব্যবহার করি, তবে আমরা চরিত্রের জন্য এক বিট থেকে কিছুটা কমপ্রেস করতে পারি। এলকে বাইটে গণনা করা হওয়ায় আমরা L ≈ N / 8 পাই এবং এভাবে আগের কৌশল হিসাবে দ্বিগুণ ভাল ≈ N / 4 অর্জন করি।
এই মডেলটির জন্য চরিত্রের জন্য এক বিটের চেয়ে কিছু বেশি এই হার অর্জন করা কিছুটা অযৌক্তিক, তবে একটি পদ্ধতি হ'ল গাণিতিক কোডিং।
পাটিগণিত কোডিং
যেমনটি সাধারণভাবে জানা যায়, একটি এনকোডিং বিট / বাইট ব্যবহার করে কিছু উপাত্ত উপস্থাপনের একটি উপায়। উদাহরণস্বরূপ, ASCII হ'ল ইংরেজি পাঠ এবং সম্পর্কিত অক্ষরের একটি 7 বিট / চরিত্রের এনকোডিং এবং এটি বিবেচনাধীন মূল মবি ডিক ফাইলের এনকোডিং। কিছু অক্ষর যদি অন্যের চেয়ে বেশি সাধারণ হয়, তবে ASCII এর মতো একটি নির্দিষ্ট-প্রস্থের এনকোডিং অনুকূল নয়। এমন পরিস্থিতিতে, অনেকে হাফম্যান কোডিংয়ের জন্য পৌঁছায় । আপনি যদি প্রতিটি চরিত্রের বিট সংখ্যার পূর্ণ সংখ্যা সহ একটি স্থির (উপসর্গ-মুক্ত) কোড চান তবে এটি সর্বোত্তম।
তবে গাণিতিক কোডিং আরও ভাল। মোটামুটিভাবে বলতে গেলে, তথ্য এনকোড করতে "ভগ্নাংশ" বিট ব্যবহার করতে সক্ষম। অনলাইনে পাটিগণিত কোডিংয়ের অনেক গাইড রয়েছে। অনলাইনে উপলব্ধ অন্যান্য সংস্থানগুলির কারণে আমরা বিশদটি এখানে (বিশেষত ব্যবহারিক বাস্তবায়নের, যা কিছুটা জটিল হতে পারে) এড়িয়ে যাব, তবে যদি কেউ অভিযোগ করে, সম্ভবত এই বিভাগটি আরও প্রকাশিত হতে পারে।
যদি কারও কাছে যদি কোনও পরিচিত ভাষা মডেল দ্বারা পাঠ্য উত্পন্ন হয়, তবে গাণিতিক কোডিং সেই মডেলটি থেকে পাঠ্যের মূলত-অনুকূল এনকোডিং সরবরাহ করে। কিছু অর্থে, এই মডেলটির জন্য এই সংকোচনের সমস্যাটি "সমাধান করে"। (এইভাবে অনুশীলনে, মূল বিষয়টি হ'ল মডেলটি জানা যায়নি এবং কিছু কিছু মডেল মানব পাঠ্যের মডেলিংয়ের ক্ষেত্রে অন্যদের চেয়ে ভাল)) যদি এই প্রতিযোগিতায় এটির ত্রুটি করার অনুমতি না দেওয়া হয়, তবে পূর্ববর্তী বিভাগের ভাষায় , এই চ্যালেঞ্জের সমাধান তৈরি করার একটি উপায় হ'ল ভাষার মডেল থেকে একটি "ইঙ্গিত" ফাইল উত্পন্ন করার জন্য একটি গাণিতিক এনকোডার ব্যবহার করা এবং তারপরে "দোভাষী" হিসাবে একটি গাণিতিক ডিকোডার ব্যবহার করা।
এই মূলত-অনুকূল এনকোডিং-এ, আমরা সম্ভাব্যতা পি সহ একটি চরিত্রের জন্য -log_2 (p) বিট ব্যয় করি এবং এনকোডিংয়ের সামগ্রিক বিট-রেট শ্যানন এনট্রপি । এর অর্থ হ'ল 1/2 এর কাছাকাছি সম্ভাব্যতার একটি অক্ষর এনকোড করতে প্রায় এক বিট সময় নেয়, যখন সম্ভাব্যতার সাথে 1/1000 প্রায় 10 বিট লাগে (কারণ 2 ^ 10 মোটামুটি 1000)।
তবে এই চ্যালেঞ্জের জন্য স্কোরিং মেট্রিকটি সর্বোত্তম কৌশল হিসাবে সংকোচনতা এড়াতে ভালভাবে বেছে নেওয়া হয়েছিল। একটি সংক্ষিপ্ত ইঙ্গিত ফাইল পাওয়ার জন্য আমাদের ট্রেড অফ হিসাবে কিছু ত্রুটি করার কিছু উপায় খুঁজে বের করতে হবে। উদাহরণস্বরূপ, একটি কৌশল যার চেষ্টা করা যেতে পারে তা হ'ল একটি সহজ শাখা কৌশল: আমরা সাধারণত যখন পাব তখন গাণিতিক এনকোডিংটি ব্যবহার করার চেষ্টা করি, তবে যদি মডেল থেকে সম্ভাব্যতা বিতরণ কোনওভাবেই "খারাপ" হয় তবে আমরা কেবল সম্ভাব্য চরিত্রটি অনুমান করি এবং ডন ' টি এটি এনকোডিং চেষ্টা করুন।
ত্রুটি কেন?
আমরা কেন "ইচ্ছাকৃতভাবে" ত্রুটি করতে চাইছি তা অনুপ্রাণিত করার জন্য উদাহরণটি আগে থেকেই বিশ্লেষণ করা যাক। আমরা যদি সঠিক চরিত্রটি এনকোড করার জন্য গাণিতিক কোডিং ব্যবহার করি, তবে আমরা একটি E
বা এর ক্ষেত্রে প্রায় এক বিট ব্যয় করব T
, তবে এর ক্ষেত্রে দশ বিট A
।
সামগ্রিকভাবে, এটি বেশ ভাল এনকোডিং, তিনটি সম্ভাবনা থাকা সত্ত্বেও চরিত্রের জন্য সামান্য ব্যয় করা; মূলত, এটি A
মোটামুটি অসম্ভব এবং এর সাথে সম্পর্কিত দশ বিট আমরা প্রায়শই ব্যয় করি না। যাইহোক, এটি কি যদি আমরা এর ক্ষেত্রে পরিবর্তে কেবল একটি ত্রুটি করতে পারি তবে কি ভাল লাগবে না A
? সর্বোপরি, সমস্যার মেট্রিকটি 1 বাইট = 8 বিট দৈর্ঘ্যের 2 টি ত্রুটির সমতুল্য বলে বিবেচনা করে; সুতরাং এটির মতো মনে হচ্ছে যে কোনও চরিত্রের উপর 8/2 = 4 বিটের বেশি ব্যয় করার পরিবর্তে কোনও ত্রুটি পছন্দ করা উচিত। একটি ত্রুটি বাঁচাতে বাইটের বেশি ব্যয় করা অবশ্যই সাবটটিমাল মনে হচ্ছে!
"রিওয়াইন্ড" প্রক্রিয়া
এই বিভাগটি এই সমাধানটির মূল চতুর দিকটি বর্ণনা করে, যা কোনও ব্যয় ছাড়াই ভুল অনুমানগুলি পরিচালনা করার উপায়।
আমরা যে সাধারণ উদাহরণটি বিশ্লেষণ করেছি তার জন্য, রিওয়াইন্ড প্রক্রিয়াটি বিশেষত সোজা। দোভাষী ইঙ্গিত ফাইল থেকে এক বিট পড়েন। যদি এটি 0 হয় তবে এটি অনুমান করে E
। এটি যদি 1 হয় তবে এটি অনুমান করে T
। পরের বার যখন এটি বলা হয়, এটি সঠিক চরিত্রটি কী তা দেখায়। যদি ইঙ্গিত ফাইলটি ভালভাবে সেট আপ করা থাকে তবে আমরা তা নিশ্চিত করতে পারি যে কোনও E
বা এর ক্ষেত্রে T
দোভাষীর সঠিকভাবে অনুমান করা যায়। তবে কি A
? রিওয়াইন্ড মেকানিজমের ধারণাটি কেবল কোড A
নয় । আরও স্পষ্টভাবে বলতে গেলে, যদি দোভাষী পরে জানতে পারেন যে সঠিক চরিত্রটি একটি A
, এটি রূপকভাবে " টেপটি রিওয়াইন্ডস করে": এটি পূর্বে পড়া বিটটি ফিরিয়ে দেয়। এটি যে বিটটি পড়েছে তা কোডের উদ্দেশ্যে E
বাT
, কিন্তু এখন না; এটি পরে ব্যবহার করা হবে। এই সহজ উদাহরণে, এই মূলত মানে এটি রাখে একই অক্ষর (মনন E
বা T
) পর্যন্ত এটি ডান পায়; তারপরে এটি আরও কিছু পড়ে এবং চালিয়ে যায়।
এই ইঙ্গিতগুলি ফাইলের এনকোডিংটি খুব সহজ: সমস্তগুলি E
s কে 0 বিট এবং T
এসকে 1 বিটে পরিণত করুন, সমস্ত কিছু A
সম্পূর্ণ উপেক্ষা করার সময় । পূর্ববর্তী বিভাগের শেষে বিশ্লেষণ করে, এই স্কিমটি কিছু ত্রুটি করে তবে কোনও এসকে এনকড না করে সামগ্রিকভাবে স্কোর হ্রাস করে A
। একটি ছোট প্রভাব হিসাবে, এটি প্রকৃতপক্ষে ইঙ্গিতগুলি ফাইলের দৈর্ঘ্যেও সংরক্ষণ করে, কারণ আমরা প্রতিটিটির জন্য ঠিক একটি বিট ব্যবহার করি E
এবং T
কিছুটা বাদ দিয়ে কিছুটা বেশি।
একটু উপপাদ্য
আমরা কীভাবে সিদ্ধান্ত নেব কখন ত্রুটি করা যায়? মনে করুন আমাদের মডেল আমাদের পরবর্তী অক্ষরের জন্য সম্ভাব্যতা বিতরণ পি দেয়। আমরা সম্ভাব্য অক্ষরগুলিকে দুটি শ্রেণিতে বিভক্ত করব: কোডড এবং কোডড নয় । যদি সঠিক চরিত্রটি কোডড না করা হয় তবে আমরা ব্যয় ছাড়াই কোনও ত্রুটি স্বীকার করার জন্য "রিওয়াইন্ড" প্রক্রিয়াটি ব্যবহার করব। যদি সঠিক চরিত্রটি কোডিং করা থাকে, তবে আমরা গাণিতিক কোডিং ব্যবহার করে এটিকে এনকোড করতে অন্য কিছু বিতরণ Q ব্যবহার করব।
কিন্তু আমাদের কি বিতরণ প্রশ্ন নির্বাচন করা উচিত? কোডেড অক্ষরগুলির সকলের কোডড না হওয়া অক্ষরের চেয়ে উচ্চতর সম্ভাবনা (পিতে) হওয়া উচিত তা দেখতে খুব বেশি কঠিন নয়। এছাড়াও, বিতরণ প্রশ্নটিতে কেবল কোডেড অক্ষর অন্তর্ভুক্ত থাকতে হবে; সর্বোপরি, আমরা অন্যগুলি কোডিং করছি না, সুতরাং তাদের উপর আমাদের "ব্যয়" করা উচিত নয়। সম্ভাব্যতা বন্টন Q কোড করা অক্ষরগুলিতে P এর সমানুপাতিক হওয়া উচিত তা দেখতে এটি একটু কৌশলযুক্ত। এই পর্যবেক্ষণগুলি একসাথে রাখার অর্থ হল যে আমাদের সর্বাধিক সম্ভাব্য অক্ষরগুলি কোড করা উচিত তবে সম্ভবত কম সম্ভাব্য অক্ষরগুলি নয় এবং সেই প্রশ্নটি কেবল কোড করা অক্ষরগুলিতে পি উদ্ধারযোগ্য।
এটি আরও প্রমাণিত করে যে একটি দুর্দান্ত উপপাদ্য যা সম্পর্কিত "কাট অফ" কে কোডিং চরিত্রগুলির জন্য বেছে নেওয়া উচিত: আপনার যতক্ষণ না অন্য কোডেড অক্ষরগুলি সংযুক্ত হওয়ার সম্ভাবনা কমপক্ষে কমপক্ষে 1 / 5.393 এর মধ্যে একটি অক্ষর কোড করা উচিত। 5.393
উপরের প্রোগ্রামটির সমাপ্তির কাছাকাছি মনে হচ্ছে এলোমেলো ধ্রুবক উপস্থিতি এটি "ব্যাখ্যা করে" । সংখ্যা 1 / 5.393 ≈ 0.18542 সমীকরণ -p লগ (16) - পি লগ পি + (1 + পি) লগ (1 + পি) = 0 এর সমাধান ।
কোডটিতে এই পদ্ধতিটি লেখার পক্ষে এটি যুক্তিসঙ্গত ধারণা। এই স্নিপেটটি সি ++ এ রয়েছে:
// Assume the model is computed elsewhere.
unordered_map<char, double> model;
// Transform p to q
unordered_map<char, double> code;
priority_queue<pair<double,char>> pq;
for( char c : CHARS )
pq.push( make_pair(model[c], c) );
double s = 0, p;
while( 1 ) {
char c = pq.top().second;
pq.pop();
p = model[c];
if( s > 5.393*p )
break;
code[c] = p;
s += p;
}
for( auto& kv : code ) {
char c = kv.first;
code[c] /= s;
}
সবগুলোকে একত্রে রাখ
পূর্ববর্তী বিভাগটি দুর্ভাগ্যক্রমে কিছুটা প্রযুক্তিগত, তবে আমরা অন্যান্য সমস্ত টুকরা একসাথে রাখলে কাঠামোটি নিম্নরূপ। প্রোগ্রামটি যখনই কোনও প্রদত্ত সঠিক চরিত্রের পরে পরবর্তী চরিত্রটির পূর্বাভাস দিতে বলা হয়:
- মবি ডিকের পরিচিত সঠিক উপসর্গটিতে সঠিক চরিত্রটি যুক্ত করুন।
- পাঠ্যের (মার্কভ) মডেলটি আপডেট করুন।
- গোপন সস : যদি পূর্ববর্তী অনুমান ভুল ছিল, রিওয়াইন্ড পূর্ববর্তী অনুমান আগে তার রাষ্ট্র গাণিতিক ডিকোডার এই হাল!
- মার্কভ মডেলটিকে পরবর্তী চরিত্রের জন্য সম্ভাব্যতা বন্টন পি সম্পর্কে ভবিষ্যদ্বাণী করতে বলুন।
- পূর্ববর্তী বিভাগ থেকে সাবরুটাইন ব্যবহার করে পি তে কি রূপান্তর করুন।
- ডিস্ট্রিবিউশন Q অনুসারে অঙ্কগুলি ফাইলের অবশিষ্ট অংশ থেকে একটি চরিত্রকে ডিকোড করতে গাণিতিক ডিকোডারকে বলুন Q
- ফলাফলের চরিত্রটি অনুমান করুন।
ইঙ্গিত ফাইলের এনকোডিং একইভাবে কাজ করে। সেক্ষেত্রে প্রোগ্রামটি জানে সঠিক পরবর্তী চরিত্রটি কী। যদি এটি এমন একটি চরিত্র যা কোড করা উচিত তবে অবশ্যই এটির গাণিতিক এনকোডারটি ব্যবহার করা উচিত; তবে এটি যদি কোডিং না হওয়া অক্ষর হয় তবে এটি পাটিগণিত এনকোডারটির অবস্থা আপডেট করে না।
আপনি যদি সম্ভাব্যতা বন্টন, এনট্রপি, সংক্ষেপণ এবং গাণিতিক কোডিংয়ের মতো তথ্য-তাত্ত্বিক পটভূমি বুঝতে থাকেন তবে এই পোস্টটি বোঝার চেষ্টা করেছেন এবং ব্যর্থ হয়েছেন (তাত্ত্বিকটি কেন সত্য) তবে আমাদের জানান এবং আমরা বিষয়গুলি পরিষ্কার করার চেষ্টা করতে পারি। পড়ার জন্য ধন্যবাদ!