पर्ल, 2 · 70525 + 326508 = 467558
भविष्यवक्ता
$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
।) इस फ़ाइल को बनाने के लिए नीचे देखें।
यह प्रोग्राम अनिवार्य रूप से मार्कोव मॉडल के संयोजन का उपयोग करता है, जैसा कि इस उत्तर में user2699 द्वारा किया गया है , लेकिन कुछ छोटे संशोधनों के साथ। यह अगले चरित्र के लिए एक वितरण पैदा करता है । हम सूचना सिद्धांत का उपयोग यह तय करने के लिए करते हैं कि त्रुटि को स्वीकार करना है या B
एन्कोडिंग संकेत में भंडारण के बिट्स खर्च करना है (और यदि हां, तो कैसे)। हम मॉडल से भिन्नात्मक बिट्स को स्टोर करने के लिए अंकगणित कोडिंग का उपयोग करते हैं ।
कार्यक्रम 582 बाइट्स (एक अनावश्यक अंतिम न्यूलाइन सहित) और बाइनरी फ़ाइल B
69942 बाइट्स लंबा है, इसलिए कई फ़ाइलों को स्कोर करने के नियमों के तहत , हम L
582 + 69942 + 1 = 70525 स्कोर करते हैं।
कार्यक्रम को लगभग निश्चित रूप से 64-बिट (थोड़ा-एंडियन?) वास्तुकला की आवश्यकता होती है। m5.large
Amazon EC2 पर एक इंस्टेंस पर चलने में लगभग 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],'}}'
सबमिशन के रूप में इसे चलाने के लिए लगभग उतना ही समय लगता है, क्योंकि यह समान संगणना करता है।
व्याख्या
इस खंड में, हम यह वर्णन करने का प्रयास करेंगे कि यह समाधान पर्याप्त विस्तार से क्या करता है कि आप "इसे घर पर आज़माएं"। मुख्य तकनीक जो अन्य लोगों से इस उत्तर को अलग करती है, "रिवाइंड" तंत्र के रूप में कुछ खंड नीचे है, लेकिन इससे पहले कि हम वहां पहुंचें, हमें मूल बातें स्थापित करने की आवश्यकता है।
आदर्श
समाधान का मूल घटक एक भाषा मॉडल है। हमारे उद्देश्यों के लिए, एक मॉडल एक ऐसी चीज है जो अंग्रेजी पाठ की कुछ राशि लेता है और अगले चरित्र पर एक संभावना वितरण देता है । जब हम मॉडल का उपयोग करते हैं, तो अंग्रेजी पाठ मोबी डिक का कुछ (सही) उपसर्ग होगा। कृपया ध्यान दें कि वांछित आउटपुट एक वितरण है , और सबसे संभावित चरित्र के लिए केवल एक अनुमान नहीं है।
हमारे मामले में, हम अनिवार्य रूप से इस उत्तर में मॉडल का उपयोग user2699 द्वारा करते हैं । हमने एंडर्स कसेग द्वारा उच्चतम स्कोरिंग उत्तर (अपने स्वयं के अलावा) से मॉडल का सटीक रूप से उपयोग नहीं किया क्योंकि हम एक सर्वोत्तम अनुमान के बजाय वितरण को निकालने में असमर्थ थे। सिद्धांत रूप में, यह उत्तर एक भारित ज्यामितीय माध्य की गणना करता है, लेकिन हमें कुछ खराब परिणाम मिले जब हमने इसकी व्याख्या की। हमने एक मॉडल को दूसरे उत्तर से चुरा लिया है क्योंकि हमारा "गुप्त सॉस" मॉडल नहीं है, बल्कि समग्र दृष्टिकोण है। यदि किसी के पास "बेहतर" मॉडल है, तो उन्हें हमारी बाकी तकनीकों का उपयोग करके बेहतर परिणाम प्राप्त करने में सक्षम होना चाहिए।
एक टिप्पणी के रूप में, लेम्पेल-ज़िव जैसी अधिकांश संपीड़न विधियों को इस तरह से "भाषा मॉडल" के रूप में देखा जा सकता है, हालांकि किसी को थोड़ा सा भटकना पड़ सकता है। (यह विशेष रूप से एक ऐसी चीज़ के लिए बहुत मुश्किल है जो एक बर्स-व्हीलर को रूपांतरित करता है!) इसके अलावा, ध्यान दें कि user2699 द्वारा मॉडल मार्कोव मॉडल का एक संशोधन है; अनिवार्य रूप से और कुछ भी इस चुनौती के लिए प्रतिस्पर्धी नहीं है या शायद सामान्य रूप से पाठ भी मॉडलिंग कर रहा है।
कुल मिलाकर वास्तुकला
समझ के प्रयोजनों के लिए, कई टुकड़ों में समग्र वास्तुकला को तोड़ना अच्छा है। उच्चतम-स्तर के दृष्टिकोण से, राज्य प्रबंधन कोड का थोड़ा सा होना आवश्यक है। यह विशेष रूप से दिलचस्प नहीं है, लेकिन पूर्णता के लिए हम तनाव चाहते हैं कि हर बिंदु पर कार्यक्रम अगले अनुमान के लिए कहा जाए, यह इसके लिए Moby Dick का एक सही उपसर्ग उपलब्ध है। हम किसी भी तरह से अपने अतीत के गलत अनुमानों का उपयोग नहीं करते हैं। दक्षता के लिए, भाषा मॉडल संभवत: अपने राज्य को पहले N अक्षर से अपने राज्य की गणना करने के लिए पहले (N + 1) वर्णों के लिए पुन: उपयोग कर सकता है, लेकिन सिद्धांत रूप में, यह हर बार आह्वान किए जाने पर चीजों को खरोंच से फिर से जोड़ सकता है।
आइए कार्यक्रम के इस मूल "चालक" को एक तरफ सेट करें और उस हिस्से के अंदर झांकें जो अगले चरित्र का अनुमान लगाता है। यह तीन भागों को अलग करने के लिए वैचारिक रूप से मदद करता है: भाषा मॉडल (ऊपर चर्चा की गई), एक "संकेत" फ़ाइल, और एक "दुभाषिया"। प्रत्येक चरण में, दुभाषिया अगले चरित्र के लिए वितरण के लिए भाषा मॉडल पूछेगा और संभवतः संकेत फ़ाइल से कुछ जानकारी पढ़ेगा। फिर यह इन भागों को एक अनुमान में संयोजित करेगा। वास्तव में संकेत फ़ाइल में क्या जानकारी है और साथ ही इसका उपयोग कैसे किया जाता है, इसके बारे में बाद में बताया जाएगा, लेकिन अब यह इन भागों को मानसिक रूप से अलग रखने में मदद करता है। ध्यान दें कि कार्यान्वयन-वार, संकेत फ़ाइल का शाब्दिक रूप से एक अलग (बाइनरी) फ़ाइल है, लेकिन यह प्रोग्राम के अंदर संग्रहीत एक स्ट्रिंग या कुछ हो सकता है। एक सन्निकटन के रूप में,
यदि कोई इस जवाब में bzip2 जैसी मानक संपीड़न विधि का उपयोग कर रहा है , तो "संकेत" फ़ाइल संपीड़ित फ़ाइल से मेल खाती है। "दुभाषिया" डिकम्प्रेसर से मेल खाता है, जबकि "भाषा मॉडल" थोड़ा सा निहित है (जैसा कि ऊपर उल्लेख किया गया है)।
क्यों एक संकेत फ़ाइल का उपयोग करें?
चलो आगे का विश्लेषण करने के लिए एक सरल उदाहरण चुनें। मान लीजिए कि पाठ N
एक मॉडल द्वारा वर्ण लंबा और सुव्यवस्थित है, जिसमें प्रत्येक वर्ण स्वतंत्र रूप से अक्षर है ( E
संभावना ) एक आधे से थोड़ा कम, T
इसी तरह संभावना के साथ थोड़ा कम आधे से अधिक, और A
संभावना 1/1000 = 0.1% के साथ। मान लें कि कोई अन्य वर्ण संभव नहीं है; किसी भी मामले में, A
नीले रंग के पहले अनदेखे चरित्र के मामले के समान सुंदर है।
यदि हम L 0 शासन में संचालित होते हैं (जैसा कि अधिकांश, लेकिन सभी नहीं, तो इस प्रश्न के अन्य उत्तरों के लिए), दुभाषिए के लिए इससे बेहतर कोई रणनीति नहीं है कि वह E
और में से किसी एक को चुनें T
। औसतन, यह लगभग आधे पात्रों को सही करेगा। तो ई / एन / 2 और स्कोर 2 एन / 2 भी। हालांकि, अगर हम एक संपीड़न रणनीति का उपयोग करते हैं, तो हम प्रति चरित्र एक से थोड़ा अधिक संपीड़ित कर सकते हैं। क्योंकि L को बाइट्स में गिना जाता है, इसलिए हमें L 8 N / 8 मिलता है और इस तरह count N / 4 स्कोर होता है, जो पिछली रणनीति से दोगुना है।
इस मॉडल के लिए प्रति वर्ण एक से थोड़ा अधिक की दर को प्राप्त करना थोड़ा असम्भव है, लेकिन एक विधि अंकगणित कोडिंग है।
अंकगणित कोडिंग
जैसा कि आमतौर पर जाना जाता है, एन्कोडिंग बिट्स / बाइट्स का उपयोग करके कुछ डेटा का प्रतिनिधित्व करने का एक तरीका है। उदाहरण के लिए, ASCII अंग्रेजी पाठ और संबंधित वर्णों का 7 बिट / कैरेक्टर एन्कोडिंग है, और यह विचाराधीन मूल मोबी डिक फ़ाइल का एन्कोडिंग है। यदि कुछ अक्षर दूसरों की तुलना में अधिक सामान्य हैं, तो ASCII जैसी निश्चित-चौड़ाई वाली एन्कोडिंग इष्टतम नहीं है। ऐसी स्थिति में, कई लोग हफ़मैन कोडिंग के लिए पहुंचते हैं । यह इष्टतम है यदि आप प्रति वर्ण बिट्स के पूर्णांक संख्या के साथ एक निश्चित (उपसर्ग-मुक्त) कोड चाहते हैं।
हालांकि, अंकगणित कोडिंग और भी बेहतर है। मोटे तौर पर, यह जानकारी को एन्कोड करने के लिए "आंशिक" बिट्स का उपयोग करने में सक्षम है। ऑनलाइन अंकगणित कोडिंग के लिए कई गाइड उपलब्ध हैं। हम यहां उपलब्ध विवरण (विशेष रूप से व्यावहारिक कार्यान्वयन की, जो कि प्रोग्रामिंग के नजरिए से थोड़ी मुश्किल हो सकती है) को ऑनलाइन उपलब्ध अन्य संसाधनों के कारण छोड़ सकते हैं, लेकिन अगर कोई शिकायत करता है, तो शायद यह खंड अधिक समाप्त हो जाए।
यदि किसी के पास वास्तव में एक ज्ञात भाषा मॉडल द्वारा उत्पन्न पाठ है, तो अंकगणित कोडिंग उस मॉडल से पाठ का अनिवार्य रूप से इष्टतम एन्कोडिंग प्रदान करता है। कुछ अर्थों में, यह उस मॉडल के लिए संपीड़न समस्या को हल करता है। (इस प्रकार, व्यवहार में, मुख्य मुद्दा यह है कि मॉडल ज्ञात नहीं है, और कुछ मॉडल मानव पाठ की मॉडलिंग में दूसरों की तुलना में बेहतर हैं।) यदि इस प्रतियोगिता में त्रुटियां करने की अनुमति नहीं थी, तो पिछले अनुभाग की भाषा में , इस चुनौती के समाधान का उत्पादन करने का एक तरीका भाषा मॉडल से "संकेत" फ़ाइल उत्पन्न करने के लिए एक अंकगणित एनकोडर का उपयोग करना होगा और फिर "इंटरप्रेटर" के रूप में एक अंकगणितीय डिकोडर का उपयोग करना होगा।
इस अनिवार्य-इष्टतम एन्कोडिंग में, हम प्रायोजन p के साथ एक चरित्र के लिए खर्च -log_2 (p) बिट्स को समाप्त करते हैं, और एन्कोडिंग की समग्र बिट-दर शैनन एन्ट्रॉपी है । इसका मतलब है कि 1/2 के पास प्रायिकता वाले चरित्र को एन्कोड करने में लगभग एक बिट लगता है, जबकि प्रायिकता 1/1000 के साथ लगभग 10 बिट्स लेता है (क्योंकि 2 ^ 10 लगभग 1000 है)।
लेकिन इस चुनौती के लिए स्कोरिंग मीट्रिक को इष्टतम रणनीति के रूप में संपीड़न से बचने के लिए अच्छी तरह से चुना गया था। हम एक छोटे संकेत फ़ाइल प्राप्त करने के लिए एक व्यापार के रूप में कुछ त्रुटियों को बनाने के लिए किसी तरह का पता लगाना होगा। उदाहरण के लिए, एक रणनीति जो एक कोशिश हो सकती है वह एक सरल शाखा रणनीति है: हम आम तौर पर अंकगणितीय एन्कोडिंग का उपयोग करने की कोशिश करते हैं जब हम कर सकते हैं, लेकिन अगर मॉडल से संभावना वितरण "खराब" है तो किसी तरह से हम केवल सबसे अधिक संभावना चरित्र और डॉन का अनुमान लगाते हैं ' t इसे एन्कोड करने का प्रयास करें।
गलतियाँ क्यों?
आइए पहले से उदाहरण का विश्लेषण करें कि हम क्यों "जानबूझकर" त्रुटियां करना चाहते हैं प्रेरित करने के लिए। यदि हम सही वर्ण को कूटबद्ध करने के लिए अंकगणित कोडिंग का उपयोग करते हैं, तो हम लगभग एक बिट 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
को 0 बिट्स में बदल दें और T
1 बिट्स में एस, सभी को A
पूरी तरह से अनदेखा करते हुए । पिछले अनुभाग के अंत में विश्लेषण द्वारा, यह योजना कुछ त्रुटियां करती है, लेकिन किसी भी एस को एन्कोडिंग नहीं करके कुल स्कोर को कम करती है A
। एक छोटे से प्रभाव के रूप में, यह वास्तव में संकेत फ़ाइल की लंबाई पर भी बचाता है, क्योंकि हम प्रत्येक के लिए बिल्कुल एक बिट का उपयोग करते हैं E
और T
, बिट के बजाय थोड़ा अधिक।
थोड़ा प्रमेय
हम कैसे तय करते हैं कि कब त्रुटि होगी? मान लीजिए कि हमारा मॉडल हमें अगले चरित्र के लिए एक संभाव्यता वितरण पी देता है। हम संभावित पात्रों को दो वर्गों में अलग करेंगे: कोडित और कोडित नहीं । यदि सही चरित्र को कोडित नहीं किया गया है, तो हम बिना किसी लागत के त्रुटि को स्वीकार करने के लिए "रिवाइंड" तंत्र का उपयोग करके समाप्त हो जाएंगे। यदि सही चरित्र को कोडित किया गया है, तो हम अंकगणित कोडिंग का उपयोग करके इसे एन्कोड करने के लिए कुछ अन्य वितरण क्यू का उपयोग करेंगे।
लेकिन हमें क्या वितरण Q चुनना चाहिए? यह देखना बहुत कठिन नहीं है कि कोडित वर्णों में सभी की संभावना अधिक होनी चाहिए (P में) कोडित वर्णों की तुलना में। इसके अलावा, वितरण Q में केवल कोडित वर्ण शामिल होने चाहिए; आखिरकार, हम दूसरे को कोड नहीं कर रहे हैं, इसलिए हमें उन पर "खर्च" नहीं करना चाहिए। यह देखने के लिए थोड़ा पेचीदा है कि संभावना वितरण क्यू को कोडित वर्णों पर पी के समानुपाती होना चाहिए। इन टिप्पणियों को एक साथ रखने का मतलब है कि हमें सबसे अधिक संभावना वाले पात्रों को कोड करना चाहिए, लेकिन संभवतः कम-संभावित पात्रों को नहीं, और यह कि क्यू केवल कोडित वर्णों पर पुनर्विकसित है।
इसके अलावा यह पता चलता है कि एक शांत प्रमेय है जिसके बारे में "कटऑफ" को कोडिंग पात्रों के लिए चुनना चाहिए: आपको एक चरित्र को तब तक कोड करना चाहिए जब तक कि यह कम से कम 1 / 5.393 हो, जैसा कि अन्य कोडित वर्णों की संभावना है। यह "समझाता है" प्रतीत होता है यादृच्छिक निरंतर 5.393
कार्यक्रम के अंत के करीब लगातार । नंबर 1 / 5.393 ≈ 0.18542 समीकरण -p लॉग (16) - पी लॉग पी + (1 + पी) लॉग (1 + पी) = 0 का समाधान है ।
शायद इस प्रक्रिया को कोड में लिखना एक उचित विचार है। यह स्निपेट C ++ में है:
// 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;
}
यह सब एक साथ डालें
पिछला खंड दुर्भाग्य से थोड़ा तकनीकी है, लेकिन अगर हम अन्य सभी टुकड़ों को एक साथ रखते हैं, तो संरचना इस प्रकार है। जब भी प्रोग्राम को किसी सही चरित्र के बाद अगले चरित्र की भविष्यवाणी करने के लिए कहा जाता है:
- Moby Dick के ज्ञात सही उपसर्ग में सही वर्ण जोड़ें।
- पाठ का मार्कोव (मार्कोव) मॉडल अपडेट करें।
- गुप्त सॉस : अगर पिछले अनुमान गलत था, रिवाइंड पिछले अनुमान से पहले अपने राज्य के लिए गणित डिकोडर का राज्य!
- मार्कोव मॉडल से अगले चरित्र के लिए संभाव्यता वितरण पी की भविष्यवाणी करने के लिए कहें।
- पिछले अनुभाग से सबरूटीन का उपयोग करके क्यू से ट्रांसफ़ॉर्म करें।
- वितरण क्यू के अनुसार, अंक फ़ाइल के शेष भाग से एक वर्ण को डिकोड करने के लिए अंकगणितीय डिकोडर से पूछें।
- परिणामी चरित्र का अनुमान लगाएं।
संकेत फ़ाइल की एन्कोडिंग समान रूप से संचालित होती है। उस स्थिति में, प्रोग्राम जानता है कि सही अगला वर्ण क्या है। यदि यह एक चरित्र है जिसे कोडित किया जाना चाहिए, तो निश्चित रूप से उस पर अंकगणित एनकोडर का उपयोग करना चाहिए; लेकिन अगर यह एक कोडित चरित्र नहीं है, यह सिर्फ अंकगणित एनकोडर की स्थिति को अद्यतन नहीं करता है।
यदि आप संभावना-वितरण, एन्ट्रापी, संपीड़न और अंकगणितीय कोडिंग जैसी सूचना-सिद्धांत संबंधी पृष्ठभूमि को समझते हैं लेकिन इस पोस्ट को समझने की कोशिश और असफल रहे (सिवाय इसके कि सत्य क्यों है), तो आइए जानते हैं और हम चीजों को स्पष्ट करने का प्रयास कर सकते हैं। पढ़ने के लिए धन्यवाद!