এই সমস্যার বিকল্প সমাধান হিসাবে, আমার অ্যালগোরিদম ডেকের কার্ডগুলির গ্রুপগুলির জন্য কতগুলি অপরিশোধিত র্যাঙ্ক বাকি রয়েছে তার উপর ভিত্তি করে কার্ড প্রতি কার্ড যৌগিক ভগ্নাংশ (নন ইন্টিজার) বিট ব্যবহার করে। এটি বরং মার্জিত অ্যালগরিদম is আমি আমার এনকোড অ্যালগরিদমটি হাতে হাতে যাচাই করেছি এবং এটি দেখতে ভাল লাগছে। এনকোডারটি সঠিক বিটস্ট্রিংস (সরলতার জন্য বাইট আকারে) বলে মনে হচ্ছে আউটপুট করছে।
3754A236J7131372613762,748,51722667,108,864241313428,56121532,76815/4=3.7526/7=3.71426/7
54A236J23456789TJQKA547131015,565,9752600111011011000010010010111
2615,565,9751354A236J7
13,12,11...,2,1)13,12,11...21312122125248,832218262,14418/53.61326/73.71455553333
এখানে সম্ভাব্য সমস্ত র্যাঙ্ক দেখতে পাওয়া ব্যয়ের আমার সম্পূর্ণ তালিকা (কার্ড প্রতি বিটসের #):
13 26/7=3.714=3 5/7
12 18/5=3.600=3 3/5
11 7/2=3.500=3 1/2
10 10/3=3.333=3 1/3
9 16/5=3.200=3 1/5
8 3/1=3.000=3
7 17/6=2.833=2 5/6
6 13/5=2.600=2 3/5
5 7/3=2.333=2 1/3
4 2/1=2.000=2
3 5/3=1.667=1 2/3
2 1/1=1.000=1
1 0/1..4=0.0=0
75,6,7,7,7,7,KK1312713K21,2,3...3131720
16813,12,11
10777748747গুলি। যদি ডেক একটি জোড় (যেমন 77 77), ট্রিপল / সেট (যেমন 7 777) বা কোয়াড (যেমন 77 777777) এ শেষ হয় তবে আমরা আমার অ্যালগরিদম ব্যবহার করে সেই ডেকের জন্য অতিরিক্ত সঞ্চয় পাই get
3222613163232
ডেটাফাইলে প্রথম ডেকে, কার্ডগুলির এনকোডিং নিম্নরূপ (পরে আসার জন্য চিত্র)। ফর্ম্যাটটি হ'ল (গ্রুপাইজ, বিটস, র্যাঙ্ক এনকোড মোড):
7,26,1372613
7,26,13
7,26,13
5,18,12
5,18,12
3,10,10
3, 9, 8
6,17, 7
5,13, 6
3, 5, 3
1, 0, 1
521683.23
181/33.23.254545454722772277...322223333444455556666777788889999TTTTJJJJQQQQKKKKAAAA40
1103,7K8101কার্ড বাকি এটি গুরুত্বপূর্ণ কারণ এটি এনকোডিং প্রক্রিয়াটিকে আরও দক্ষ করে তোলে যখন ডিকোডারটি কোনও এনকোডারকে অতিরিক্ত বার্তা প্রেরণ না করে সঠিক অনুমানগুলি তৈরি করতে পারে।
313121110
26 26 26 18 18 10 9 17 13 5 0
54A236J 87726Q3 3969AAA QJK7T 9292Q 36K J57 T8TKJ4 48Q8T 55K 4
13 12 xy 98 7 6 543 2 1 0
2166175168বিট। নোট করুন যে ডেকের শেষে আমরা কেবল একটি মাত্র 4 পেয়েছিলাম তবে পরিবর্তে আমরা সেখানে চারটি 4s পেয়ে গেলে এটি আরও ভাল কেস এবং সেই ডেকটি এনকোড করার জন্য আমাদের কেবল 161 বিটের দরকার হত, এমন ঘটনা যেখানে প্যাকিংটি আসলে মারধর করে এটির অর্ডিনাল অবস্থানের একটি সরল বাইনারি এনকোডের এনট্রপি।
বিট প্রয়োজনীয়তা গণনা করার জন্য আমার কাছে এখন কোডটি প্রয়োগ করা হয়েছে এবং এটি আমাকে 3 মিলিয়ন ডেক পরীক্ষার ফাইলের জন্য কমপক্ষে 155 এবং কম 183 এর সাথে ডেক প্রতি প্রায় 175 বিট দেখায়। সুতরাং আমার অ্যালগরিদম ডেক প্রতি 9 অতিরিক্ত বিট বনাম। অরডিনাল অবস্থান পদ্ধতির সোজা বাইনারি এনকোড ব্যবহার করছে বলে মনে হচ্ছে। অতিরিক্ত 5.5% অতিরিক্ত স্টোরেজ স্পেসে খুব খারাপ নয়। 176 বিট হ'ল 22 বাইট যা ডেক প্রতি 52 বাইটের চেয়ে বেশ খানিকটা ভাল। সেরা কেস ডেক (3 মিলিয়ন ডেক টেস্ট ফাইলটিতে প্রদর্শিত হয়নি) 136 বিট এবং সবচেয়ে খারাপ কেস ডেক প্যাক (8206 বার টেস্টফাইলে প্রদর্শিত হয়নি), 183 বিট। বিশ্লেষণটি খারাপ অবস্থার দেখা দেয় যখন আমরা কার্ডটি বন্ধ না হওয়া অবধি 40 বা প্রথম কোয়াড না পাই 40. তারপর এনকোড মোডটি দ্রুত নামতে চাইলে আমরা "আটকে" ফিলিং ব্লকগুলি (7 টি কার্ড হিসাবে বৃহত্তর) একটি উচ্চতর বিট এনকোডিং মোড। কেউ ভাবতে পারেন যে কার্ড 40 না হওয়া পর্যন্ত কোনও কোয়াড না পাওয়া খুব ভালভাবে বদলে যাওয়া ডেক ব্যবহার করে বিরল হবে, তবে আমার প্রোগ্রামটি আমাকে বলেছে যে এটি 3 মিলিয়ন ডেকের টেস্টফাইলে 321 বার ঘটেছে যাতে এটি প্রতি 9346 ডেকের মধ্যে প্রায় 1 টি হয়। আমি প্রায়শই প্রত্যাশা করতাম। আমি এই কেসটি পরীক্ষা করতে এবং কম বিট দিয়ে পরিচালনা করতে পারি তবে এটি এত বিরল যে এটি যথেষ্ট পরিমাণে গড় বিটগুলিকে প্রভাবিত করবে না।
এছাড়াও এখানে খুব আকর্ষণীয় কিছু। যদি আমি কাঁচা ডেকের ডেটাতে ডেকটি বাছাই করি, উল্লেখযোগ্য # বার পুনরাবৃত্তি করে এমন উপসর্গগুলির দৈর্ঘ্য কেবল দৈর্ঘ্য 6 (যেমন 222244) is তবে প্যাকড ডেটার সাথে, দৈর্ঘ্যটি প্রায় 16 টিতে বেড়ে যায় That এর অর্থ হল যদি আমি প্যাক করা ডেটাগুলি সাজিয়ে রাখি তবে ডিকোডারকে কেবলমাত্র 16 বিট প্রিফিক্স নির্দেশ করে একটি গুরুত্বপূর্ণ সঞ্চয় পেতে সক্ষম হব এবং তারপরে ডেকের বাকী অংশের আউটপুট আউটপুট করব should (পুনরাবৃত্তি উপসর্গ বিয়োগ) যে একই উপসর্গ আছে, তারপরে পরবর্তী উপসর্গ যান এবং পুনরাবৃত্তি। ধরে নিচ্ছি যে আমি এইভাবে ডেকে প্রতি মাত্র 10 টি বিট সংরক্ষণ করি, আমার ডেকের প্রতি 166 বিটগুলি বীট করা উচিত। অন্যদের দ্বারা বর্ণিত গণনার কৌশলটি সহ, আমি নিশ্চিত নই যে উপসর্গটি আমার অ্যালগরিদমের সাথে দীর্ঘতর হবে কিনা। এছাড়াও আমার অ্যালগোরিদম ব্যবহার করে প্যাকিং এবং আনপ্যাকিং গতি আশ্চর্যজনকভাবে ভাল।
দ্বিতীয় স্তরের সংক্ষেপণের বিষয়ে যেখানে আমি আমার অ্যালগরিদমের আউটপুট বিটস্ট্রিংগুলি বাছাই করে তারপরে "পার্থক্য" এনকোডিং ব্যবহার করি: একটি খুব সহজ পদ্ধতি হ'ল 61,278 অনন্য 16 বিট প্রিফিক্স এনকোড করা হবে যা আউটপুট ডেটাতে অন্তত দু'বার প্রদর্শিত হবে (এবং সর্বাধিক 89 বার রিপোর্ট করা হয়েছে) কেবলমাত্র আউটপুটে 0 এর শীর্ষস্থানীয় বিট হিসাবে দ্বিতীয় স্তরের ডিকম্প্রেসরকে বোঝাতে যে আমরা একটি উপসর্গ এনকোড করছি (যেমন 0000111100001111) এবং তারপরে একই উপসর্গের সাথে কোনও প্যাকড ডেকগুলি অনুসরণ করবে 1 টি অগ্রণী বিট প্যাকড ডেকের অ প্রিফিক্স অংশটি নির্দেশ করুন। একই উপসর্গ সহ প্যাকড ডেকগুলির গড় # প্রতিটি উপসর্গের জন্য প্রায় 49 টি, অনন্য কয়েকটি সংখ্যককে অন্তর্ভুক্ত করে না (কেবলমাত্র 1 ডেকের সেই বিশেষ উপসর্গ রয়েছে)। দেখা যাচ্ছে আমি এই সাধারণ কৌশলটি ব্যবহার করে ডেক প্রতি প্রায় 15 বিট সংরক্ষণ করতে পারি (সাধারণ উপসর্গগুলি একবারে সঞ্চয় করে)।
প্রথম এনকোডারটির বাছাই করা বিটস্ট্রিং আউটপুটটির পার্থক্য (উপসর্গ) এনকোডিং ব্যবহার করে দ্বিতীয় স্তরের সংক্ষেপণের পরে, এখন আমি প্রতি ডেকে প্রায় 160 বিট পাচ্ছি। আমি দৈর্ঘ্যের 18 উপসর্গ ব্যবহার করি এবং এটি কেবল অক্ষত সঞ্চয় করি। যেহেতু সম্ভাব্য 18 বিট উপসর্গগুলির প্রায় সমস্ত (262144 = 93.5% এর মধ্যে 245013) প্রদর্শিত আছে, তাই উপসর্গগুলি এনকোড করা আরও ভাল। আমার কাছে কী ধরণের ডেটা আছে তা এনকোড করতে আমি 2 বিট ব্যবহার করতে পারি। 00 = নিয়মিত দৈর্ঘ্যের 18 উপসর্গ সঞ্চিত, 01 = "1 আপ উপসর্গ" (1 যোগ করা পূর্ববর্তী উপসর্গের সমান), 11 = প্রথম স্তরের প্যাকিং থেকে সরাসরি এনকোডিং (গড় প্রায় 175 বিট) 10 = ভবিষ্যতের প্রসারণ যখন আমি এনকোড করার জন্য অন্য কোনও কিছুর কথা ভাবি যা বিটগুলি সংরক্ষণ করবে।
অন্য ডেক প্রতি 160 বিট এখনও কেউ মারলেন? আমি মনে করি আমি উপরে কিছু উল্লিখিত 2 বিট বর্ণনাকারী ব্যবহার করে কিছুটা কমিয়ে আনতে পারি। সম্ভবত এটি 158ish এ নামবে। আমার লক্ষ্য এটি 156 বিট (বা আরও ভাল) এ পাওয়া কারণ এটি কার্ড প্রতি 3 বিট বা তারও কম হবে। খুব চিত্তাকর্ষক. এটিকে স্তরে নামিয়ে আনার জন্য প্রচুর পরীক্ষা-নিরীক্ষা করা হচ্ছে কারণ আমি যদি প্রথম স্তরের এনকোডিংটি পরিবর্তন করি তবে আমাকে পুনরায় পরীক্ষা করতে হবে যা সেরা ২ য় স্তরের এনকোডিং এবং চেষ্টা করার জন্য অনেকগুলি সংমিশ্রণ রয়েছে। আমার করা কিছু পরিবর্তনগুলি অন্যান্য অনুরূপ এলোমেলো তথ্যের জন্য ভাল হতে পারে তবে কিছু এই ডেটাসেটের প্রতি পক্ষপাতদুষ্ট থাকতে পারে। সত্যিই নিশ্চিত নয় তবে আমি যদি অনুরোধ পাই তবে আমি আরও 3 মিলিয়ন ডেক ডেটাসেট চেষ্টা করতে পারি যদি এটিতে একই রকম ফলাফল পাওয়া যায় তবে কী হয় তা দেখার জন্য।
1050
আমার অ্যালগরিদমকে কীভাবে আরও ভাল করা যায় তার মতো কারও কি আমার কোনও ধারণাগুলি রয়েছে যা আমার প্রতিটি ক্ষেত্রে ডোরের জন্য স্টোরের বিট হ্রাস করতে পারে এমন এনকোড করা উচিত? যে কেউ?
আরও 2 টি জিনিস: 1) আমি কিছুটা হতাশ হয়েছি যে আরও বেশি লোক আমার সমাধানটিকে সমর্থন করেনি যা যদিও স্থানের উপর অনুকূল নয় তবে এখনও শালীন এবং প্রয়োগ করা বেশ সহজ (আমি আমার কাজটি ভাল করেই পেয়েছি)। 2) আমি আমার 3 মিলিয়ন ডেক ডেটাফাইলে বিশ্লেষণ করেছি এবং লক্ষ্য করেছি যে 1 ম র্যাঙ্ক পূরণ করে এমন ঘন ঘন ঘন ঘন কার্ডগুলি (যেমন 4444) কার্ড রয়েছে 26. এটি প্রায় 6.711% সময় ঘটে (3 মিলিয়ন ডেকের 201322 সালের জন্য) )। আমি এই তথ্যটি আরও কমপ্রেস করার জন্য ব্যবহার করার প্রত্যাশায় ছিলাম যেমন 12 সিম্বল এনকোড মোডে শুরু হওয়ার পরে আমরা জানি যে গড়পড়তা আমরা কমপক্ষে প্রায় প্রতিটি র্যাঙ্ক দেখতে পাব না তবে এটির ওভারহেডটি সঞ্চয় ছাড়িয়ে গেলে এই পদ্ধতিটি কোনও সংকোচনে ব্যর্থ হয়েছিল। আমি আমার অ্যালগরিদমে কিছু টুইট খুঁজছি যা আসলে বিটগুলি বাঁচাতে পারে।
সুতরাং কারও কি আমার ধারণা আছে যে আমার অ্যালগরিদম ব্যবহার করে ডেকের জন্য কয়েকটি বিট সংরক্ষণ করার জন্য আমার পরবর্তী চেষ্টা করা উচিত? আমি এমন একটি প্যাটার্নটি সন্ধান করছি যা ঘন ঘন পর্যায়ে ঘটে তাই আমি ডেকোডারকে কী প্যাটার্ন আশা করতে হবে তার অতিরিক্ত ওভারহেড পরেও ডেকের প্রতি বিট হ্রাস করতে পারি। আমি বাকি অদেখা কার্ডগুলির প্রত্যাশিত সম্ভাব্যতা নিয়ে কিছু ভাবছিলাম এবং সমস্ত একক কার্ড বাকী সমস্তকে একটি বালতিতে গুঁড়িয়ে দিচ্ছি। এটি আমাকে দ্রুত একটি এনকোড মোডে দ্রুত নেমে যেতে পারে এবং সম্ভবত কিছু বিট সংরক্ষণ করতে পারে তবে আমি সন্দেহ করি।
এছাড়াও, এফওয়াইআই, আমি 10 মিলিয়ন এলোমেলো শ্যাফেল উত্পন্ন করেছি এবং এগুলিকে সহজে বিশ্লেষণের জন্য একটি ডাটাবেসে সংরক্ষণ করেছি। এর মধ্যে কেবল 488 টি একটি কোয়াডে শেষ হয় (যেমন 5555)। যদি আমি কেবল আমার অ্যালগরিদম ব্যবহার করে এমন ব্যক্তিদের প্যাক করি তবে আমি কমপক্ষে 157 বিট এবং 173 বিটের একটি উচ্চতার সাথে গড়ে 165.71712 বিট পাই। অন্যান্য এনকোডিং পদ্ধতিটি ব্যবহার করে 166 বিটের কিছুটা নিচে। এই কেসটি কতোটা বিরল (আমি গড়ে প্রতি 20,492 টির মধ্যে প্রায় 1 জনের মধ্যে 1) আমি কিছুটা অবাক হয়েছি।