පර්ල්, 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
.) මෙම ගොනුව ජනනය කරන්නේ කෙසේදැයි පහත බලන්න.
මෙම වැඩසටහන පරිශීලක 2699 විසින් මෙම පිළිතුරෙහි මෙන් මාකෝව් ආකෘතිවල සංයෝජනයක් භාවිතා කරයි , නමුත් කුඩා වෙනස් කිරීම් කිහිපයක් සමඟ. මෙය ඊළඟ චරිතය සඳහා බෙදාහැරීමක් සිදු කරයි . 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],'}}'
සමාන ගණනය කිරීම් සිදු කරන බැවින්, ඉදිරිපත් කිරීම සඳහා ධාවනය කිරීමට ආසන්න වශයෙන් වැඩි කාලයක් ගත වේ.
පැහැදිලි කිරීම
මෙම කොටසේදී, මෙම විසඳුම මඟින් ඔබට "නිවසේදී එය අත්හදා බැලිය හැකිය" යන්න ප්රමාණවත් ලෙස විස්තර කිරීමට අපි උත්සාහ කරමු. මෙම පිළිතුර අනෙක් පිළිතුරු වලින් වෙන්කර හඳුනාගත හැකි ප්රධාන තාක්ෂණය වන්නේ “රිවයින්ඩ්” යාන්ත්රණය ලෙස කොටස් කිහිපයක් පහළට බැස ඇති නමුත් අප එහි යාමට පෙර මූලික කරුණු සකස් කළ යුතුය.
ආකෘතිය
විසඳුමේ මූලික සං ient ටකය භාෂා ආකෘතියකි. අපගේ අරමුණු සඳහා, ආකෘතියක් යනු ඉංග්රීසි පෙළෙන් යම් ප්රමාණයක් ගෙන ඊළඟ අක්ෂරයට සම්භාවිතා බෙදාහැරීමක් ලබා දෙන දෙයකි . අපි ආකෘතිය භාවිතා කරන විට, ඉංග්රීසි පෙළ මොබී ඩික්ගේ (නිවැරදි) උපසර්ගයක් වනු ඇත. අපේක්ෂිත ප්රතිදානය බෙදාහැරීමක් වන අතර බොහෝ දුරට ඉඩ ඇති චරිතය සඳහා එක් අනුමානයක් පමණක් නොවන බව කරුණාවෙන් සලකන්න .
අපගේ නඩුවේදී, පරිශීලක 2699 විසින් මෙම පිළිතුරේ ආකෘතිය අපි භාවිතා කරමු . ඇන්ඩර්ස් කසෝර්ග් විසින් වැඩිම ලකුණු ලබා ගත් පිළිතුරෙන් (අපේම හැර) අපි ආකෘතිය භාවිතා නොකළේ හරියටම අපට හොඳම අනුමානයකට වඩා බෙදාහැරීමක් උපුටා ගැනීමට නොහැකි වූ බැවිනි. න්යායට අනුව, එම පිළිතුර බරින් යුත් ජ්යාමිතික මධ්යන්යයක් ගණනය කරයි, නමුත් එය වචනානුසාරයෙන් අර්ථ නිරූපණය කරන විට අපට තරමක් දුර්වල ප්රති results ල ලැබුණි. අපි වෙනත් පිළිතුරකින් ආකෘතියක් "සොරකම්" කළේ අපගේ "රහස් සෝස්" ආකෘතිය නොව සමස්ත ප්රවේශය නිසාය. යමෙකුට "වඩා හොඳ" ආකෘතියක් තිබේ නම්, අපගේ ඉතිරි ශිල්පීය ක්රම උපයෝගී කර ගනිමින් ඔවුන්ට වඩා හොඳ ප්රති results ල ලබා ගත හැකිය.
ප්රකාශයක් ලෙස, ලෙම්පල්-සිව් වැනි බොහෝ සම්පීඩන ක්රම මේ ආකාරයෙන් “භාෂා ආකෘතියක්” ලෙස දැකිය හැකිය. (බරෝස්-වීලර් පරිණාමනය කරන දෙයක් සඳහා එය විශේෂයෙන් උපක්රමශීලී ය!) එසේම, පරිශීලක 2699 හි ආකෘතිය මාකෝව් ආකෘතියේ වෙනස් කිරීමක් බව සලකන්න; මෙම අභියෝගය සඳහා තරඟකාරී වන්නේ වෙනත් කිසිවක් නොවේ.
සමස්ත ගෘහ නිර්මාණ ශිල්පය
අවබෝධ කර ගැනීමේ අරමුණු සඳහා, සමස්ත ගෘහ නිර්මාණ ශිල්පය කැබලි කිහිපයකට කැඩීම සතුටක්. ඉහළම මට්ටමේ දෘෂ්ටි කෝණයෙන් බලන කල, රාජ්ය කළමනාකරණ කේතය ටිකක් තිබිය යුතුය. මෙය විශේෂයෙන් සිත්ගන්නා සුළු නොවේ, නමුත් සම්පූර්ණත්වය සඳහා අපට අවධාරණය කිරීමට අවශ්ය වන්නේ සෑම අවස්ථාවකදීම ඊළඟ අනුමානය සඳහා වැඩසටහන ඉල්ලා සිටින විට එය මොබී ඩික්ගේ නිවැරදි උපසර්ගයක් ලබා ගත හැකි බවයි. අපගේ අතීත වැරදි අනුමාන අපි කිසිම ආකාරයකින් භාවිතා නොකරමු. කාර්යක්ෂමතාවය උදෙසා, භාෂා ආකෘතියට පළමු (N + 1) අක්ෂර සඳහා එහි තත්වය ගණනය කිරීම සඳහා පළමු N අක්ෂර වලින් එහි තත්වය නැවත භාවිතා කළ හැකි නමුත් ප්රතිපත්තිමය වශයෙන් එය ආයාචනා කරන සෑම අවස්ථාවකම මුල සිටම නැවත ගණනය කළ හැකිය.
වැඩසටහනේ මෙම මූලික “ධාවක” පසෙකට දමා ඊළඟ චරිතය අනුමාන කරන කොටස දෙස බලමු. එය කොටස් තුනක් වෙන් කිරීමට සංකල්පමය වශයෙන් උපකාරී වේ: භාෂා ආකෘතිය (ඉහත සාකච්ඡා කර ඇත), “ඉඟි” ගොනුවක් සහ “පරිවර්තකය”. සෑම පියවරකදීම, පරිවර්තකයා භාෂා ආකෘතිය ඊළඟ චරිතය සඳහා බෙදා හැරීමක් ඉල්ලා සිටින අතර ඉඟි ගොනුවෙන් යම් තොරතුරු කියවනු ඇත. එවිට එය මෙම කොටස් අනුමාන කිරීමකට ඒකාබද්ධ කරයි. ඉඟි ගොනුවේ ඇති තොරතුරු මෙන්ම එය භාවිතා කරන ආකාරයද පසුව පැහැදිලි කරනු ඇත, නමුත් දැනට එය මෙම කොටස් මානසිකව වෙන්ව තබා ගැනීමට උපකාරී වේ. ක්රියාත්මක කිරීම අනුව, ඉඟි ගොනුව වචනාර්ථයෙන් වෙනම (ද්විමය) ගොනුවක් වන නමුත් එය නූලක් හෝ වැඩසටහන තුළ ගබඩා කර ඇති යමක් විය හැකි බව සලකන්න. ආසන්න වශයෙන්,
මෙම පිළිතුරෙහි මෙන් යමෙකු bzip2 වැනි සම්මත සම්පීඩන ක්රමයක් භාවිතා කරන්නේ නම් , “ඉඟි” ගොනුව සම්පීඩිත ගොනුවට අනුරූප වේ. "පරිවර්තකය" විසංයෝජනයට අනුරූප වන අතර "භාෂා ආකෘතිය" ටිකක් ව්යංගයෙන් (ඉහත සඳහන් කළ පරිදි).
ඉඟි ගොනුවක් භාවිතා කරන්නේ ඇයි?
වැඩිදුර විශ්ලේෂණය කිරීම සඳහා සරල උදාහරණයක් තෝරා ගනිමු. N
සෑම අක්ෂරයක්ම (ස්වාධීනව) E
සම්භාවිතාව සහිත ලිපිය අඩකටත් වඩා මඳක් අඩු, T
ඒ හා සමානව සම්භාවිතාව අඩකටත් වඩා අඩුවෙන් හා A
සම්භාවිතාව 1/1000 = 0.1% සහිත ආකෘතියක් මඟින් පෙළ දිගු හා හොඳින් තක්සේරු කර ඇති අයුරු සිතමු . වෙනත් චරිත කළ නොහැකි යැයි උපකල්පනය කරමු; කෙසේ වෙතත්, A
මෙය නිල් පැහැයෙන් පිටත නොපෙනෙන චරිතයකට සමාන ය.
අපි (මෙම ප්රශ්නයට වෙනත් පිළිතුරු සියලු බොහෝ, නමුත්, එසේ ලෙස) එල් 0 තන්ත්රය ක්රියාත්මක නම්, තාලිත්, එක් කෙනෙකුට වඩා භාෂණ සඳහා වඩා හොඳ උපාය තියෙනවා E
සහ T
. සාමාන්යයෙන්, එය අක්ෂරවලින් අඩක් පමණ නිවැරදි වනු ඇත. එබැවින් E ≈ N / 2 සහ ලකුණු ≈ N / 2 ද වේ. කෙසේ වෙතත්, අපි සම්පීඩන උපාය මාර්ගයක් භාවිතා කරන්නේ නම්, එවිට අපට අක්ෂරයකට බිට් එකකට වඩා ටිකක් වැඩි කළ හැකිය. L බයිට් වලින් ගණනය කර ඇති නිසා, අපට L ≈ N / 8 ලැබෙන අතර එමඟින් score N / 4 ලකුණු ලබා ගනී, එය පෙර උපාය මාර්ගයට වඩා දෙගුණයකි.
මෙම ආකෘතිය සඳහා එක් අක්ෂරයකට බිට් එකකට වඩා ටිකක් වැඩි අනුපාතයක් ළඟා කර ගැනීම තරමක් අශිෂ්ට ය, නමුත් එක් ක්රමයක් වන්නේ ගණිත කේතීකරණයයි.
අංක ගණිත කේතනය
පොදුවේ දන්නා පරිදි, කේතන ක්රමයක් යනු බිටු / බයිට් භාවිතා කරමින් සමහර දත්ත නිරූපණය කිරීමේ ක්රමයකි. උදාහරණයක් ලෙස, ASCII යනු ඉංග්රීසි පෙළ සහ ඒ හා සම්බන්ධ අක්ෂර 7 බිට් / අක්ෂර කේතන ක්රමයක් වන අතර එය සලකා බලනු ලබන මුල් මොබී ඩික් ගොනුවේ කේතන ක්රමය වේ. සමහර අක්ෂර අනෙක් ඒවාට වඩා පොදු නම්, ASCII වැනි ස්ථාවර පළල කේතන ක්රමයක් ප්රශස්ත නොවේ. එවැනි තත්වයක් තුළ, බොහෝ අය හෆ්මන් කේතීකරණය සඳහා ළඟා වේ . ඔබට අක්ෂරයකට බිටු සංඛ්යාවක් සහිත ස්ථාවර (උපසර්ග රහිත) කේතයක් අවශ්ය නම් මෙය ප්රශස්ත වේ.
කෙසේ වෙතත්, අංක ගණිත කේතනය ඊටත් වඩා හොඳය. දළ වශයෙන් කිවහොත්, තොරතුරු කේතනය කිරීම සඳහා "භාගික" බිටු භාවිතා කිරීමට එයට හැකියාව ඇත. අංක ගණිත කේතීකරණය සඳහා මාර්ගෝපදේශ බොහෝමයක් මාර්ගගතව ඇත. අන්තර්ජාලය හරහා ලබා ගත හැකි වෙනත් සම්පත් නිසා අපි මෙහි විස්තර (විශේෂයෙන් ප්රායෝගිකව ක්රියාත්මක කිරීම, ක්රමලේඛන දෘෂ්ටිකෝණයකින් ටිකක් උපක්රමශීලී විය හැකිය) මඟ හරිමු, නමුත් යමෙකු පැමිණිලි කළහොත්, සමහර විට මෙම කොටස තවත් ඉවත් කළ හැකිය.
යමෙකුට දන්නා භාෂා ආකෘතියක් මගින් සත්ය වශයෙන්ම ජනනය කරන ලද පෙළක් තිබේ නම්, ගණිත කේතීකරණය මඟින් එම ආකෘතියෙන් අත්යවශ්යයෙන්ම ප්රශස්ත කේතයක් ලබා දේ. යම් ආකාරයකින්, මෙය එම ආකෘතිය සඳහා සම්පීඩන ගැටළුව "විසඳයි". (මේ අනුව, ප්රායෝගිකව, ප්රධාන ගැටළුව වන්නේ ආකෘතිය නොදන්නා අතර සමහර ආකෘතීන් අනෙක් ඒවාට වඩා මානව පෙළ ආකෘතිකරණයට වඩා හොඳය.) මෙම තරඟයේ වැරදි කිරීමට ඉඩ නොදුන්නේ නම්, පෙර කොටසේ භාෂාවෙන් , මෙම අභියෝගයට විසඳුමක් ලබා ගත හැකි එක් ක්රමයක් වනුයේ භාෂා ආකෘතියෙන් “ඉඟි” ගොනුවක් ජනනය කිරීම සඳහා අංක ගණිත කේතන ක්රමයක් භාවිතා කර ගණිත විකේතකය “පරිවර්තකයා” ලෙස භාවිතා කිරීමයි.
මෙම අත්යවශ්යයෙන්ම ප්රශස්ත කේතීකරණයේදී, අපි සම්භාවිතාව p සහිත අක්ෂරයක් සඳහා -log_2 (p) බිටු වියදම් කිරීම අවසන් කරන අතර, කේතන ක්රමයේ සමස්ත බිට් අනුපාතය ෂැනන් එන්ට්රොපිය වේ. මෙයින් අදහස් කරන්නේ 1/2 ට ආසන්න සම්භාවිතාවක් ඇති අක්ෂරයක් කේතනය කිරීමට බිට් එකක් පමණ ගත වන අතර 1/1000 සම්භාවිතාව සහිත එකක් බිටු 10 ක් පමණ ගනී (මන්ද 2 ^ 10 දළ වශයෙන් 1000 ක් වන නිසා).
නමුත් මෙම අභියෝගය සඳහා ලකුණු ලබා ගැනීමේ මෙට්රික් ප්රශස්ත ක්රමෝපාය ලෙස සම්පීඩනය වළක්වා ගැනීමට හොඳින් තෝරා ගන්නා ලදී. කෙටි ඉඟි ගොනුවක් ලබා ගැනීම සඳහා වෙළඳාමක් ලෙස යම් දෝෂයක් කිරීමට අපට යම් ක්රමයක් සොයා ගැනීමට සිදුවේ. උදාහරණයක් ලෙස, යමෙකු උත්සාහ කළ හැකි එක් උපක්රමයක් සරල ශාඛා ක්රමෝපායක් වේ: අපි සාමාන්යයෙන් අපට හැකි විට ගණිත කේතීකරණ භාවිතා කිරීමට උත්සාහ කරමු, නමුත් ආකෘතියෙන් සම්භාවිතා ව්යාප්තිය “නරක” නම් යම් ආකාරයකින් අපි අනුමාන කරන්නේ බොහෝ දුරට ඉඩ ඇති චරිතය සහ ඩොන් ' එය කේතනය කිරීමට උත්සාහ නොකරන්න.
වැරදි කරන්නේ ඇයි?
"හිතාමතාම" වැරදි කිරීමට අපට අවශ්ය විය හැක්කේ මන්දැයි පෙළඹවීම සඳහා පෙර සිටම උදාහරණය විශ්ලේෂණය කරමු. නිවැරදි අක්ෂරය කේතනය කිරීම සඳහා අපි අංක ගණිත කේතීකරණයක් භාවිතා කරන්නේ නම්, අපි දළ වශයෙන් එක් බිට් එකක් වැය කරන්නේ E
හෝ T
, නමුත් බිටු දහයක් පමණ A
වේ.
සමස්තයක් වශයෙන්, මෙය හොඳ කේතීකරණයක් වන අතර, හැකියාවන් තුනක් තිබුණද, එක් චරිතයකට ටිකක් වැඩි මුදලක් වැය කරයි; මූලික වශයෙන්, A
එය තරමක් අසීරු වන අතර, අපි ඊට අනුරූප බිටු දහයක් නිතර වියදම් කිරීම අවසන් නොකරමු. කෙසේ වෙතත්, අපට ඒ වෙනුවට වැරැද්දක් කළ හැකි නම් එය හොඳ A
නොවේද? සියල්ලට පසු, ගැටළුව සඳහා මෙට්රික් 1 බයිට් 1 = බිටු 8 දිග දෝෂ 2 ට සමාන යැයි සලකයි; අක්ෂරයක් සඳහා බිටු 8/2 = 4 කට වඩා වියදම් කරනවා වෙනුවට යමෙකු දෝෂයකට වැඩි කැමැත්තක් දැක්විය යුතු බව පෙනේ. එක් දෝෂයක් සුරැකීමට බයිට් එකකට වඩා වියදම් කිරීම නියත වශයෙන්ම උප ප්රශස්ත බවක් පෙනේ!
"රිවයින්ඩ්" යාන්ත්රණය
මෙම කොටස මෙම විසඳුමේ ප්රධාන දක්ෂ අංගය විස්තර කරයි, එය දිගින් දිගටම කිසිදු වියදමක් නොමැතිව වැරදි අනුමාන හැසිරවිය හැකි ක්රමයකි.
අප විශ්ලේෂණය කර ඇති සරල උදාහරණය සඳහා, රිවයින්ඩ් යාන්ත්රණය විශේෂයෙන් සරල ය. පරිවර්තකයා ඉඟි ගොනුවෙන් එක් කොටසක් කියවයි. එය 0 නම්, එය අනුමාන කරයි E
. එය 1 නම්, එය අනුමාන කරයි T
. ඊළඟ වතාවේ එය හැඳින්වූ විට, එය නිවැරදි චරිතය කුමක්දැයි දකී. ඉඟි ගොනුව හොඳින් සකසා ඇත්නම්, E
හෝ T
, හෝ , පරිවර්තකයා නිවැරදිව අනුමාන කරන බව අපට සහතික කළ හැකිය . නමුත් කුමක් ද A
? මෙම නැරැඹීමට Rewind යාන්ත්රණයක් අදහස සරලව ය කේතය නොවන A
සියලු දී . වඩාත් නිවැරදිව, පරිවර්තකයා පසුව නිවැරදි චරිතය බව දැන ගන්නේ නම් A
, එය රූපකීයව “ටේප් එක පෙරළා දමයි”: එය කලින් කියවූ කොටස නැවත ලබා දෙයි. එය කියවන බිට් කේත කිරීමට අදහස් කරයි E
හෝT
, නමුත් දැන් නොවේ; එය පසුව භාවිතා වේ. මෙම සරල උදාහරණයක්, මේ මූලික වශයෙන් එහි අරුත වන්නේ කරයි එම චරිතය (අනුමාන E
හෝ T
එය නිවැරදි එය ලැබෙන තෙක්); ඉන්පසු එය තවත් ටිකක් කියවා ඉදිරියට යයි.
මෙම ඉඟි ගොනුව සඳහා කේතන කිරීම ඉතා සරල ය: සියල්ල මුළුමනින්ම නොසලකා හරිමින්, සියලු s E
බිටු 0 ක් සහ T
බිටු 1 ක් බවට පත් කරන්න A
. පෙර කොටසේ අවසානයේ විශ්ලේෂණය කිරීමෙන්, මෙම යෝජනා ක්රමය යම් යම් දෝෂ සිදු කරන නමුත් කිසිදු එකක් කේතනය නොකිරීමෙන් සමස්ත ලකුණු ප්රමාණය අඩු කරයි A
. කුඩා බලපෑමක් ලෙස, එය ඇත්ත වශයෙන්ම ඉඟි ගොනුවේ දිගද ඉතිරි කරයි, මන්ද අප අවසන් වන්නේ එක් එක් සඳහා හරියටම එක් බිට් එකක් භාවිතා කරන E
අතර T
, ටිකක් වඩා ටිකක් වැඩි වෙනුවට.
පොඩි ප්රමේයයක්
දෝෂයක් කළ යුත්තේ කවදාදැයි අපි තීරණය කරන්නේ කෙසේද? අපගේ ආකෘතිය අපට ඊළඟ අක්ෂර සඳහා සම්භාවිතා බෙදාහැරීමක් ලබා දෙයි යැයි සිතමු. හැකි අක්ෂර අපි පන්ති දෙකකට වෙන් කරමු: කේතනය කර ඇති අතර කේතනය නොකෙරේ . නිවැරදි අක්ෂර කේතනය කර නොමැති නම්, අපි දිගින් දිගටම කිසිදු වියදමක් නොමැතිව දෝෂයක් පිළිගැනීමට “රිවයින්ඩ්” යාන්ත්රණය භාවිතා කරමු. නිවැරදි අක්ෂරය කේතනය කර ඇත්නම්, ගණිත කේතීකරණය භාවිතයෙන් එය කේතනය කිරීම සඳහා අපි වෙනත් බෙදාහැරීම් Q භාවිතා කරමු.
Q අප තෝරා ගත යුත්තේ කුමන බෙදාහැරීමද? කේත කරන ලද අක්ෂර සියල්ල කේතගත නොකළ අක්ෂරවලට වඩා ඉහළ සම්භාවිතාවක් (P වලින්) තිබිය යුතු බව දැකීම එතරම් අපහසු නොවේ. Q බෙදාහැරීමේ කේතයට ඇතුළත් කළ යුත්තේ කේතගත අක්ෂර පමණි; සියල්ලට පසු, අපි අනෙක් ඒවා කේත කරන්නේ නැත, එබැවින් අපි ඒවා සඳහා එන්ට්රොපිය "වියදම්" නොකළ යුතුය. කේතනය කරන ලද අක්ෂර මත සම්භාවිතා ව්යාප්තිය Q P ට සමානුපාතික විය යුතු බව දැකීම ටිකක් උපක්රමශීලී ය. මෙම නිරීක්ෂණ එකට තැබීමෙන් අදහස් කරන්නේ අප බොහෝ දුරට ඉඩ ඇති අක්ෂර කේත කළ යුතු නමුත් අඩු ඉඩක් ඇති අක්ෂර නොවිය යුතු අතර Q යනු කේතනය කරන ලද අක්ෂර මත නැවත යථා තත්ත්වයට පත් කිරීමයි.
කේතීකරණ අක්ෂර සඳහා යමෙකු තෝරා ගත යුතු "කප්පාදුව" සම්බන්ධයෙන් සිසිල් ප්රමේයයක් ඇති බව තවදුරටත් එය හැරී යයි: ඔබ අවම වශයෙන් 1 / 5.393 ක් වන තාක් දුරට අනෙක් කේතගත කළ අක්ෂර ඒකාබද්ධ වන තාක් දුරට ඔබ කේතයක් කේත කළ යුතුය. 5.393
ඉහත වැඩසටහනේ අවසානයට ආසන්නව පෙනෙන අහඹු නියතයේ පෙනුම මෙය "පැහැදිලි කරයි" . අංක 1 / 5.393 ≈ 0.18542 යනු -p ලොග් (16) - p ලොග් p + (1 + p) ලොග් (1 + p) = 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;
}
එකට ඒ සියල්ල දමා
පෙර කොටස අවාසනාවකට මඳක් තාක්ෂණික ය, නමුත් අපි අනෙක් සියලුම කොටස් එකට දැමුවහොත්, ව්යුහය පහත පරිදි වේ. දී ඇති නිවැරදි චරිතයකින් පසු ඊළඟ චරිතය පුරෝකථනය කිරීමට වැඩසටහන ඉල්ලා සිටින සෑම අවස්ථාවකම:
- මොබී ඩික්ගේ දන්නා නිවැරදි උපසර්ගයට නිවැරදි අක්ෂරය එක් කරන්න.
- පා Mark යේ (මාකෝව්) ආකෘතිය යාවත්කාලීන කරන්න.
- මෙම රහස් සෝස් : කලින් අනුමාන වැරදි නම්, Rewind අංක ගණිතමය විකේතන රාජ්ය සිය රාජ්ය සඳහා පෙර අනුමාන පෙර!
- ඊළඟ අක්ෂර සඳහා සම්භාවිතා ව්යාප්තියක් P පුරෝකථනය කිරීමට මාකෝව් ආකෘතියෙන් විමසන්න.
- පෙර කොටසේ සිට සබ්ට්රවුටින් භාවිතයෙන් P ට Q බවට පරිවර්තනය කරන්න.
- බෙදාහැරීමේ Q ට අනුව, ඉඟි ගොනුවේ ඉතිරි කොටසෙන් අක්ෂරයක් විකේතනය කිරීමට අංක ගණිත විකේතකය අසන්න.
- එහි ප්රති character ලයක් ලෙස අනුමාන කරන්න.
ඉඟි ගොනුවේ කේතනය ඒ හා සමානව ක්රියාත්මක වේ. එවැනි අවස්ථාවක, නිවැරදි ඊළඟ චරිතය කුමක්දැයි වැඩසටහන දනී. එය කේතගත කළ යුතු අක්ෂරයක් නම්, ඇත්ත වශයෙන්ම යමෙකු එය මත අංක ගණිත කේතන ක්රමය භාවිතා කළ යුතුය; නමුත් එය කේතගත නොකළ අක්ෂරයක් නම්, එය ගණිත කේතන ක්රමයේ තත්වය යාවත්කාලීන නොකරයි.
සම්භාවිතා බෙදාහැරීම්, එන්ට්රොපි, සම්පීඩනය සහ අංක ගණිතය වැනි තොරතුරු-න්යායාත්මක පසුබිම ඔබ තේරුම් ගෙන ඇති නමුත් මෙම ලිපිය තේරුම් ගැනීමට උත්සාහ කර අසමත් වුවහොත් (ප්රමේයය සත්ය වන්නේ මන්ද යන්න හැර), අපට දන්වන්න සහ අපට කරුණු නිරවුල් කිරීමට උත්සාහ කළ හැකිය. කියවීමට ස්තූතියි!