فشرده‌سازی داده‌ها

کُدینگ منبع یا کُدگذاری منبع (Source Coding)،: به فشرده‌سازیِ اطلاعات یک منبعِ اطلاعات می‌پردازد (با رمزگذاری اشتباه نشود). منابع اطلاعاتی طبیعی، مانند گفتار یا نوشتار، دارای افزونگی (Redundancy) هستند؛ برای مثال در جمله «من به خانه‌مان برگشتم» ضمایر «من» و «مان» را می‌توان حذف کرد و جمله را این‌گونه نوشت؛ «به خانه برگشتم»، بدون اینکه از مفهوم جمله چیزی کاسته شود. این توضیح را می‌توان معادل با فشرده‌سازی اطلاعات یک منبع اطلاعات دانست؛ بنابراین منظور از فشرده‌سازی اطلاعات کاستن از حجم آن به نحوی است که محتوای آن دچار تغییر نامناسبی نشود.
در علوم کامپیوتر و نظریه اطلاعات، فشرده‌سازی داده‌ها، در واقع فرایند کدکردن اطلاعات با استفاده از تعداد بیت‌هایی کمتر از همان اطلاعاتِ کدنَشده، و با به‌کارگرفتن روش‌های ویژۀ کُدکردن است.
ارسال و دریافت اطلاعات فشرده‌شده، تنها زمانی کار می‌کند که هم فرستنده و هم گیرندهٔ اطلاعات، روش کدکردن را بدانند. به عنوان مثال این نوشته تنها زمانی مفهوم است که گیرنده (خواننده) بداند که در نوشتن آن از زبان فارسی استفاده شده است. به همین ترتیب، دادهٔ فشرده‌سازی شده تنها زمانی مفهوم است که گیرنده روش کدگشایی (دیکُدکردنِ، عکس عمل کدکردن، Decode) آن را بداند.

ضرورت فشرده‌سازی

فشرده‌سازی به این دلیل مهم است که کمک می‌کند مصرف منابع باارزش، مانند فضای هارددیسک یا پهنای باند ارسال، را کاهش دهد، که این نکته در کاهش هزینه و جلوگیری از اتلاف وقت کمک میکند. البته از طرفی دیگر، اطلاعات فشرده‌سازی شده برای اینکه مورد استفاده قرار بگیرند باید از حالت فشرده خارج شوند و این فرایند اضافه ممکن است برای بعضی از برنامه‌های کاربردی زیان‌بار باشد. برای مثال یک روش فشرده‌سازی برای یک فیلم ویدئویی ممکن است نیازمند تجهیزات و سخت‌افزار گران‌قیمتی باشد که بتواند فیلم را با سرعت بالایی از حالت فشرده خارج سازد که بتواند به‌طور هم‌زمان با کدگشایی پخش شود (گزینه‌ای که ابتدا کدگشایی شود و سپس پخش شود، ممکن است به علت کمبود حافظه برای فیلم کدگشایی‌شده امکان‌پذیر نباشد). بنابراین طراحی روش فشرده‌سازی نیازمند موازنه و برآیندگیری عوامل متعددی است. از جمله این عوامل می‌توان درصد فشرده‌سازی، میزان پیچیدگی (اگر از یک روش فشرده‌سازی پر اتلاف استفاده شود) و منابع محاسباتی لازم برای فشرده‌سازی و کدگشایی اطلاعات را نام برد. فشرده‌سازی به دو دسته فشرده‌سازی بااتلاف (فشرده‌سازی با اتلاف) و فشرده‌سازی بهینه فشرده‌سازی بی‌اتلاف تقسیم می‌شوند. کدگذاری منبع، علم مطالعه روش‌های انجام این کار، برای منابع اطلاعات متفاوت است.

فشرده‌سازی بهینه در مقابل بااتلاف

الگوریتم‌های فشرده‌سازی بهینه معمولاً فراوانی آماری را به طریقی به کار می‌گیرند که بتواند اطلاعات فرستنده را خلاصه‌تر و بدون خطا نمایش دهد. فشرده‌سازی بهینه امکان‌پذیر است چون اغلب اطلاعات جهان واقعی دارای فراوانی آماری هستند. برای مثال در زبان فارسی حرف "الف" خیلی بیشتر از حرف "ژ" استفاده می‌شود و احتمال اینکه مثلاً حرف "غین" بعد از حرف "ژ" بیاید بسیار کم است. نوع دیگری از فشرده‌سازی، که فشرده‌سازی پر اتلاف یا کدگذاری ادراکی نام دارد که در صورتی مفید است که درصدی از صحت اطلاعات کفایت کند. به‌طور کلی فشرده‌سازی بااتلاف توسط جستجو روی نحوهٔ دریافت اطلاعات مورد نظر توسط افراد راهنمایی می‌شود. برای مثال، چشم انسان نسبت به تغییرات ظریف در روشنایی حساس تر از تغییرات در رنگ است. فشرده‌سازی تصویر به روش JPEG طوری عمل می‌کند که از بخشی از این اطلاعات کم ارزش تر "صرف نظر" می‌کند. فشرده‌سازی بااتلاف روشی را ارائه می‌کند که بتوان بیشترین صحت برای درصد فشرده‌سازی مورد نظر را به دست‌آورد. در برخی موارد فشرده‌سازی شفاف (نا محسوس) مورد نیاز است؛ در مواردی دیگر صحت قربانی می‌شود تا حجم اطلاعات تا حد ممکن کاهش بیابد.
روش‌های فشرده‌سازی بهینه برگشت پذیرند به نحوی که اطلاعات اولیه قابلیت بازیابی به‌طور دقیق را دارند در حالی که روش‌های بااتلاف، از دست دادن مقداری از اطلاعات را برای دست یابی به فشردگی بیشتر می‌پذیرند.
البته همواره برخی از داده ها وجود دارند که الگوریتم‌های فشرده‌سازی بهینهٔ اطلاعات در فشرده‌سازی آن‌ها ناتوان هستند. در واقع هیچ الگوریتم فشرده‌سازی ای نمی‌تواند اطلاعاتی که هیچ الگوی قابل تشخیصی ندارند را فشرده‌سازی کند. بنابراین تلاش برای فشرده‌سازی اطلاعاتی که قبلاً فشرده‌شده‌اند معمولاً نتیجهٔ عکس داشته (به جای کم کردن حجم، آن را زیاد می‌کند)، هم چنین است تلاش برای فشرده‌سازی هر اطلاعات کدشده‌ای (مگر حالتی که کد بسیار ابتدایی باشد).
در عمل، فشرده‌سازیِ بااتلاف نیز به مرحله‌ای می‌رسد که فشرده‌سازی مجدد دیگر تأثیری ندارد، هرچند یک الگوریتم بسیار بااتلاف، مثلاً الگوریتمی که همواره بایت آخر فایل را حذف می‌کند، همیشه به مرحله‌ای می‌رسد که دیگر فایل تهی می‌شود.
مثالی از یک الگوریتم بااتلاف در مقابل یک الگوریتم بهینه، می‌توان رشتهٔ مقابل است:
۲۵٫۸۸۸۸۸۸۸۸۸
این رشته می‌تواند به روش بهینه به شکل زیر فشرده شود:
۸[۹]۲۵
که خوانده می‌شود "بیست و پنج ممیز ۹ تا هشت"، و رشتهٔ اصلی دقیقاً بازسازی می‌شود و تنها به شکل کوچک تری نوشته می‌شود. در عوض در روش بااتلاف از
۲۶
استفاده می‌شود که مقدار دقیق عبارت در ازای حجم کمتر از دست خواهد رفت.

الگوریتم‌ها و برنامه‌های اجرایی نمونه

مثال فوق مثال بسیار ساده‌ای از یک کدنگاری الگو-طول (کدبندی طول اجرا، که در آن "الگو" عبارت است از رشته‌ای از عناصر که به‌طور متوالی تکرار شده‌است و "طول" تعداد تکرار آن است) است. این روش اغلب برای بهینه‌سازی فضای دیسک در کامپیوترهای اداری یا استفادهٔ بهتر از طول باند اتصال در یک شبکهٔ کامپیوتری به کار می‌رود. برای داده‌های نمادی مانند متن‌ها، صفحه‌گسترده‌ها (Spreadsheet)، برنامه‌های اجرایی و… بی‌اتلاف‌بودن ضروری است زیرا تغییر کردن حتی یک بیت داده قابل قبول نیست (مگر در موارد بسیار محدود). برای داده‌های صوتی و تصویری کاهش قدری از کیفیت بدون از دست دادن طبیعت اصلی داده قابل قبول است. با بهره‌بردن از محدودیت‌های حواس انسان، می‌توان در حجم زیادی از فضا صرفه‌جویی کرد و در عین حال خروجی‌ای تولید کرد که با اصل آن تفاوت محسوسی ندارد. این روش‌های فشرده‌سازی بااتلاف به‌طور کلی یک برآیندگیری سه‌جانبه بین سرعت فشرده‌سازی، حجم نهایی فشرده‌سازی و کیفیت قابل چشم‌پوشی (درصد اتلاف قابل قبول) است.

نظریه

سابقهٔ نظری فشرده‌سازی برای فشرده‌سازی‌های بهینه توسط نظریهٔ اطلاعات (که رابطه نزدیکی با نظریهٔ اطلاعات الگوریتمی دارد) و برای فشرده‌سازی‌های بااتلاف توسط نظریهٔ نرخ-اِعوِجاج (Rate–distortion theory) ارائه شده‌اند. این شاخه‌های مطالعاتی در اصل توسط کلود شانون (Claude Shannon)، که مقالاتی بنیادی در این زمینه در اواخر دهه‌ای ۱۹۴۰ و اوایل دههٔ ۱۹۵۰ به چاپ رسانده است. ایدهٔ فشرده‌سازی رابطهٔ عمیقی با آمار استنباطی دارد.