Кіріспе
Деректерді сығыстыру алгоритмдері
Деректерді сығыстыру саласында Клод Шеннон мен Роберт Фаноның есімімен аталған Шеннон-Фано кодтамасы – символдар жиынтығы мен олардың ықтималдығын (бағаланған немесе өлшенген) негізге ала отырып, префикс кодын құрудың екі байланысты әдісінің бірі. Шеннон әдісі бастапқы символға берілген код сөз ұзындығын таңдайтын префикс кодын қолданады. Код сөздерді таңдаудың бір әдеттегі тәсілі – жиынтық ықтималдықтардың екілік кеңейтуін пайдалану. Бұл әдіс Шеннонның «Коммуникацияның математикалық теориясы» (1948) атты мақаласында ұсынылған, ол ақпарат теориясы саласын таныстырды. Фано әдісі бастапқы символдарды екі жиынтыққа («0» және «1») бөледі, олардың ықтималдығы мүмкіндігінше 1/2-ге жақын болуын қамтамасыз етеді. Содан кейін бұл жиынтықтар екіге бөліне береді, әр жиынтықта тек бір символ қалғанша. Бұл символға арналған код сөз – «0» және «1» сандарының тізбегі, ол оның бөліністің қай жартысына тиесілі екенін көрсетеді. Бұл әдіс Фаноның (1949) кейінгі (басылған) техникалық есебінде ұсынылды. Шеннон-Фано кодтары оптималды емес, себебі олар Хэффман кодтамасы сияқты ең төменгі күтілетін код сөз ұзындығына әрқашан жете бермейді. Дегенмен, Шеннон-Фано кодтарының күтілетін код сөз ұзындығы оптималды көрсеткіштен 1 биттен аспайды. Фано әдісі көбінесе Шеннон әдісіне қарағанда күтілетін ұзындығы қысқа кодтауды тудырады. Алайда, Шеннон әдісін теориялық тұрғыдан талдау оңайырақ. Шеннон-Фано кодтамасын Шеннон-Фано-Элиас кодтамасымен (сонымен қатар Элиас кодтамасы деп те аталады) шатастырмау керек, ол арифметикалық кодтаудың алғы күші болып табылады.
In the field of data compression, Shannon–Fano coding, named after Claude Shannon and Robert Fano, is one of two related techniques for constructing a prefix code based on a set of symbols and their probabilities (estimated or measured). Shannon's method chooses a prefix code where a source symbol is given the codeword length One common way of choosing the codewords uses the binary expansion of the cumulative probabilities. This method was proposed in Shannon's "A Mathematical Theory of Communication" (1948), his article introducing the field of information theory. Fano's method divides the source symbols into two sets ("0" and "1") with probabilities as close to 1/2 as possible. Then those sets are themselves divided in two, and so on, until each set contains only one symbol. The codeword for that symbol is the string of "0"s and "1"s that records which half of the divides it fell on. This method was proposed in a later (in print) technical report by Fano (1949). Shannon–Fano codes are suboptimal in the sense that they do not always achieve the lowest possible expected codeword length, as Huffman coding does. However, Shannon–Fano codes have an expected codeword length within 1 bit of optimal. Fano's method usually produces encoding with shorter expected lengths than Shannon's method. However, Shannon's method is easier to analyse theoretically. Shannon–Fano coding should not be confused with Shannon–Fano–Elias coding (also known as Elias coding), the precursor to arithmetic coding.
Атау беру
Екі түрлі кодтың бір атаумен аталуындағы шатастыруға қатысты Krajči және авторлар былай жазады: 1948 жылы Клод Э. Шеннон (1948) және Роберт М. Фано (1949) тәуелсіз түрде дискретті жадсыз көзді тиімді сипаттау үшін екі түрлі кодтау алгоритмін ұсынды. Өкінішке орай, екі схема да әр түрлі болғанына қарамастан, олар екеуі де Шеннон–Фано кодтамасы деген бір атаумен белгілі болды. Бұл шатасудың бірнеше себебі бар. Біріншіден, Шеннон өзінің кодтау схемасын талқылағанда Фаноның схемасын атап өтіп, оны «маңызды жағынан бірдей» деп айтады (Шеннон, 1948, 17-бет [қайта басылым]). Екіншіден, Шеннонның және Фаноның кодтау схемалары екеуі де тиімді, бірақ оптималды емес, ұқсас өнімділігі бар префикстік кодтау схемалары болып табылады. Шеннонның (1948) сөз ұзындығын алдын ала анықтайтын әдісі Ковер мен Томас, Голди мен Пинч, Джонс пен Джонс және Хан мен Кобаяши тарапынан Шеннон–Фано кодтамасы деп аталады. Ал Йеунг оны Шеннонның коды деп атайды. Фаноның (1949) ықтималдықтарды екілік бөлуді пайдаланатын әдісі Саломон мен Гупта тарапынан Шеннон–Фано кодтамасы деп аталады. Krajči және авторлар оны Фано кодтау деп атайды.
Around 1948, both Claude E. Shannon (1948) and Robert M. Fano (1949) independently proposed two different source coding algorithms for an efficient description of a discrete memoryless source. Unfortunately, in spite of being different, both schemes became known under the same name Shannon–Fano coding. There are several reasons for this mixup. For one thing, in the discussion of his coding scheme, Shannon mentions Fano’s scheme and calls it “substantially the same” (Shannon, 1948, p. 17 [reprint]). For another, both Shannon’s and Fano’s coding schemes are similar in the sense that they both are efficient, but suboptimal prefix free coding schemes with a similar performance. Shannon's (1948) method, using predefined word lengths, is called Shannon–Fano coding by Cover and Thomas, Goldie and Pinch, Jones and Jones, and Han and Kobayashi. It is called Shannon coding by Yeung. Fano's (1949) method, using binary division of probabilities, is called Shannon–Fano coding by Salomon and Gupta. It is called Fano coding by Krajči et al.
Шеннон-Фано ағашы
Шеннон-Фано ағашы тиімді код кестесін анықтауға арналған ереже бойынша салынады. Алгоритм өте қарапайым: берілген символдар тізімі үшін, әрбір символдың пайда болу жиілігі белгілі болу үшін, сәйкес ықтималдықтар тізімі немесе жиілік санағы жасалады. Символдар тізімін жиілігі бойынша реттеңіз, ең көп кездесетін символдар сол жақта, ал ең сирек кездесетін символдар оң жақта орналасады. Тізімді екі бөлікке бөліңіз, сол жақ бөліктің жиіліктерінің жалпы сомасы оң жақ бөліктің жиіліктерінің жалпы сомасына мүмкіндігінше жақын болсын. Тізімнің сол жақ бөлігіне 0 екілік цифры, ал оң жақ бөлігіне 1 цифры тағайындалады. Бұл, бірінші бөліктің символдарының кодтары 0-ден басталады, ал екінші бөліктің кодтары 1-ден басталады дегенді білдіреді. 3 және 4-қадамдарды екі бөліктің әрқайсысына қайталап қолданып, топтарды бөліп, әрбір символ ағаштағы тиісті код жапырағына дейін кодтарға биттер қосыңыз.
For a given list of symbols, develop a corresponding list of probabilities or frequency counts so that each symbol’s relative frequency of occurrence is known. Sort the lists of symbols according to frequency, with the most frequently occurring symbols at the left and the least common at the right. Divide the list into two parts, with the total frequency counts of the left part being as close to the total of the right as possible. The left part of the list is assigned the binary digit 0, and the right part is assigned the digit 1. This means that the codes for the symbols in the first part will all start with 0, and the codes in the second part will all start with 1. Recursively apply the steps 3 and 4 to each of the two halves, subdividing groups and adding bits to the codes until each symbol has become a corresponding code leaf on the tree.