गोलोम्ब कोडिंग

गोलोम्ब कोडिंग 1960 के दशक में सोलोमन डब्ल्यू. गोलोम्ब द्वारा आविष्कृत डेटा संपीड़न कोड के समूह का उपयोग करके दोषरहित डेटा संपीड़न विधि है। इस प्रकार ज्यामितीय वितरण का अनुसरण करने वाले अक्षरों में इष्टतम उपसर्ग कोड के रूप में गोलोम्ब कोड होता है, गोलोम्ब कोडिंग को उन स्थितियों के लिए अत्यधिक उपयुक्त बनाना होता है जहां इनपुट स्ट्रीम में छोटे मानों की घटना बड़े मानों की तुलना में अधिक होने की संभावना है।

== राइस कोडिंग                                                                                                                                                                                                                                                      ==

राइस कोडिंग (रॉबर्ट एफ. राइस द्वारा आविष्कार) सरल (किन्तु संभवतः उप-इष्टतम) उपसर्ग कोड का उत्पादन करने के लिए गोलोम्ब कोड के समूह के उपसमुच्चय का उपयोग करने को दर्शाता है। इस प्रकार राइस ने कोड के इस समुच्चय का उपयोग अनुकूली कोडिंग योजना में किया था; राइस कोडिंग या तो उस अनुकूली योजना को संदर्भित कर सकती है या गोलोम्ब कोड के उस उपसमुच्चय का उपयोग कर सकती है। जबकि गोलोम्ब कोड में ट्यून करने योग्य मापदंड होता है जो कोई भी धनात्मक पूर्णांक मान हो सकता है, इस प्रकार राइस कोड वे होते हैं जिनमें ट्यून करने योग्य मापदंड दो की शक्ति है। यह राइस कोड को कंप्यूटर पर उपयोग के लिए सुविधाजनक बनाता है क्योंकि 2 से गुणा और भाग को बाइनरी अंकगणित में अधिक कुशलता से प्रयुक्त किया जा सकता है।

राइस को इस सरल उपसमुच्चय को प्रस्तावित करने के लिए इस तथ्य के कारण प्रेरित किया गया था कि ज्यामितीय वितरण अधिकांशतः समय के साथ भिन्न होते हैं, इस प्रकार स्पष्ट रूप से ज्ञात नहीं होते हैं, या दोनों, इसलिए प्रतीत होता है कि इष्टतम कोड का चयन करना बहुत लाभदायक नहीं हो सकता है।

इस प्रकार राइस कोडिंग का उपयोग कई दोषरहित इमेज संपीड़न और ऑडियो डेटा संपीड़न विधियों में एन्ट्रापी एन्कोडिंग चरण के रूप में किया जाता है।

== अवलोकन                                                                                                                                                                                                                                                               ==

कोडों का निर्माण
गोलोम्ब कोडिंग ट्यून करने योग्य मापदंड $M$ का उपयोग करती है इस प्रकार किसी इनपुट मान को विभाजित करने के लिए $x$ दो भागों $M$, और $r$, शेष में $q$, द्वारा विभाजन का परिणाम प्राप्त करती है। भागफल को यूनरी कोडिंग में भेजा जाता है, इसके बाद शेष को संक्षिप्त बाइनरी एन्कोडिंग में भेजा जाता है। जब $$M=1$$, गोलोम्ब कोडिंग यूनरी कोडिंग के समान है।

गोलोम्ब-राइस कोड को ऐसे कोड के रूप में माना जा सकता है जो बिन की स्थिति के आधार पर संख्या ($q$) दर्शाते हैं, और इस प्रकार अन्दर ऑफसेट ($r$). उदाहरण चित्र स्थिति $q$ दर्शाता है और ऑफसेट $r$ पूर्णांक की एन्कोडिंग के लिए $x$ गोलोम्ब-राइस मापदंड $p(0) = 0.2$ का उपयोग करता है, ज्यामितीय वितरण के बाद स्रोत संभावनाओं के साथ $M = 3$. का उपयोग किया जाता है

औपचारिक रूप से, दोनों भाग निम्नलिखित अभिव्यक्ति द्वारा दिए गए हैं, जहाँ $x$ क्या गैर-ऋणात्मक पूर्णांक को एन्कोड किया जा रहा है:


 * $$q = \left \lfloor \frac{x}{M} \right \rfloor$$

और


 * $$r = x - qM$$.

दोनों $M$ और $q$ बिट्स की परिवर्तनीय संख्याओं का उपयोग करके एन्कोड किया जाता है: इस प्रकार $r$ यूनरी कोड द्वारा, और $q$ द्वारा $r$ राइस कोड के लिए बिट्स, या इनमें से कोई विकल्प $b$ और $M = 3$ गोलोम्ब कोड के लिए बिट्स (अर्थात्। $b$ 2) की घात $$b = \lfloor\log_2(M)\rfloor$$ नहीं है इस प्रकार यदि $$r < 2^{b+1} - M$$, फिर उपयोग करें $M$ एन्कोड करने के लिए बिट्स $b$; अन्यथा, $r$+1 उपयोग करें बिट एन्कोड करने के लिए $b$. स्पष्ट रूप से, $$b=\log_2(M)$$ यदि $r$ 2 की घात है और हम इसके सभी मानों $M$ साथ $r$ बिट्स को एन्कोड कर सकते हैं.

पूर्णांक $b$ गोलोम्ब द्वारा उपचारित बर्नौली प्रक्रिया की रन लंबाई थी, जिसका ज्यामितीय वितरण 0 से प्रारंभ होता है। इस प्रकार मापदंड का सबसे अच्छा विकल्प $x$ संगत बर्नौली प्रक्रिया का फलन है, जिसे मापदंडाइज़ $$p = P(x=0)$$ किया गया है किसी दिए गए बर्नौली परीक्षण में सफलता की संभावना $M$ या तो वितरण का माध्यिका है या माध्यिका ±1 इसे इन असमानताओं द्वारा निर्धारित किया जा सकता है:
 * $$(1-p)^M + (1-p)^{M+1} \leq 1 < (1-p)^{M-1} + (1-p)^M,$$

जिनका समाधान किया जाता है
 * $$M = \left\lceil -\frac{\log(2 -p)}{\log(1-p)}\right\rceil$$.

उदाहरण के लिए $p(0) = 0.2$:
 * $$M = \left\lceil -\frac{\log(1.8)}{\log(0.8)}\right\rceil = \left\lceil 2.634 \right\rceil = 3$$.

इस वितरण के लिए गोलोम्ब कोड समान संभावनाओं के लिए हफ़मैन कोड के समान है, यदि स्रोत मानों के अनंत समुच्चय के लिए हफ़मैन कोड की गणना करना संभव हो जाता है।

हस्ताक्षरित पूर्णांकों के साथ प्रयोग करें
गोलोम्ब की योजना गैर-ऋणात्मक संख्याओं के अनुक्रमों को एन्कोड करने के लिए डिज़ाइन की गई थी। चूँकि, इसे ओवरलैप और इंटरलीव योजना का उपयोग करके ऋणात्मक संख्याओं वाले अनुक्रमों को स्वीकार करने के लिए सरलता से बढ़ाया जाता है, इस प्रकार जिसमें सभी मानों को अद्वितीय और प्रतिवर्ती विधि से कुछ धनात्मक संख्या में पुन: असाइन किया जाता है। अनुक्रम प्रारंभ होता है: 0, −1, 1, −2, 2, −3, 3, −4, 4... n-वां ऋणात्मक मान (अर्थात, $M$) को n पर मैप किया गया है विषम संख्या ($-n$), और उन्हें धनात्मक मान को m-वें सम संख्या ($2n-1$) में मैप किया जाता है. इसे गणितीय रूप से इस प्रकार व्यक्त किया जा सकता है: धनात्मक मान $2m$ को मैप ($$x' = 2|x| = 2x,\ x \ge 0$$) किया गया है, और ऋणात्मक मान $x$ को मैप ($$y' = 2|y| - 1 = -2y - 1,\ y < 0$$) किया गया है इस प्रकार के कोड का उपयोग सरलता के लिए किया जा सकता है, तथापि यह उप-इष्टतम हो वास्तव में दो-तरफा ज्यामितीय वितरण के लिए इष्टतम कोड में इस सहित वितरण मापदंडों के आधार पर गोलोम्ब कोड के कई प्रकार सम्मिलित हैं। == सरल एल्गोरिथ्म                                                                                                                                                                                                                                                                                ==

नीचे राइस-गोलोम्ब एन्कोडिंग है, जहां शेष कोड सरल ट्रंकेटेड बाइनरी एन्कोडिंग का उपयोग करता है, जिसे राइस कोडिंग भी कहा जाता है (अन्य अलग-अलग लंबाई वाली बाइनरी एन्कोडिंग, जैसे अंकगणित या हफमैन एन्कोडिंग, शेष कोड के लिए संभव हैं, यदि शेष कोड का सांख्यिकीय वितरण होता है) समतल नहीं है, और इस प्रकार विशेष रूप से तब जब विभाजन के बाद सभी संभावित शेषफलों का उपयोग नहीं किया जाता है)। इस एल्गोरिदम में, यदि m मापदंड 2 की शक्ति है, तो यह सरल राइस एन्कोडिंग के समान हो जाता है:


 * 1) मापदंड M को पूर्णांक मान पर ठीक करें।
 * 2) N के लिए, एन्कोड किया जाने वाला नंबर खोजे
 * 3) भागफल = q = फ्लोर(n/m)
 * 4) शेष = r = n मोडुलो m
 * 5) कोडवर्ड जेनरेट करें
 * 6) कोड प्रारूप: <कोटिएंट कोड><शेष कोड>, जहाँ
 * 7) कोटिएंट कोड (यूनरी कोडिंग में)
 * 8) 1 बिट्स की q-लंबाई स्ट्रिंग लिखें (वैकल्पिक रूप से, 0 बिट्स की)
 * 9) 0 बिट लिखें (क्रमशः, 1 बिट)
 * 10) शेष कोड (काटे गए बाइनरी एन्कोडिंग में)
 * 11)   माना $$b = \lfloor\log_2(M)\rfloor$$
 * 12)    यदि $$r < 2^{b+1}-M$$ b बिट्स का उपयोग करके बाइनरी प्रतिनिधित्व में कोड r।
 * 13)    यदि $$r \ge 2^{b+1}-M$$ नंबर कोड करें $$r+2^{b+1}-M$$ b + 1 बिट्स का उपयोग करके बाइनरी प्रतिनिधित्व में।

डिकोडिंग:
 * 1) q के एकल प्रतिनिधित्व को डिकोड करें (कोड की प्रारंभ में 1 की संख्या गिनें)
 * 2) 0 सीमांकक छोड़ें
 * 3) माना $$b = \lfloor\log_2(M)\rfloor$$
 * 4) अगले b बिट्स को बाइनरी नंबर r' के रूप में समझें। यदि $$r' < 2^{b+1}-M$$ रखता है, फिर अनुस्मारक $$ r = r' $$ है
 * 5) अन्यथा b + 1 बिट्स को बाइनरी नंबर r' के रूप में समझें, अनुस्मारक $$r = r' - 2^{b+1} + M$$ द्वारा दिया गया है
 * 6) गणना करें $$N = q * M + r$$

उदाहरण
समुच्चय $1 − p(0) &ge; 0.45$. इस प्रकार $$b = \lfloor\log_2(10)\rfloor = 3$$. कटऑफ है $$2^{b+1} - M = 16 - 10 = 6$$.

उदाहरण के लिए, मापदंड का उपयोग करके राइस-गोलोम्ब एन्कोडिंग के साथ $b+1$, दशमलव संख्या 42 को पहले विभाजित किया जाता है इस प्रकार $y$=4 और $q$ = 2, और क्यूकोड के रूप में एन्कोड किया जाएगा ($r$),आरकोड ($q$) = क्यूकोड (4),आरकोड (2) = 11110,010 (आपको आउटपुट स्ट्रीम में अलग करने वाले अल्पविराम को एनकोड करने की आवश्यकता नहीं है, क्योंकि के अंत में 0 है $r$ कोड कब कहने के लिए पर्याप्त है $q$ समाप्त होता है और $r$ प्रारंभ करना q कोड और आरकोड दोनों स्व-सीमांकित हैं)।

रन-लेंथ एन्कोडिंग के लिए उपयोग करें

 * ध्यान दें कि $q$ और $p(0) = 0.2$ पिछले अनुभागों में उपयोग की तुलना में इस अनुभाग में परिवर्तित कर दिया गया है।

दो प्रतीकों की वर्णमाला, या दो घटनाओं, p और q का समुच्चय, संभावनाओं के साथ p और ($M = 10$) क्रमशः, कहाँ $M = 10$, गोलोम्ब कोडिंग का उपयोग एकल Q′s द्वारा अलग किए गए शून्य या अधिक P′s के रन को एन्कोड करने के लिए किया जा सकता है। इस एप्लिकेशन में, मापदंड m की सबसे अच्छी सेटिंग निकटतम पूर्णांक $$- \frac{1}{\log_{2}p}$$ है जब p = 1/2, m = 1, और गोलोम्ब कोड यूनरी से मेल खाता है ($1 – p$ P′s के बाद Q आता है, इसे n के रूप में एन्कोड किया जाता है जिसके बाद शून्य आता है)। यदि सरल कोड वांछित है, तो कोई गोलोम्ब-राइस मापदंड $q$ निर्दिष्ट कर सकता है (अर्थात, गोलोम्ब मापदंड $$M=2^b$$) के निकटतम पूर्णांक तक $$- \log_2(-\log_2 p)$$; चूँकि यह सदैव सबसे अच्छा मापदंड नहीं होता है, यह सामान्यतः सबसे अच्छा राइस मापदंड होता है और इसका संपीड़न प्रदर्शन इष्टतम गोलोम्ब कोड के अधिक निकट होता है। (राइस ने स्वयं ही डेटा के लिए विभिन्न कोड का उपयोग करने का प्रस्ताव दिया जिससे यह पता लगाया जा सके कि कौन सा सबसे अच्छा था। इसके पश्चात् जेट प्रोपल्शन प्रयोगशाला के शोधकर्ता ने कोड मापदंड को अनुकूलित करने या अनुमान लगाने के विभिन्न विधियों का प्रस्ताव दिया था। )

बाइनरी भाग वाले राइस कोड का उपयोग करने पर विचार करें $r$ बिट्स रन-लेंथ एन्कोड अनुक्रमों के लिए जहां p की संभावना $p$ है. यदि $$\mathbb{P}[\text{bit is part of }k\text{-run}]$$ संभावना है कि बिट का भाग होगा $b$-बिट रन ($$k-1$$ PS और q) और $$(\text{compression ratio of }k\text{-run})$$ उस रन का संपीड़न अनुपात है, जिससे अपेक्षित संपीड़न अनुपात है


 * $$\begin{align}

\mathbb{E}[\text{compression ratio}] &= \sum_{k=1}^\infty (\text{compression ratio of }k\text{-run}) \cdot \mathbb{P}[\text{bit is part of }k\text{-run}] \\ &= \sum_{k=1}^\infty \frac{b+1+\lfloor 2^{-b}(k-1) \rfloor}{k} \cdot kp^{k-1} (1-p)^2 \\ &= (1-p)^2 \sum_{j=0}^\infty (b+1+j) \cdot \sum_{i=j2^b+1}^{(j+1)2^b} p^{i-1} \\ &= (1-p)^2 \sum_{j=0}^\infty (b+1+j) \cdot \left(p^{2^b j} - p^{2^{b} (j+1)}\right) \\ &= (1-p) \cdot \left (b + \sum_{m=0}^\infty p^{2^b m} \right ) \\ &= (1-p) \cdot \left(b + {\left (1-p^{2^b} \right )}^{-1}\right ) \\ \end{align}$$ संपीड़न को अधिकांशतः $$1-\mathbb{E}[\text{compression ratio}]$$ के रूप में व्यक्त किया जाता है, अनुपात संकुचित के लिए $$p \approx 1$$, रन-लेंथ कोडिंग दृष्टिकोण के परिणामस्वरूप एन्ट्रॉपी (सूचना सिद्धांत) के निकट संपीड़न अनुपात होता है। उदाहरण के लिए, राइस कोड का उपयोग करना $$b=6$$ के लिए $$p=0.99$$ पैदावार $b$ संपीड़न, जबकि एन्ट्रापी $p$ सीमा है.

अनुकूली रन-लंबाई गोलोम्ब-राइस एन्कोडिंग
जब पूर्णांकों के लिए संभाव्यता वितरण ज्ञात नहीं होता है, जिससे गोलोम्ब-राइस एनकोडर के लिए इष्टतम मापदंड निर्धारित नहीं किया जा सकता है। इस प्रकार, कई अनुप्रयोगों में, दो-पास दृष्टिकोण का उपयोग किया जाता है: सबसे पहले, डेटा के लिए संभाव्यता घनत्व फलन (पीडीएफ) का अनुमान लगाने के लिए डेटा के ब्लॉक को स्कैन किया जाता है। फिर गोलोम्ब-राइस मापदंड उस अनुमानित पीडीएफ से निर्धारित किया जाता है। उस दृष्टिकोण का सरल बदलाव यह मान लेना है कि पीडीएफ पैरामीट्रिज्ड समूह से संबंधित है, डेटा से पीडीएफ मापदंड का अनुमान लगाएं, और फिर इष्टतम गोलोम्ब-राइस मापदंड की गणना करें। नीचे चर्चा किए गए अधिकांश अनुप्रयोगों में यही दृष्टिकोण उपयोग किया जाता है।

पूर्णांक डेटा को कुशलतापूर्वक एनकोड करने के लिए वैकल्पिक विधि जिसका पीडीएफ ज्ञात नहीं है, या भिन्न हो रहा है, बैकवर्ड-अनुकूली एनकोडर का उपयोग करना है। रन-लेंथ गोलोम्ब-राइस (आरएलजीआर) कोड बहुत ही सरल एल्गोरिदम का उपयोग करके इसे प्राप्त करता है जो गोलोम्ब-राइस मापदंड को ऊपर या नीचे समायोजित करता है, जो निर्भर करता है अंतिम एन्कोडेड प्रतीक. डिकोडर एन्कोडिंग मापदंडों की भिन्नता को ट्रैक करने के लिए उसी नियम का पालन कर सकता है, इसलिए किसी भी अतिरिक्त जानकारी को प्रसारित करने की आवश्यकता नहीं है, केवल एन्कोडेड डेटा सामान्यीकृत गॉसियन पीडीएफ को मानते हुए, जो डेटा में देखे गए आंकड़ों की विस्तृत श्रृंखला को कवर करता है जैसे कि पूर्वानुमान त्रुटियां या मल्टीमीडिया कोडेक्स में गुणांक बदलना, आरएलजीआईआर एन्कोडिंग एल्गोरिदम ऐसे अनुप्रयोगों में बहुत अच्छा प्रदर्शन कर सकता है।

अनुप्रयोग
कई सिग्नल कोडेक्स पूर्वानुमान अवशेषों के लिए राइस कोड का उपयोग करते हैं। भविष्य कहनेवाला एल्गोरिदम में, ऐसे अवशेष दो-तरफा ज्यामितीय वितरण में आते हैं, जिसमें छोटे अवशेष बड़े अवशेषों की तुलना में अधिक बार होते हैं, और राइस कोड हफ़मैन तालिका को प्रसारित करने के ओवरहेड के बिना इस तरह के वितरण के लिए हफ़मैन कोड का सूक्ष्म से अनुमान लगाता है। एक संकेत जो ज्यामितीय वितरण से मेल नहीं खाता है वह साइन तरंग है, क्योंकि विभेदक अवशेष साइनसॉइडल सिग्नल बनाते हैं जिनके मान ज्यामितीय वितरण नहीं बना रहे हैं (उच्चतम और निम्नतम अवशेष मूल्यों में घटनाओं की समान उच्च आवृत्ति होती है, केवल औसत धनात्मक और ऋणात्मक होता है) अवशेष कम बार मिलते हैं)।

कई दोषरहित ऑडियो डेटा संपीड़न, जैसे शॉर्टन (फ़ाइल प्रारूप), एफएलएसी, एप्पल लॉसलेस, और एमपीईजी-4 एएलएस, रैखिक पूर्वानुमान कोडिंग (एप्पल लॉसलेस में एडाप्टिव एफआइआर फ़िल्टर कहा जाता है) के बाद राइस कोड का उपयोग करते हैं। राइस कोडिंग का उपयोग फेलिक्स दोषरहित इमेज कोडेक में भी किया जाता है।

गोलोम्ब-राइस कोडर का उपयोग राइस एल्गोरिथ्म आधारित दोषरहित इमेज कोडेक्स के एन्ट्रापी कोडिंग चरण में किया जाता है। ऐसा ही प्रयोग दिखाया गया संपीड़न अनुपात ग्राफ़ उत्पन्न करता है।

दोषरहित जेपीईजी-एलएस योजना पूर्वानुमान अवशेषों को एनकोड करने के लिए राइस-गोलोम्ब का उपयोग करती है।

रन-लेंथ गोलोम्ब-राइस (आरएलजीआर) गोलोम्ब-राइस कोडिंग का ऊपर उल्लिखित अनुकूली संस्करण, वर्चुअल मशीनों में स्क्रीन कंटेंट को एन्कोड करने के लिए उपयोग किया जाता है। माइक्रोसॉफ्ट रिमोट डेस्कटॉप प्रोटोकॉल का रिमोटएफएक्स घटक का उपयोग किया जाता है।

यह भी देखें

 * इलियास डेल्टा कोडिंग

अग्रिम पठन

 * Golomb, Solomon W. (1966). Run-length encodings. IEEE Transactions on Information Theory, IT--12(3):399--401
 * Robert F. Rice (1979),, "Some Practical Universal Noiseless Coding Techniques", Jet Propulsion Laboratory, Pasadena, California, JPL Publication 79—22, March 1979.
 * Witten, Ian Moffat, Alistair Bell, Timothy. "Managing Gigabytes: Compressing and Indexing Documents and Images." Second Edition. Morgan Kaufmann Publishers, San Francisco CA. 1999 ISBN 1-55860-570-3
 * David Salomon. "Data Compression",ISBN 0-387-95045-1.
 * H. S. Malvar, Adaptive run-length/Golomb–Rice encoding of quantized generalized Gaussian sources with unknown statistics, Proc. Data Compression Conference, 2006.
 * RLGR Entropy Encoding, Microsoft MS-RDPRFX Open Specification, RemoteFX codec for Remote Desktop Protocol.
 * S. Büttcher, C. L. A. Clarke, and G. V. Cormack. Information Retrieval: Implementing and Evaluating Search Engines . MIT Press, Cambridge MA, 2010.
 * S. Büttcher, C. L. A. Clarke, and G. V. Cormack. Information Retrieval: Implementing and Evaluating Search Engines . MIT Press, Cambridge MA, 2010.