সাধারণ বাইনারি ডেটারের দক্ষ সংক্ষেপণ


27

আমার কাছে থেকে 2 এন - 1 পর্যন্ত অর্ডারযুক্ত বাইনারি সংখ্যাযুক্ত একটি ফাইল রয়েছে :02n1

0000000000
0000000001
0000000010
0000000011
0000000100
...
1111111111

7z এই ফাইলটি খুব দক্ষতার সাথে সংকুচিত করেনি (এন = 20, 22 মেগাবাইটের জন্য 300 কেবিতে সংকোচিত হয়েছিল)।

এমন কোনও অ্যালগরিদম রয়েছে যা ডেটার খুব সাধারণ কাঠামোকে চিনতে পারে এবং বেশ কয়েকটি বাইটে ফাইল সংকোচন করতে পারে? এছাড়াও আমি সিএসের কোন ক্ষেত্র বা তথ্য তত্ত্বের মতো স্মার্ট অ্যালগরিদম অধ্যয়ন করে তা জানতে চাই। "এআই" খুব বিস্তৃত হবে, দয়া করে আরও কংক্রিট কীওয়ার্ড প্রস্তাব করুন।
প্রতিসাম্য ধারণার তথ্য সংকোচনের ক্ষেত্রে মৌলিক ভূমিকা পালন করা উচিত, তবে অনুসন্ধান কোয়েরিগুলি "ডেটা সংক্ষেপণের প্রতিসাম্য" এবং "ডেটা সংক্ষেপণে গ্রুপ থিওরি" অবাক করে প্রায় কোনও প্রাসঙ্গিক প্রত্যাবর্তন করে না।


11
কোলমোগোরভ জটিলতা দেখুন, যা কিছুটা অর্থে অনুকূল সংকোচনের (একটি সংযোজক ধ্রুবক পর্যন্ত)। দুর্ভাগ্যক্রমে, কোলমোগোরভ জটিলতা
গণনাযোগ্য

12
আপনার সেই ডেটা সংকোচনের দরকার কেন? আপনি যখনই প্রয়োজন কেবল এটি পুনরায় তৈরি করতে পারবেন না? (যা ইউলফিল্মাস দ্বারা উল্লিখিত কলমোগোরভ জটিলতার পদ্ধতির সাথে ঘনিষ্ঠভাবে জড়িত: কোলমোগোরভ জটিলতা আউটপুটটি উত্পন্ন করার জন্য সংক্ষিপ্ততম প্রোগ্রামের দৈর্ঘ্য)।
ডেভিড রিচার্বি

7
আমি 20 বছর আগে হাই স্কুলে এরকম একটি অ্যালগরিদম লিখেছিলাম। আপনার ইনপুট দেওয়া হয়েছে, এটি একটি "কয়েকটি বাইট" (প্রায় 3,500,000: 1 একটি অনুকূল দৃশ্যে) সংকোচিত হবে। যাইহোক, ডেটা খুব কমই এর মতো দেখা যায়, সুতরাং এটির মতো একটি অ্যালগরিদম থাকা ব্যবহারিক নয়। সাধারণ সংক্ষেপণ অ্যালগরিদমগুলিকে জটিল ধরণের সাথে মোকাবিলা করতে হয়, সাধারণগুলি নয়। রৈখিক ডেটা সঞ্চয় করতে যে কেউই একটি অ্যালগরিদম লিখতে পারে তবে আকর্ষণীয় ডেটা সংরক্ষণ করা চ্যালেঞ্জ।
ফায়ারফক্স 8:58

3
কীভাবে এন = 20 আপনাকে 22 এমবি দেয়? 4 বাইট পূর্ণসংখ্যা ব্যবহার করা হলে আমি 4.2 এমবি
পেয়েছি

3
@ জিক ওহ, ঠিক আছে ভাল এটি সংক্ষেপণের প্রথম ধারণা হতে পারে, একটি বিট উপস্থাপন করতে 8 বিট ব্যবহার না করে।
njzk2

উত্তর:


27

n

0
1
1
1
1
...

O(n)O(1)

nNn

ডিডব্লিউর "সমস্ত বা কিছুই নয়" প্রস্তাবের বিপরীতে, রান-লেংথ এনকোডিং সহ ডেল্টা সংক্ষেপণ আসলে কিছু সহজ রিয়েল-ওয়ার্ল্ড ধরণের সামগ্রী যেমন লো-রেজোলিউশন অডিওর জন্য বুদ্ধিমান সংক্ষেপণ অনুপাত দিতে পারে। (এটি নিম্ন-মানের, খুব কম-স্বল্প এবং স্বল্প-শক্তি অডিও সংকোচনের জন্য উপযুক্ত)


44

অবশ্যই, অবশ্যই অ্যালগরিদম আছে। এখানে আমার অ্যালগরিদম:

  1. 02n1nn

  2. যদি তা না হয় তবে 1 বিট লিখুন, তারপরে ফাইলটির 7z-সংক্ষেপণ লিখুন।

এটি নির্দিষ্ট কাঠামোর ফাইলগুলির জন্য অত্যন্ত দক্ষ।

কথাটি হ'ল: ডেটা সংকোচনে কোনও নিখরচায় দুপুরের খাবার নেই। অন্যকে আরও খারাপ করে সংকোচনের মূল্যে আপনি একটি সংক্ষেপণ অ্যালগরিদম তৈরি করতে সক্ষম হবেন যা এক ধরণের ফাইলকে ভালভাবে সংকুচিত করে। তবে, আপনি যে ফাইলগুলি সংকুচিত করবেন সেগুলির প্রকৃতি সম্পর্কে যদি আপনি কোনও প্রাইমারী কিছু জানেন তবে আপনি সেই নির্দিষ্ট ধরণের ফাইলটির জন্য আপনার অ্যালগরিদমকে অনুকূলিত করতে পারেন।

অঞ্চলটি হ'ল "ডেটা সংক্ষেপণ"। আমাদের ট্যাগ দেখুন এবং ডেটা সংক্ষেপণের পাঠ্যপুস্তকগুলি পড়ুন।


5
একটি সংক্ষেপকের কাজ হ'ল সাধারণ প্যাটার্নগুলি সনাক্ত করা এবং সেগুলি শোষণ করা। এই প্যাটার্নটি অস্বাভাবিক বা অস্পষ্ট নয়। সুতরাং কেন এটি শোষণ করা হচ্ছে না তা জিজ্ঞাসা করা স্বাভাবিক প্রশ্ন। তাকে বলা একটি বাণিজ্য বন্ধ আছে বা তাকে একটি অ্যালগরিদম প্রদান করা যা প্যাটার্নটি ব্যতীত সমস্ত কিছুতে ব্যর্থ।
মেহেরদাবাদ

17
অবশ্যই আমার কাছে অস্বাভাবিক লাগছে। ভাল কমপ্রেসার ধরণের ধরণের তুলনায় এটি বাস্তব জীবনে খুব কমই আসে।
amalloy

17
@ মেহেরদাড এটি কোনও ছদ্মবেশী কপ-আউট নয়: এটি সম্পূর্ণ বিষয় । যে কোনও প্যাটার্ন এক্সের জন্য যা সাধারণভাবে উত্পন্ন এবং কেবল যাচাই করা হয়েছিল, সেখানে একটি সংক্ষেপণ অ্যালগরিদম রয়েছে যা সেই প্যাটার্নটি সন্ধান করে এবং এটির সাথে ডিল করে। সুতরাং এটি "কোনও সংকোচনের অ্যালগরিদম এমন একটি এক্সের সাথে কাজ করে?" এর পাতায় যে কোনও প্রশ্নের উত্তর? অবশ্যই, সবসময় একটি অ্যালগরিদম থাকে যা কিছুটা আরও জটিল নিদর্শনগুলির সন্ধান করে। এবং এমন একটি যা বিজ্ঞাপনের চেয়ে কিছুটা জটিল প্যাটার্নগুলির জন্যও দেখায় । আপনার আপত্তিটি প্রতিষ্ঠিত।
ডেভিড রিচারি

মন্তব্যগুলি বর্ধিত আলোচনার জন্য নয়; এই কথোপকথন চ্যাটে সরানো হয়েছে ।
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

এই নীতিটির একটি চূড়ান্ত প্রয়োগ হ'ল বিটোরেন্ট চৌম্বক লিঙ্কগুলি যেখানে কোনও ফাইল বা কোনও আকারের ফাইলের সংগ্রহগুলি কেবলমাত্র একটি নির্দিষ্ট 160 বিট ডেটাতে উপস্থাপিত (সংকুচিত) হয়। অবশ্যই একটি ঝুঁকি রয়েছে যা হ্যাশের সংঘর্ষ হতে পারে।
slebetman

17

কোনও বিডব্লিউটি (বুড়ো – হুইলারের ট্রান্সফর্ম) ব্যবহার করে যে কোনও কিছুতেই এটি মোটামুটি সংক্ষেপে সক্ষম হওয়া উচিত।

আমার দ্রুত পাইথন পরীক্ষা:

>>> import gzip
>>> import lzma
>>> import zlib
>>> import bz2
>>> import time
>>> dLen = 16
>>> inputData = '\n'.join('{:0{}b}'.format(x, dLen) for x in range(2**dLen))
>>> inputData[:100]
'0000000000000000\n0000000000000001\n0000000000000010\n0000000000000011\n0000000000000100\n000000000000010'
>>> inputData[-100:]
'111111111111010\n1111111111111011\n1111111111111100\n1111111111111101\n1111111111111110\n1111111111111111'
>>> def bwt(text):
    N = len(text)
    text2 = text * 2
    class K:
        def __init__(self, i):
            self.i = i
        def __lt__(a, b):
            i, j = a.i, b.i
            for k in range(N): # use `range()` in Python 3
                if text2[i+k] < text2[j+k]:
                    return True
                elif text2[i+k] > text2[j+k]:
                    return False
            return False # they're equal

    inorder = sorted(range(N), key=K)
    return "".join(text2[i+N-1] for i in inorder)

>>> class nothing:
    def compress(x):
        return x

>>> class bwt_c:
    def compress(x):
        return bwt(x.decode('latin_1')).encode('latin_1')

>>> for first in ('bwt_c', 'nothing', 'lzma', 'zlib', 'gzip', 'bz2'):
    fTime = -time.process_time()
    fOut = eval(first).compress(inputData)
    fTime += time.process_time()
    print(first, fTime)
    for second in ('nothing', 'lzma', 'zlib', 'gzip', 'bz2'):
        print(first, second, end=' ')
        sTime = -time.process_time()
        sOut = eval(second).compress(fOut)
        sTime += time.process_time()
        print(fTime + sTime, len(sOut))

bwt_c 53.76768319200005
bwt_c nothing 53.767727423000224 1114111
bwt_c lzma 53.83853460699993 2344
bwt_c zlib 53.7767307470001 5930
bwt_c gzip 53.782549449000044 4024
bwt_c bz2 54.15730512699997 237
nothing 6.357100005516259e-05
nothing nothing 0.0001084830000763759 1114111
nothing lzma 0.6671195740000258 27264
nothing zlib 0.05987233699988792 118206
nothing gzip 2.307255977000068 147743
nothing bz2 0.07741139000017938 187906
lzma 0.6767229399999906
lzma nothing 0.6767684639999061 27264
lzma lzma 0.6843232409999018 27324
lzma zlib 0.6774435929999072 27280
lzma gzip 0.6774431810001715 27292
lzma bz2 0.6821310499999527 27741
zlib 0.05984937799985346
zlib nothing 0.05989508399989063 118206
zlib lzma 0.09543156799986718 22800
zlib zlib 0.06264000899977873 24854
zlib gzip 0.0639041649999399 24611
zlib bz2 0.07275534999985211 21283
gzip 2.303239570000187
gzip nothing 2.303286251000145 147743
gzip lzma 2.309592880000082 1312
gzip zlib 2.3042639900002087 2088
gzip gzip 2.304663197000309 1996
gzip bz2 2.344431411000187 1670
bz2 0.07537686600016968
bz2 nothing 0.07542737000017041 187906
bz2 lzma 0.11371452700018381 22940
bz2 zlib 0.0785322910001014 24719
bz2 gzip 0.07945505000020603 24605
bz2 bz2 0.09332576600013454 27138

(এখানে নম্বরগুলি 'প্রথম_কম্প্রেসর সেকেন্ড_কম্প্রেসার সময়_বইট_আউট' নেওয়া হয়েছে)

( এখান থেকে তোলা বিডব্লিউটি )

এটি এখনও 'কয়েকটি বাইটস' নয়, তবে একা কেবল জিজিপ করার চেয়ে অনেক ভাল। উদাহরণস্বরূপ, 16-বিট ইনপুটটির জন্য BWT + bz2 1114111 থেকে 237 বাইটে নেমে যায়।

হায়রে, বিডব্লিউটিগুলি অনেক অ্যাপ্লিকেশনগুলির জন্য অনেক ধীর এবং স্মৃতিশক্তিযুক্ত। পাইথনে এটি একটি নির্দোষ বাস্তবায়ন - বিশেষত আমার মেশিনে আমি 2 ** 20 এর আগে র‌্যামের বাইরে চলে যাই।

পাইপির সাহায্যে আমি পুরো 2 ** 20 ইনপুট চালাতে সক্ষম হয়েছি এবং এটি 2611 বাইটে বিডব্লিউটি এর পরে বিজে 2 দিয়ে সংকোচিত হয়। তবে 3 মিনিটের বেশি সময় নিয়েছে এবং 4 গিগাবাইটের বেশি র্যাম ব্যবহৃত হয়েছে ...

এছাড়াও দুর্ভাগ্যক্রমে, এই পদ্ধতির এখনও ও (2 ^ n) আউটপুট স্পেস রয়েছে, এটি প্রদর্শিত হবে - কমপক্ষে কার্ভ-ফিটিং ১.২০ থেকে।


আপনি এগুলি থেকে মুক্তি পেতে পারেন eval: for first in (bwt_c, nothing, lzma, zlib, gzip, bz2):এবং fOut = first.compress(inputData)
ক্যাস্পারড

@ ক্যাস্পার্ড - আমি কীভাবে নাম মুদ্রণ করব? ব্যক্তিগতভাবে, নামগুলি + রেফারেন্স সিঙ্ক করে রাখার চেষ্টা করার চেয়ে কোনও ওভাল কাজটি করা সহজ (এবং কম ত্রুটি-প্রবণ))
TLW

5
প্রথমে bwt এবং তারপরে bz2 এটি চূড়ান্তভাবে ভালভাবে সংকোচিত করে। এটি চূড়ান্তভাবে অদ্ভুত আচরণ এবং সম্ভবত এই সঠিক প্যাটার্নের কারণে। নোট করুন যে আপনি দু'বার bwt করছেন (bz2 BWT এর উপর ভিত্তি করে) যা ফলস্বরূপ খারাপ সংকোচনের ফলাফল দেয় । এছাড়াও নোট করুন যে আজ ডাব্লুএইচটি সাধারণত 4 times block sizeমেমরির (যেমন ~ 4MB এর জন্য) চালায় এবং এর গতিতে >10 MB/s(আমি যেমন একটি বিডব্লিউটি লাইব্রেরি / সংক্ষেপণ অ্যালগরিদমের লেখক) যা অনেকগুলি অ্যাপ্লিকেশনের জন্য বেশ ব্যবহারযোগ্য। নোট করুন যে এমনকি gzip খুব ভাল সংকোচযোগ্য ফলাফল উত্পাদন করে। ভাগ করে নেওয়ার জন্য ধন্যবাদ আমি দুবার bwt ব্যবহারের বিষয়ে কোন গবেষণা সম্পর্কে অবগত নই।
ক্রিস্টোফ

3
ক্রিস্টোফ - আমি জানি যে BZ2 BWT এর উপর ভিত্তি করে ... আমি 'জাস্ট ইউজ বিজে 2' এর প্রভাবটির জন্য একটি উত্তর লিখতে শুরু করেছিলাম, কিন্তু আমি পেয়েছিলাম যে এটি প্রায় সংকুচিত হয়নি, যেমনটি আমার প্রত্যাশা ছিল, গিয়েছিল 'হু ', এবং আমার নিজের BWT আরও ভাল করবে কিনা তা দেখার সিদ্ধান্ত নিয়েছে। শুধুমাত্র আউটপুট জন্য আমার একটি সংক্ষেপক প্রয়োজন, এবং গিয়েছিলাম 'পাশাপাশি কি হয় তা দেখতে বিভিন্ন সংক্ষেপকগুলি চেষ্টা করতে পারেন'।
TLW

1
@ ক্রিসটফ - আমি অন্য চেহারাটি দেখেছি। এই ডেটা 2 বিডব্লিউট এমন কিছু উত্পন্ন করে যা আরএলই এনকোডিংয়ের পক্ষে অত্যন্ত অনুকূল । , যদি আপনার জন্য প্রয়োজনীয় RLE জোড়া সংখ্যা গণনা হিসাবে 0, 1, 2, ... একটি 16 বিট ইনপুটের নেস্টেড BWTs, আপনি 622591 1081343 83 পেতে ...
TLW

10

পিএনজি এনকোডিং আপনি যা চান ঠিক তেমন করে। এটি শুধুমাত্র অত্যন্ত সংগঠিত ডেটা নয়, বাস্তব জীবনের ডেটাতেও কাজ করে।

পিএনজিতে প্রতিটি সারি একটি ফিল্টারের সাথে এনকোড করা থাকে, যার মধ্যে 4 নির্দিষ্ট করা থাকে। এর মধ্যে একটি হ'ল "এই পিক্সেলটিকে এর মান এবং এটির উপরে পিক্সেলের মানের মধ্যে পার্থক্য হিসাবে এনকোড করুন।" ফিল্টার করার পরে ডেটা ডিফল্ট ব্যবহার করে জিপ করা হয়।

এই ফিল্টারিংটি তার উত্তরে বামদিকের চৌকাঠ দ্বারা উল্লিখিত ডেল্টা এনকোডিংয়ের একটি সুনির্দিষ্ট উদাহরণ, রান লেংথ এনকোডিংয়ের সাথে অনুসরণ না করে আপনি আরও শক্তিশালী ডিফল্ট অ্যালগরিদমের সাথে অনুসরণ করেন। এটি একই লক্ষ্য অর্জন করে, কেবলমাত্র কাঙ্ক্ষিত সংকোচনের অনুপাত সরবরাহ করার সময় কেবল ডিফল্টই বিভিন্ন ধরণের ইনপুট পরিচালনা করে।

আর একটি সরঞ্জাম যা প্রায়শই বৈজ্ঞানিক ডেটাতে ব্যবহৃত হয় যেখানে সরল ফিল্টার + ডিফল্ট যথেষ্ট কার্যকর হয় না রাইস এনকোডিং। রাইসে, আপনি প্রথমে সর্বাধিক তাৎপর্যপূর্ণ-বিটগুলি এবং তারপরে ২ য়-সর্বাধিক-তাৎপর্যপূর্ণ-বিটগুলির সমস্ত অংশ, সর্বনিম্ন উল্লেখযোগ্য বিটগুলিতে নেমে যান take তারপরে আপনি ফলাফলটি সংকুচিত করুন। আপনার ডেটাগুলির জন্য যা পিএনজি শৈল ফিল্টারিংয়ের মতো কার্যকরভাবে কার্যকর হবে না (কারণ আপনার ডেটা পিএনজি ফিল্টারিংয়ের জন্য উপযুক্ত ) তবে বৈজ্ঞানিক তথ্যের জন্য এটি ভাল ফলাফলের দিকে ঝোঁকে। অনেকগুলি বৈজ্ঞানিক তথ্যে, আমরা দেখি যে সর্বাধিক উল্লেখযোগ্য বিট ধীরে ধীরে পরিবর্তিত হয়, যখন কমপক্ষে তাত্পর্যপূর্ণ প্রায় এলোমেলো। এটি অত্যন্ত এনট্রপিক ডেটা থেকে অত্যন্ত অনুমানযোগ্য ডেটা আলাদা করে দেয়।

0000000000       00000  most significant bits
0000000001       00000
0000000010  =>   00000
0000000011       00000
0000000100       00000
                 00000
                 00000
                 00001
                 00110
                 01010 least significant bits

5

নির্দিষ্ট কাঠামোর জন্য যে কোনও ব্যবহারিক অ্যালগরিদম অনুসন্ধান করা কেবলমাত্র কাঠামোর মধ্যে সীমাবদ্ধ থাকবে। এই নির্দিষ্ট ক্রমটি সনাক্ত করতে আপনি 7z প্যাচ করতে পারেন, তবে এই নির্দিষ্ট কাঠামোটি কতটা বাস্তব জীবনে ঘটতে চলেছে? এই ইনপুটটির ইনপুটগুলি পরীক্ষা করতে যে সময় লাগে তা পরোয়ানা দেওয়ার পক্ষে যথেষ্ট নয়।

ব্যবহারিকাগুলি একদিকে রেখে, কেউ একটি অ্যালগরিদম হিসাবে নিখুঁত সংক্ষেপক হিসাবে ধারণা নিতে পারে যা একটি প্রদত্ত আউটপুট উত্পাদন করে এমন সংক্ষিপ্ততম প্রোগ্রামটি নির্মাণের চেষ্টা করে। এটি বলার অপেক্ষা রাখে না যে এটি করার কোনও ব্যবহারিক উপায় নেই। এমনকি যদি আপনি সমস্ত সম্ভাব্য প্রোগ্রামের একটি নিষ্ঠুর শক্তি গণনা করে চেষ্টা করেছেন এবং তারা পছন্দসই আউটপুট তৈরি করেছেন কিনা ( পুরোপুরি উন্মাদ ধারণা নয় ) তা পরীক্ষা করে নিলে আপনি হাল্টিং সমস্যার মধ্যে চলে যাবেন , যার অর্থ একটি নির্দিষ্ট সংখ্যার পরে আপনাকে ট্রায়াল রান বাতিল করতে হবে that কার্যকর করার পদক্ষেপগুলির আগে, আপনি জানেন যে এই প্রোগ্রামটি অবশ্যই পছন্দসই আউটপুট উত্পাদন করতে পারে না।

এই জাতীয় একটি শক্তিশালী পদ্ধতির জন্য অনুসন্ধান ট্রি প্রোগ্রামের দৈর্ঘ্যের সাথে তাত্পর্যপূর্ণভাবে বৃদ্ধি পায় এবং সহজ প্রোগ্রামগুলি ব্যতীত সকলের জন্য ব্যবহারিক নয় (5-7 নির্দেশাবলীর মতো কিছু)।


n

1
nnn+1n1

ঠিক আছে, ম্যাথমেটিকার মতো সরঞ্জামগুলি অনেকগুলি সিকোয়েন্সের জন্য ফাংশন সন্ধান করে ...
রাফেল

3

সংক্ষেপণের অনুপাত সম্পূর্ণরূপে লক্ষ্যবস্তু সংক্রামকের উপর নির্ভর করে। যদি ডিকম্প্রেসর ক্রমিক 4 বাইট সংখ্যাগুলি সংখ্যায় 4 বাইটের চেয়ে আরও কমপ্যাক্টভাবে ডিকোড করতে না পারে তবে আপনি এসএল।

বিভিন্ন জিনিস রয়েছে যা ক্রমিক সংখ্যাগুলির এনকোডিংয়ের অনুমতি দেয়। উদাহরণস্বরূপ একটি ডিফারেনশিয়াল এনকোডিং। আপনি একবারে এন বাইট নিন এবং তারপরে বিটগুলির জোর বা জোরটি নিন এবং তারপরে ফলাফলটি সংকোচন করুন। প্রতি বাইট গণনা চেষ্টা করার জন্য এটি এখানে 4 টি বিকল্প যুক্ত করে: পরিচয় a'[i] = a[i]; পার্থক্য a'[i] = a[i-1]-a[i]; বিপরীত পার্থক্য a'[i] = a[i]-a[i-1]; এবং XOR a'[i] = a[i]^a[i-1]। এর অর্থ পদ্ধতিগুলি নির্বাচন করতে 2 টি বিট এবং 4 টির মধ্যে 3 টির জন্য বাইট গণনা যুক্ত করা।

তবে সমস্ত ডেটা স্থির দৈর্ঘ্যের রেকর্ডগুলির ক্রম নয়। ডিফারেনশিয়াল এনকোডিং এর জন্য অর্থবোধ করে না (যতক্ষণ না সংক্ষেপক সংক্ষিপ্তভাবে প্রমাণ করতে পারবেন না যে এটি কিছুটা ডেটার জন্য কাজ করে)।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.