এলোমেলোভাবে সুটুল


19

সিমুলেটেড কার্ড গেমের জন্য আমি ব্যবহার করছি সত্যিকারের ডেটা। আমি কেবল কার্ডগুলির তালিকায় আগ্রহী, স্যুটগুলিতে নয়। তবে এটি একটি স্ট্যান্ডার্ড কার্ড ডেক তাই ডেকে প্রতিটি র‌্যাঙ্কের মধ্যে কেবল টিই সম্ভব। ডেকটি প্রতিটি হাতের জন্য ভালভাবে বদলানো হয় এবং তারপরে আমি পুরো ডেকটিকে একটি ফাইলে আউটপুট করি। সুতরাং আউটপুট ফাইলে কেবল সম্ভাব্য চিহ্ন রয়েছে যা । ( = দশ পদ)। সুতরাং অবশ্যই আমরা প্রতীক প্রতি বিট ব্যবহার করে এগুলি বিটপ্যাক করতে পারি , তবে তারপরে আমরা সম্ভাব্য এনকোডিংগুলির মধ্যে নষ্ট করছি । আমরা যদি একবারে প্রতীক গ্রুপ করি এবং আরও ভালভাবে করতে পারি তবে সেগুলি সংকুচিত করতে পারি, কারণ524132,3,4,5,6,7,8,9,T,J,Q,K,AT43164134 = এবং যে বরং "সুন্দরভাবে" মধ্যে ফিট করতে পারে পরিবর্তে বিট । তাত্ত্বিক বিটপ্যাকিং সীমাটি প্রতিটি সম্ভাব্য কার্ডের জন্য এলোমেলো চিহ্ন সহ ডেটার জন্য লগ ( ) / লগ ( ) =তবে আমরা এই ডেকে উদাহরণস্বরূপ রাজা থাকতে পারি না । আমাদের প্রতিটি ডেকের প্রতিটি র‌্যাঙ্কের মধ্যে কেবল থাকতে হবে তাই এনট্রপি এনকোডিং প্রতীক হিসাবে প্রায় আধা বিট দ্বারা প্রায় নেমে যায় ।28,56115161323.70044135243.2

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

সুতরাং এই সাইটের আমার প্রশ্নটি হ'ল, অন্যান্য ধরণের অপ্টিমাইজেশানগুলি এই ধরণের ডেটাতে আরও ছোট আউটপুট ফাইল পাওয়া সম্ভব এবং যদি আমরা সেগুলি ব্যবহার করি, তবে আমরা কি কখনও প্রতীক প্রতি বিটের তাত্ত্বিক (সরল) বিটপ্যাকিং এনট্রপিকে বাজে করতে পারি , বা এমনকি প্রতীক হিসাবে গড়ে প্রতি বিট চূড়ান্ত এনট্রপি সীমার কাছে যেতে চান ? যদি তাই হয়, কিভাবে?3.700443.2

আমি যখন জিপ টাইপ প্রোগ্রাম ব্যবহার করি (উদাহরণস্বরূপ উইনজিপ), আমি কেবলমাত্র একটি সংক্ষেপণ সম্পর্কে দেখি , যা আমাকে বলে যে এটি কেবল " বিট " বিটপ্যাকটি বিট করে চলেছে । আমি যদি নিজের বিটপ্যাকিংটি ব্যবহার করে ডেটাটি "প্রি-সংকোচিত" করি তবে এটি আরও ভাল লাগবে বলে মনে হয়, কারণ আমি যখন একটি জিপ প্রোগ্রামের মাধ্যমে এটি চালিত করি তখন আমি সংক্ষেপণের চেয়ে কিছুটা বেশি পেয়ে যাচ্ছি । আমি যা ভাবছি তা হ'ল কেন সমস্ত কম্প্রেশন নিজেই করবেন না (কারণ জিপ প্রোগ্রামের চেয়ে ডেটা সম্পর্কে আমার আরও জ্ঞান আছে)। আমি ভাবছি আমি লগ ( ) / লগ ( ) = এর এনট্রপি "সীমা" কে পরাজিত করতে পারি2:142:11323.70044। আমি সন্দেহ করেছি যে আমি উল্লেখ করা কয়েকটি "কৌশল" দিয়ে আমি আরও কয়েকটি খুঁজে পেতে পারি। অবশ্যই আউটপুট ফাইলটি "মানব পাঠযোগ্য" হতে হবে না। যতক্ষণ না এনকোডিং ক্ষতিবিহীন থাকে এটি বৈধ।

এখানে মিলিয়ন মানব পাঠযোগ্য শফলেড ডেকস ( প্রতি লাইনে ) এর লিঙ্ক রয়েছে। যে কেউ এই লাইনের একটি ছোট উপসেটটিতে "অনুশীলন" করতে পারে এবং তারপরে এটি পুরো ফাইলটিতে ছিঁড়ে যায়। আমি এই ডাটার উপর ভিত্তি করে আমার সেরা (ক্ষুদ্রতম) ফাইলাইজ আপডেট করতে থাকব।31

https://drive.google.com/file/d/0BweDAVsuCEM1amhsNmFITnEwd2s/view

যাইহোক, আপনি যদি এই ডেটাটি কী ধরণের কার্ড গেমের জন্য ব্যবহার করতে আগ্রহী হন তবে আমার সক্রিয় প্রশ্নটির লিঙ্কটি এখানে ( পয়েন্ট বেন্টি সহ) রয়েছে। আমাকে বলা হচ্ছে এটি সমাধান করা (হুবহু) সমাধান করা একটি কঠিন সমস্যা কারণ এটির জন্য বিপুল পরিমাণে ডেটা সঞ্চয় করার জায়গার প্রয়োজন হবে। বেশ কয়েকটি সিমুলেশন যদিও আনুমানিক সম্ভাবনার সাথে একমত হয়। কোনও গাণিতিক সমাধান সরবরাহ করা হয়নি (এখনও)। এটা খুব কঠিন, আমার ধারণা।300

/math/1882705/probability-2-player-card-game-with-multiple-patterns-to-win-who-has-the-advant

আমার কাছে একটি ভাল অ্যালগরিদম রয়েছে যা আমার নমুনা ডেটাতে প্রথম ডেকে এনকোড করার জন্য বিট দেখাচ্ছে । এই ডেটাটি এলোমেলোভাবে ফিশার-ইয়েটস শাফল আলগোরিদিম ব্যবহার করে তৈরি করা হয়েছিল। এটি আসল এলোমেলো তথ্য, সুতরাং আমার নতুন নির্মিত অ্যালগরিদম খুব ভালভাবে কাজ করছে বলে মনে হচ্ছে, যা আমাকে খুশি করে।168

সংক্ষেপণ "চ্যালেঞ্জ" সম্পর্কিত, আমি বর্তমানে প্রতি ডেকে প্রায় 160 বিট এ আছি। আমি মনে করি আমি সম্ভবত 158 এ যেতে পারি Yes হ্যাঁ আমি চেষ্টা করেছি এবং আমি প্রতি ডেকে 158.43 বিট পেয়েছি। আমি মনে করি আমি আমার অ্যালগরিদমের সীমাটির কাছাকাছি চলেছি তাই আমি প্রতি ডেকের চেয়ে 166 বিট নীচে নামতে পেরেছি তবে আমি 156 বিট পেতে ব্যর্থ হয়েছি যা কার্ড প্রতি 3 বিট হবে তবে এটি একটি মজাদার অনুশীলন ছিল। সম্ভবত ভবিষ্যতে আমি প্রতিটি ডেককে গড়ে 2.43 বিট বা তারও বেশি কমানোর জন্য কিছু চিন্তা করব।


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

3
আপনার বিবরণ এবং উত্তরগুলির মধ্যে একটি ধারণার সাথে সাধারণত মিল রয়েছে যা সাধারণত রেঞ্জ এনকোডিং ( en.wikedia.org/wiki/Range_encoding ) নামে পরিচিত । আপনি প্রতিটি কার্ডের পরে সম্ভাব্যতাগুলি অভিযোজন করেন যাতে এটি অবশিষ্ট সম্ভাব্য কার্ডগুলি প্রতিফলিত করে।
এইচ। আইডেন

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

উত্তর:


3

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

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

দুর্ভাগ্যক্রমে এটি আপনার সংকোচনে কতটা সহায়তা করবে তার গণিত জানি না, তবে এই ধারণাটি বিবেচনা করার জন্য দরকারী হতে পারে।


1
খুব মোটামুটিভাবে বলতে গেলে, আপনার যদি কয়েক মিলিয়ন এলোমেলো ডেক থাকে তবে গড় পার্থক্যগুলি সম্পূর্ণ পরিসরের এক (কয়েক মিলিয়নতম) হবে, যার অর্থ আপনি মূল্য প্রতি প্রায় 20-কিছু বিট সংরক্ষণ করতে পারেন। আপনি আপনার ভেরেন্ট এনকোডিংয়ের জন্য কিছুটা হারাবেন।
স্টিভ জেসোপ

2
@ ডেভিডজেমস: যদি ডেকের নির্দিষ্ট ক্রমটি গুরুত্বপূর্ণ না হয়, তবে এর মধ্যে কোনও পক্ষপাত নেই, আপনি decompression এর পরে 3 মিলিয়ন ডেকে পুনরায় পরিবর্তন করতে পারবেন (যেমন ডেকগুলির কোনও পরিবর্তন করবেন না, কেবল ক্রম পরিবর্তন করুন) 3 মিলিয়ন ডেকের তালিকা)।
স্টিভ জেসপ

2
অর্ডারিং তথ্যটি গুরুত্বপূর্ণ না হলে তথ্য কন্টেন্টকে আরও কিছুটা কমাতে কেবল এটিই একটি উপায়; যদি এটি গুরুত্বপূর্ণ হয় তবে এটি প্রযোজ্য নয় এবং এড়ানো যায়। এটি বলেছিল যে, ডেক সেট সেট করার একমাত্র গুরুত্ব যদি এটি 'এলোমেলো' হয় তবে আপনি স্ল্যাম্প্রেশন পরে অর্ডারটি এলোমেলো করতে পারবেন, যেমন @ স্টিভ জেসোপ জানিয়েছেন।
ড্যান ব্রায়ান্ট

@ ডেভিডজেমস দেখে যে আপনার ডেকের প্রথম 173 টি কেকেকে দিয়ে শুরু হয়েছে, এবং অন্যান্য কয়েক মিলিয়ন এর দিকে তাকাচ্ছে না এবং এই সিদ্ধান্তে পৌঁছে যে তারা সকলেই কেকেকে দিয়ে শুরু করে, এটি করা বেশ মূর্খ কাজ। বিশেষত যদি তারা স্পষ্টতই একটি সাজানো ক্রমে থাকে।
ব্যবহারকারী 253751

3
@ ডেভিডজেমস: এই ডেটাটি সংকুচিত করা হয়েছে, এবং ইচ্ছা করলে ডিকম্প্রেশন রুটিন এটি পুনরায় এলোমেলো করতে পারে। "কিছু নিষ্পাপ ব্যক্তি" মোটেই কিছু পাচ্ছে না, এমনকি তারা এটি কার্ডের ডেকে হিসাবে কীভাবে ব্যাখ্যা করবেন তাও তারা বের করতে পারছেন না। এটি কোনও ডেটা স্টোরেজ ফর্ম্যাটে কোনও ত্রুটি নয় (এক্ষেত্রে একটি ক্ষতিকারক ফর্ম্যাট), এটি ব্যবহার করে এমন কাউকে সঠিক তথ্য বের করার জন্য আরটিএফএমের প্রয়োজন।
স্টিভ জেসোপ

34

এখানে একটি সম্পূর্ণ অ্যালগরিদম যা তাত্ত্বিক সীমাতে পৌঁছেছে।

অগ্রণী: পূর্ণসংখ্যার ক্রমগুলি এনকোডিং

13 পূর্ণসংখ্যা ক্রম "সর্বোচ্চ সীমা সঙ্গে পূর্ণসংখ্যা সর্বোচ্চ সীমা সঙ্গে, পূর্ণসংখ্যা ," সর্বোচ্চ সীমা সঙ্গে পূর্ণসংখ্যা , সর্বোচ্চ সীমা সঙ্গে পূর্ণসংখ্যা , ... সঙ্গে পূর্ণসংখ্যা সর্বোচ্চ সীমা " সর্বদা নিখুঁত দক্ষতার সাথে কোড করা যায়।বি - 1 সি - 1 ডি - 1 মি - 1a1b1c1d1m1

  1. প্রথম পূর্ণসংখ্যাটি নিয়ে যান, দ্বারা গুণিত করুন, দ্বিতীয়টি যুক্ত করুন, ফলাফলকে দ্বারা করুন, তৃতীয়টি যুক্ত করুন, ফলকে দিয়ে ,… ফলাফলকে দিয়ে গুণান, ত্রয়োদশ যুক্ত করুন - এবং এটি মধ্যে একটি অনন্য সংখ্যা তৈরি করবে এবং ।মি 0 একটি মি - 1bcdm0abcdefghijklm1
  2. বাইনারি এ নম্বর লিখুন।

বিপরীত পাশাপাশি সহজ। দ্বারা ভাগ করুন এবং বাকীটি হচ্ছে তেরতম পূর্ণসংখ্যা। ফলকে দ্বারা ভাগ করুন এবং বাকীটি দ্বাদশ পূর্ণসংখ্যা। আপনি দ্বারা বিভাজিত না হওয়া পর্যন্ত চালিয়ে যান : বাকীটি দ্বিতীয় পূর্ণসংখ্যা এবং ভাগফলটি প্রথম পূর্ণসংখ্যা হয়।l mlb

সুতরাং আপনার কার্ডগুলিকে সর্বোত্তম পদ্ধতিতে কোড করতে, আমাদের কেবলমাত্র 13-পূর্ণসংখ্যার ক্রম (প্রদত্ত উপরের সীমা সহ) এবং আপনার শিফल्ड কার্ডগুলির বিন্যাসের মধ্যে একটি সঠিক যোগাযোগের সন্ধান করতে হবে।

কিভাবে করতে হবে এখানে আছে।

শাফলিং এবং পূর্ণসংখ্যার ক্রমের মধ্যে চিঠিপত্র

আপনার সামনে টেবিলের মধ্যে 0 টি কার্ডের ক্রম দিয়ে শুরু করুন।

ধাপ 1

আপনার প্যাকটিতে চারটি 2 সেকেন্ড নিয়ে টেবিলে রাখুন on

আপনার কোন পছন্দ আছে? ইতিমধ্যে টেবিলটিতে সিকোয়েন্সের শুরুতে একটি কার্ড বা কার্ড স্থাপন করা যেতে পারে, বা সেই ক্রমের কোনও কার্ডের পরে। সেক্ষেত্রে এর অর্থ হ'ল কার্ড লাগানোর জন্য সম্ভাব্য স্থান রয়েছে।1+0=1

1 টি স্থানে 4 টি কার্ড রাখার মোট সংখ্যা । এবং মধ্যে একটি সংখ্যা হিসাবে সেগুলি প্রতিটি এনকোড করুন । এই জাতীয় 1 নম্বর আছে।0 1 - 11011

আমি 5 পূর্ণসংখ্যার যোগফল হিসাবে 0 লেখার উপায় বিবেচনা করে 1 করেছেন: এটা ।4×3×2×14!

ধাপ ২

আপনার প্যাকটিতে চারটি এস নিন এবং সেগুলি টেবিলে রাখুন।

আপনার কোন পছন্দ আছে? ইতিমধ্যে টেবিলটিতে সিকোয়েন্সের শুরুতে একটি কার্ড বা কার্ড স্থাপন করা যেতে পারে, বা সেই ক্রমের কোনও কার্ডের পরে। সেক্ষেত্রে এর অর্থ হ'ল কার্ড লাগানোর জন্য সম্ভাব্য স্থান রয়েছে।1+4=5

5 টি স্থানে 4 টি কার্ড রাখার মোট সংখ্যা 1 এবং 70 - 1 এর মধ্যে একটি সংখ্যা হিসাবে সেই সমস্ত পথে এনকোড করুন । এরকম 70 টি সংখ্যা রয়েছে।700701

4 লেখার উপায়গুলি 5 টি পূর্ণসংখ্যার যোগফল হিসাবে বিবেচনা করে আমি 70 পেয়েছি: এটি 8×7×6×54!

ধাপ 3

আপনার প্যাকটিতে চারটি গুলি নিয়ে টেবিলের উপরে রাখুন।

আপনার কোন পছন্দ আছে? ইতিমধ্যে টেবিলটিতে সিকোয়েন্সের শুরুতে একটি কার্ড বা কার্ড স্থাপন করা যেতে পারে, বা সেই ক্রমের কোনও কার্ডের পরে। সেক্ষেত্রে এর অর্থ হ'ল কার্ড লাগানোর জন্য সম্ভাব্য জায়গা রয়েছে।1+8=9

9 টি স্থানে 4 টি কার্ড রাখার মোট সংখ্যা 0 এবং 495 - 1 এর মধ্যে একটি সংখ্যা হিসাবে সেই সমস্ত পথে এনকোড করুন । এই জাতীয় সংখ্যা আছে 495।49504951

৫ টি পূর্ণসংখ্যার যোগফল হিসাবে 8 লেখার উপায়গুলি বিবেচনা করে আমি 495 পেয়েছি: এটি 12×11×10×94!

এবং তাই, অবধি ...

পদক্ষেপ 13

আপনার প্যাকের চারটি এসি নিন এবং সেগুলি টেবিলে রাখুন।

আপনার কোন পছন্দ আছে? ইতিমধ্যে টেবিলটিতে সিকোয়েন্সের শুরুতে একটি কার্ড বা কার্ড স্থাপন করা যেতে পারে, বা সেই ক্রমের কোনও কার্ডের পরে। সেক্ষেত্রে এর অর্থ হ'ল কার্ড লাগানোর জন্য সম্ভাব্য জায়গা রয়েছে।1+48=49

49 টি জায়গায় 4 টি কার্ড রাখার মোট সংখ্যা 0 এবং 270725 - 1 এর মধ্যে একটি সংখ্যা হিসাবে সেই সমস্ত পথে এনকোড করুন । এই জাতীয় সংখ্যা আছে 270725।27072502707251

আমি 48 টি লেখার পদ্ধতিগুলি 5 টি পূর্ণসংখ্যার যোগফল হিসাবে বিবেচনা করে 270725 পেয়েছি: এটি 52×51×50×494!


এই পদ্ধতি উৎপাদ মধ্যে একটি 1 টু 1 চিঠিপত্রের (ক) কার্ড যেখানে আপনি মামলা এবং (খ) পূর্ণসংখ্যার ক্রমের যেখানে প্রথম হয় মধ্যে যত্ন সম্পর্কে না এর shufflings এবং 1 - 1 , দ্বিতীয় মধ্যে 0 এবং 70 - 1 , তৃতীয়টি 0 থেকে 495 - 1 এর মধ্যে এবং ত্রয়োদশ অবধি, যা 0 থেকে 270725 - 1 এর মধ্যে রয়েছে01107010495102707251

"এনকোডিং পূর্ণসংখ্যার সিকোয়েন্সগুলি" উল্লেখ করে, আপনি দেখতে পারেন যে পূর্ণসংখ্যার এ জাতীয় ক্রম এবং ( 1 × 70 × 495 × × 270725 ) - 1 এর মধ্যে সংখ্যার সাথে 1-1 চিঠিপত্রের মধ্যে রয়েছে । যদি আপনি প্রতিটি পূর্ণসংখ্যার ( একটি পদক্ষেপের শেষে ইটালিকগুলিতে বর্ণিত হিসাবে ) প্রতিটি সংখ্যার "ফ্যাক্টরিয়াল দ্বারা বিভক্ত" পণ্যটি দেখেন তবে আপনি দেখতে পাবেন যে এর অর্থ 0 এবং 52 এর মধ্যে সংখ্যাগুলি !0(1×70×495××270725)10যা আমার পূর্ববর্তী উত্তরটি দেখিয়েছিল এটি সর্বোত্তম সম্ভব ছিল।

52!(4!)131,

সুতরাং আপনার শাফলযুক্ত কার্ডগুলি সঙ্কুচিত করার জন্য আমাদের কাছে একটি সঠিক পদ্ধতি রয়েছে।


অ্যালগরিদম

5 টি পূর্ণসংখ্যার যোগফল হিসাবে 0 লেখার সমস্ত পদ্ধতির একটি তালিকা তৈরি করুন, 5 টি সংখ্যার যোগফল হিসাবে 4 লেখার, 5 পূর্ণসংখ্যার যোগফল হিসাবে 8 লেখার,… 5 সংখ্যার যোগফল হিসাবে 48 লেখার। দীর্ঘতম তালিকায় 270725 টি উপাদান রয়েছে তাই এটি বিশেষত বড় নয়। (পূর্বনির্মাণ কঠোরভাবে প্রয়োজনীয় নয় কারণ আপনি প্রতিটি তালিকা সহজেই সংশ্লেষ করতে পারবেন এবং যখন আপনার প্রয়োজন হবে: মাইক্রোসফ্ট কুইকব্যাসিকের সাথে চেষ্টা করে এমনকি 270725-উপাদান তালিকাটি চোখের চেয়ে দ্রুত দেখতে পারা যায়)

একটি পরিবর্তন থেকে পূর্ণসংখ্যার ক্রম পেতে:

2 টি কোনওরকম অবদান রাখে না, তাই আসুন এগুলি উপেক্ষা করুন। 0 এবং 1-1 এর মধ্যে একটি সংখ্যা লিখুন।

3 এস: প্রথম 3 এর আগে কতগুলি 2 টি আছে? সেকেন্ডের আগে কত? তৃতীয়? ৪ র্থ? ৪ র্থ পরে? উত্তরটি 5 পূর্ণসংখ্যা যা স্পষ্টত 4 টি যোগ করে তাই আপনার "5 সংখ্যার যোগফল হিসাবে 4 লেখার" তালিকায় 5 পূর্ণসংখ্যার ক্রমটি দেখুন এবং সেই তালিকায় এর অবস্থানটি নোট করুন। এটি 0 এবং 70-1 এর মধ্যে একটি সংখ্যা হবে। এটি লেখ.

4s: প্রথম 4 এর আগে কতগুলি 2s বা 3s রয়েছে? সেকেন্ডের আগে কত? তৃতীয়? ৪ র্থ? ৪ র্থ পরে? উত্তরটি 5 পূর্ণসংখ্যা যা স্পষ্টত 8 পর্যন্ত যোগ করে তাই আপনার "5 পূর্ণসংখ্যার যোগফল হিসাবে 8 লেখার" তালিকায় 5 পূর্ণসংখ্যার ক্রমটি দেখুন এবং সেই তালিকায় এর অবস্থানটি নোট করুন। এটি 0 এবং 495-1 এর মধ্যে একটি সংখ্যা হবে। এটি লেখ.

এবং তাই, অবধি ...

টেক্কা: প্রথম টেক্কা আগে কত নন-এস কার্ড আছে? সেকেন্ডের আগে কত? তৃতীয়? ৪ র্থ? ৪ র্থ পরে? উত্তরটি হ'ল ৫ টি পূর্ণসংখ্যা যা স্পষ্টতই 48 পর্যন্ত যোগ করে "সুতরাং আপনার" 5 সংখ্যার সমষ্টি হিসাবে 48 লিখতে "তালিকার 5 সংখ্যার ক্রমটি দেখুন এবং সেই তালিকায় এর অবস্থানটি নোট করুন। এটি 0 এবং 270725-1 এর মধ্যে একটি সংখ্যা হবে। এটি লেখ.

আপনি এখন 13 টি পূর্ণসংখ্যার লিখেছেন। এগুলিকে এনকোড করুন (পূর্বে বর্ণিত হিসাবে) এবং 52 এর মধ্যে একক সংখ্যায় !0 । বাইনারি এ সংখ্যা লিখুন। এটি মাত্র 166 বিটের নিচে নেবে।52!(4!)13

এটি সর্বোত্তম সম্ভাব্য সংক্ষেপণ, কারণ এটি তথ্য-তাত্ত্বিক সীমাতে পৌঁছে।

ডিকম্প্রেশন সরলভাবে: বড় সংখ্যা থেকে 13 পূর্ণসংখ্যার সিকোয়েন্সে যান এবং তারপরে ইতিমধ্যে বর্ণিত হিসাবে কার্ডগুলির ক্রমটি তৈরি করতে তাদের ব্যবহার করুন।


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

এই সমাধানটি আমার কাছে অস্পষ্ট এবং অসম্পূর্ণ। এটি 166 বিট সংখ্যাটি কীভাবে পেতে এবং ডেকে এটিকে আবার ডিকোড করতে হয় তা দেখায় না। আমার পক্ষে গর্ভধারণ করা মোটেই সহজ নয় তাই আমি এটি বাস্তবায়ন করতে জানি না। আপনার পদক্ষেপ সূত্রটি মূলত আলাদা করে ! / ( 4 ! 13 ) সূত্র 13 টি টুকরো যা সত্যই আমাকে খুব বেশি সাহায্য করে না। আমি মনে করি আপনি কার্ডগুলি সাজানোর সম্ভাব্য 70 টি উপায় সহ আপনি যদি ধাপ 2 এর জন্য ডায়াগ্রাম বা চার্ট তৈরি করেন তবে এটির পক্ষে সহায়তা হত। আপনার সমাধানটি আমার মস্তিষ্কের গ্রহণযোগ্যতা এবং প্রক্রিয়াজাতকরণের জন্য খুব বিমূর্ত। আমি প্রকৃত উদাহরণ এবং চিত্র পছন্দ করি। 52!/(4!13)13
ডেভিড জেমস

23

প্রতিটি কার্ডকে 3 বা 4 বিটের মধ্যে পৃথকভাবে এনকোড করার চেষ্টা করার পরিবর্তে আমি আপনাকে পুরো ডেকের রাজ্যটিকে 166 বিটের মধ্যে এনকোড করার পরামর্শ দিই। মার্টিন কোচানস্কি যেমন ব্যাখ্যা করেছেন , স্যুটগুলি উপেক্ষা করে কার্ডগুলির এরও কম সম্ভাব্য ব্যবস্থা রয়েছে, যাতে তার মানে পুরো ডেকের অবস্থা 166 বিটে সংরক্ষণ করা যায়।2166

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

আরও বিশদে: আসুন ডেকের সঙ্কুচিত প্রতিনিধিত্বের উপর ডিক্সিকোগ্রাফিক অর্ডার ব্যবহার করে ডেকে অর্ডার করুন, অর্থাত, একটি ডেক 22223333444455556666777788889999TTTTJJJJQQQQKKKKAAA এর মতো স্ট্রিং হিসাবে সংক্ষিপ্ত আকারে উপস্থাপিত হয়; আপনি অভিধান সংক্রান্ত ক্রম অনুযায়ী তাদের অর্ডার করতে পারেন। এখন, ধরুন আপনার কাছে এমন একটি পদ্ধতি রয়েছে যা একটি ডেক , এর আগে যে ডেক রয়েছে তার সংখ্যা গণনা করেছে (অভিধানে) তারপরে আপনি এই পদ্ধতিটি একটি ডেকে সংকোচনের জন্য ব্যবহার করতে পারেন: একটি ডেক ডি প্রদত্ত , আপনি তার আগে আসা ডেকের সংখ্যা গণনা করে তারপরে সেই সংখ্যাটি আউটপুট করে একটি 166-বিট সংখ্যায় সংক্ষিপ্ত করুন। এই সংখ্যাটি ডেকের সংকুচিত প্রতিনিধিত্ব।DD

সঙ্কুচিত করতে, বাইনারি অনুসন্ধান ব্যবহার করুন। একটি নম্বর দেওয়া , আপনি খুঁজে পেতে চান এন সব ডেকে নিয়ে lexicographic ক্রম ম ডেক। আপনি বাইনারি অনুসন্ধান লাইনের বরাবর একটি পদ্ধতি ব্যবহার করে এটা করতে পারেন: একটি ডেক বাছাই ডি 0 , আগে ডেকে সংখ্যা গণনা ডি 0 , এবং যে তুলনা এন । এটি আপনাকে ডি 0 ঠিক করতে হবে কিনা তা বলবেnnD0D0nD0আগে বা পরে আসতে আমি আপনাকে প্রত্যাশাটি সঠিকভাবে প্রতীকটি পাওয়ার চেষ্টা করার পরামর্শ দিচ্ছি: আপনি যদি 22223333444455556666777788889999TTTJJJJQQQQKKKKKAAA এর মতো একটি স্ট্রিং পুনরুদ্ধার করতে চান তবে স্ট্রিংয়ে প্রথম প্রতীক হিসাবে কী ব্যবহার করবেন তা সন্ধান করতে প্রথমে অনুসন্ধান করুন (কেবলমাত্র 12 টি সম্ভাবনার চেষ্টা করুন, বা 12 টি সম্ভাবনার উপর বাইনারি অনুসন্ধান ব্যবহার করুন) ), তারপরে আপনি যখন প্রথম চিহ্নের জন্য সঠিক মানটি পেয়েছেন, তখন দ্বিতীয় প্রতীকটি অনুসন্ধান করার জন্য অনুসন্ধান করুন ইত্যাদি on

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


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

8

কার্ডের সম্ভব ব্যবস্থা সংখ্যা উপেক্ষা মামলা হয় যার লগারিদম বেস 2 165.976, বা কার্ড প্রতি 3.1919 বিট, যা আপনি দিয়েছেন সীমা থেকে ভাল।

52!(4!)13,

যে কোনও নির্দিষ্ট "বিট প্রতি কার্ড" এনকোডিংটি কোনও তাৎপর্যপূর্ণ হবে না কারণ আপনি নোট করেছেন যে শেষ কার্ডটি সর্বদা বিটগুলিতে এনকোড করা যায় এবং অনেক ক্ষেত্রে শেষের কয়েকটি কার্ডও হতে পারে। এর অর্থ এই যে প্যাকটির "লেজ" এর দিকে যাওয়ার জন্য প্রতিটি কার্ডের জন্য প্রয়োজনীয় বিটের সংখ্যা আপনার ভাবার চেয়ে অনেক কম হবে less0

তথ্যের সংকোচনের সর্বোত্তম উপায় হ'ল আপনি যে কোনও উপায়ে আপনার কার্ডের ডেটা (59.6 বিট, আসলে) দিয়ে প্যাক করতে চান এমন অন্যান্য ডেটার 59 বিটগুলি খুঁজে পেতে এবং সেই 59 বিটগুলি 13-সংখ্যার মডুলো 24 (= হিসাবে লিখবেন) ), মধ্যে প্রতিটি কার্ড (একটি ডিজিট তা চয়ন করার জন্য একটি মামলা বরাদ্দ 4 ! টেক্কা থেকে মামলা বরাদ্দ পথ, আরেকটি রাজাদের ইত্যাদি) জন্য একই আছে। তারপরে আপনার কাছে 52 টি সম্পূর্ণ স্বতন্ত্র কার্ডের একটি প্যাক রয়েছে। 52 ! সম্ভাবনাগুলি খুব সহজেই 225.58 বিটে এনকোড করা যায়।4!4!52!

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


1
সাইফারটেক্সট চুরির অনুরূপ কোনও ব্যবহার কি এখানে ব্যবহার করা যেতে পারে? হিসাবে, আপনি যে অতিরিক্ত 59 বিটগুলিতে এনকোড করেছেন ডেটাটি এনকোডযুক্ত উপস্থাপনার শেষ 59 বিট?
জন ডিভোরাক

@ জনড আমি এই জাতীয় কিছু তদন্তের বিষয়ে ভাবছিলাম। কিন্তু তখন দেখা গেল যে একটি অ্যালগরিদম বিদ্যমান যা তাত্ত্বিক সীমাটি অর্জন করে এবং সোজা এবং 100% নির্ভরযোগ্য, সুতরাং আরও দেখার কোনও অর্থ নেই।
মার্টিন কোচানস্কি

@ মার্টিনকোয়ানস্কি - আমি এটিকে "উপেক্ষা করা স্যুট" বলে অভিহিত করব না কারণ আমরা এখনও র‌্যাঙ্ক অনুসারে স্ট্যান্ডার্ড 4 স্যুটকে সম্মান করছি। আরও ভাল শব্দভাজন হতে পারে "ডেকের সম্ভাব্য স্বতন্ত্র বিন্যাসের সংখ্যা" ...
ডেভিড জেমস

3

এটি একটি দীর্ঘ সমস্যার সমাধান।

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

https://en.wikipedia.org/wiki/Arithmetic_coding


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

3

[0,52!(4!)13)

aaii

c(a)=(ai)!ai!

যা দ্বিপদী সহগগুলির একটি সাধারণ সাধারণীকরণ, এবং মার্টিন কোচানস্কির পরামর্শ অনুসারে একবারে কেবলমাত্র এক ধরণের জিনিসগুলি সাজিয়ে প্রমাণিত করা যায়। (নীচে দেখুন, নোট 2)

iai>0i

{0if ai=0c(a1,...,ai1,ai1,ai+1,...,an)if ai>0.

এবং উপরের সূত্র দ্বারা, আমাদের আছে

c(a1,...,ai1,ai1,ai+1,...,an)=aic(a)ai

i

c(a)j=1iajj=1naj

kn

এছাড়াও, আমি কেবল কার্ডের নামগুলির চেয়ে পূর্ণসংখ্যার তালিকা ব্যবহার করি এবং - উপরের গণিতগুলির বিপরীতে - পূর্ণসংখ্যা 0-ভিত্তিক হয়।

কোনও পরিবর্তনকে এনকোড করার জন্য, আমরা শ্যাফলের মধ্য দিয়ে চলি, প্রতিটি বিন্দুতে উপরের সূত্রটি ব্যবহার করে একটি ছোট কার্ড দিয়ে শুরু হওয়া শ্যাফেলগুলির সংখ্যা:

from math import factorial
T = factorial(52) // factorial(4) ** 13

def encode(vec):
    a = [4] * 13
    cards = sum(a)
    n = T
    k = 0
    for idx in vec:
        k += sum(a[:idx]) * n // cards
        n = a[idx] * n // cards
        a[idx] -= 1
        cards -= 1
    return k

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

def decode(k):
    vec = []
    a = [4] * 13
    cards = sum(a)
    n = T
    while cards > 0:
        i = cards * k // n
        accum = 0
        for idx in range(len(a)):
            if i < accum + a[idx]:
                k -= accum * n // cards
                n = a[idx] * n // cards
                a[idx] -= 1
                vec.append(idx)
                break
            accum += a[idx]
        cards -= 1
    return vec

আমি উপরের কোডটি অপ্টিমাইজ করার কোনও বাস্তব চেষ্টা করিনি। আমি এটি পুরো 3 মিলিল.টিএক্সএক্সটি ফাইলের বিপরীতে চালিয়েছি, যা পরীক্ষার encode(decode(line))ফলে মূল এনকোডিং হয়েছে; এটি মাত্র 300 সেকেন্ডের মধ্যে নিয়েছিল। ( আদর্শের উপর অন-লাইন টেস্টে সাতটি লাইন দেখা যায় )) নিম্ন স্তরের ভাষায় পুনর্লিখন এবং বিভাগটিকে অনুকূল করা (যা সম্ভব) সম্ভবত সেই সময়টিকে সামঞ্জস্যযোগ্য কিছুতে হ্রাস করতে পারে।

যেহেতু এনকোডযুক্ত মানটি কেবল একটি পূর্ণসংখ্যা, তাই এটি 166 বিটে আউটপুট হতে পারে। নেতৃস্থানীয় শূন্যগুলি মুছে ফেলার কোনও মূল্য নেই, যেহেতু তখন কোনও এনকোডিং বন্ধ হবে তা জানার কোনও উপায় থাকবে না, সুতরাং এটি সত্যই একটি 166-বিট এনকোডিং।

তবে, এটি লক্ষণীয় যে একটি ব্যবহারিক প্রয়োগে, সম্ভবত কখনও কোনও শ্যাফেলকে এনকোড করা প্রয়োজন হয় না; একটি এলোমেলো শ্যাফেল একটি এলোমেলো 166-বিট নম্বর উত্পন্ন করে এবং ডিকোডিং করে তৈরি করা যেতে পারে। এবং এটি সত্যই প্রয়োজনীয় নয় যে সমস্ত 166 বিট এলোমেলো হতে পারে; উদাহরণস্বরূপ, 32-বিট র্যান্ডম পূর্ণসংখ্যার সাথে শুরু করা এবং তারপরে 32-বিট নম্বরযুক্ত কোনও মানক আরএনজি বদ্ধ 166 বিট পূরণ করা সম্ভব হবে। সুতরাং যদি লক্ষ্যটি সহজেই প্রচুর পরিমাণে এলোমেলো শ্যাফলগুলি পুনরুত্পাদনযোগ্যভাবে সঞ্চয় করতে সক্ষম হয় তবে আপনি প্রতি-ডিল স্টোরেজ প্রয়োজন কমবেশি স্বল্প পরিমাণে হ্রাস করতে পারেন।

Nlog2N

N k

  1. plog2N

  2. 2pkpkpN(kp)

  3. 2p0012p+N2p 1N 0

01

N(kp)+N+2pN(kp)+N+NN(kp+2)kp+2

মন্তব্য

  1. 52!(4!)1392024242230271040357108320801872044844750000000000log252!(4!)13165.9765166
  2. Ski=knaia11(S1a1)2(S2a2)(Siai)=Si!ai!(Siai)!=Si!ai!Si+1!

i=1nSi!i=1nai!Si+1!

যা উপরের সূত্রে সরল করে।


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

@rici - আমি আপনাকে +100 অনুগ্রহমূলক কিউজ দিয়েছি যা আপনি কোড সহ আরও ভাল উপস্থাপনা বলে মনে করছেন এমন কিছুর উত্তরগুলি ব্যাখ্যা করেছে যখন অন্য উত্তরগুলি আরও বিমূর্ত / তাত্ত্বিক, কীভাবে প্রকৃতভাবে এনকোড / ডিকোড বাস্তবায়ন করবেন তার কিছু বিবরণ রেখে। আপনি হয়ত জানেন যে কোড লেখার সময় অনেকগুলি বিবরণ রয়েছে। আমি স্বীকার করি যে আমার অ্যালগরিদম সবচেয়ে সোজা, সহজ, না বোঝার পক্ষে সহজ নয় তবে আমি আসলে এটি অনেক প্রচেষ্টা ছাড়াই কাজ করতে পেয়েছি এবং সময়ের সাথে সাথে আমি আরও সংকোচনের সাথে এটি আরও দ্রুত চালিত করতে পারি। সুতরাং আপনার উত্তরের জন্য ধন্যবাদ এবং ভাল কাজ চালিয়ে যান।
ডেভিড জেমস

2

এই সমস্যার বিকল্প সমাধান হিসাবে, আমার অ্যালগোরিদম ডেকের কার্ডগুলির গ্রুপগুলির জন্য কতগুলি অপরিশোধিত র‌্যাঙ্ক বাকি রয়েছে তার উপর ভিত্তি করে কার্ড প্রতি কার্ড যৌগিক ভগ্নাংশ (নন ইন্টিজার) বিট ব্যবহার করে। এটি বরং মার্জিত অ্যালগরিদম 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) আমি কিছুটা অবাক হয়েছি।


3
আমি লক্ষ্য করেছি যে আপনি 9 ঘন্টা ব্যবধানে প্রায় 24 টি সম্পাদনা করেছেন। আমি আপনার উত্তর উন্নতি করতে আপনার ইচ্ছা প্রশংসা করি। যাইহোক, প্রতিবার আপনি উত্তর সম্পাদনা করার সময় এটি প্রথম পৃষ্ঠার শীর্ষে বাধা দেয়। যে কারণে আমরা অতিরিক্ত সম্পাদনা নিরুৎসাহিত করি। আপনি যদি অনেকগুলি সম্পাদনা করার প্রত্যাশা করেন, তবে কি আপনার সম্পাদনাগুলি বেচ করা সম্ভব হবে, তাই আপনি প্রতি কয়েক ঘন্টার মধ্যে কেবল একটি সম্পাদনা করেন? (: এবং "আপডেট" দরিদ্র শৈলী আপনার উত্তর হয় সাধারণত দেখুন উল্লেখ্য, দয়া করে মনে রাখবেন নির্বাণ "Edit"। Meta.cs.stackexchange.com/q/657/755। )
ডিডাব্লিউ

4
এটি অগ্রগতি প্রতিবেদন, স্থিতি আপডেট, বা ব্লগ আইটেম রাখার জায়গা নয়। আমরা "শীঘ্রই আসছি" বা "আমার একটি সমাধান আছে তবে এটি কী তা বর্ণনা করতে যাচ্ছি না", পুরোপুরি গঠিত উত্তরগুলি আমরা চাই।
DW

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

3
@ ডেভিডজেমস, আমি বুঝতে পারি। তবে এটি এখনও আমাদের নির্দেশিকাগুলি পরিবর্তন করে না: দয়া করে এতগুলি সম্পাদনা করবেন না। (আপনি যদি ওয়েবসাইটটিতে উন্নতির প্রস্তাব দিতে চান তবে আমাদের কম্পিউটার সায়েন্স মেটাতে বা মেটা.স্ট্যাকেক্সেঞ্জের ডটকম এ পরামর্শ দেওয়ার জন্য নির্দ্বিধায় পোস্ট করুন Dev দেবগণ এই মন্তব্য থ্রেডটি পড়েন না) তবে এর মধ্যে আমরা আমাদের কাছে থাকা সফ্টওয়্যারটির সাথে কাজ করে এবং অনেকগুলি সম্পাদনা করা নিরুত্সাহিত হয় কারণ এটি প্রশ্নকে শীর্ষে ফেলে দেয়। এই মুহুর্তে, নিজেকে প্রতিদিন একটি সম্পাদনায় সীমাবদ্ধ করা শুটিংয়ের জন্য একটি ভাল গাইডলাইন হতে পারে। অফলাইন সম্পাদক বা স্ট্যাকএডিট ব্যবহার করতে নির্দ্বিধায় যদি এটি সাহায্য করে!
ডিডাব্লিউ

3
আমি বিভিন্ন কারণে আপনার উত্তর upvoting করছি না। 1) এটি অযথা দীর্ঘ এবং এফ এআর খুব ভার্জোজ। আপনি এর উপস্থাপনাটি হ্রাস করতে পারেন। ২) আরও ভাল উত্তর পোস্ট করা আছে, যা আপনি আমার অজানা কারণে অবহেলা করতে বেছে নিয়েছেন। 3) উর্ধ্বগতির অভাব সম্পর্কে জিজ্ঞাসা করা আমার কাছে সাধারণত একটি "লাল পতাকা"। 4) এটি নিরবচ্ছিন্নভাবে সম্পাদনার কারণে প্রথম পৃষ্ঠায় অবিরত থেকেছে।
নিকোলাস মানকুসো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.