শুধুমাত্র 1 মেগাবাইট এবং 1 মিলিয়ন বাইটের মধ্যে পার্থক্যের কারণে একটি সমাধান সম্ভব is ডাবলিকেট অনুমোদিত এবং অযৌক্তিক অর্ডার সহ 1 মিলিয়ন 8-সংখ্যা সংখ্যা নির্বাচন করার জন্য প্রায় 2 পাওয়ার 8093729.5 টির বিভিন্ন উপায় রয়েছে, সুতরাং র্যামের 1 মিলিয়ন বাইট সহ একটি মেশিনের সমস্ত সম্ভাবনার প্রতিনিধিত্ব করার মতো পর্যাপ্ত রাজ্য নেই। তবে 1 এম (টিসিপি / আইপির জন্য 2k কম) 1022 * 1024 * 8 = 8372224 বিট, সুতরাং একটি সমাধান সম্ভব।
পর্ব 1, প্রাথমিক সমাধান
এই পদ্ধতির জন্য 1M এর থেকে কিছুটা বেশি প্রয়োজন, আমি পরে 1 এম এর সাথে ফিট করার জন্য এটি পরিমার্জন করব।
আমি 7-বিট সংখ্যার সাবলিস্টের ক্রম হিসাবে 0 থেকে 99999999 পরিসরে একটি সংক্ষিপ্ত তালিকা অনুসারে তালিকা সঞ্চয় করব। প্রথম সাবলিস্টে 0 থেকে 127 পর্যন্ত সংখ্যা রয়েছে, দ্বিতীয় সাবলিস্টে 128 থেকে 255 পর্যন্ত সংখ্যা রয়েছে, 100000000/128 হ'ল 781250, সুতরাং এই জাতীয় সাবলিস্টের প্রয়োজন হবে।
প্রতিটি সাবলিস্টে একটি 2-বিট সাবলিস্ট শিরোনাম থাকে যার পরে একটি সাবলিস্ট বডি থাকে। সাবলিস্টের বডি সাবলিস্ট এন্ট্রি প্রতি 7 বিট নেয় সাবলিস্টগুলি সমস্ত একত্রে একত্রিত হয় এবং ফর্ম্যাটটি এটি বলতে সক্ষম করে যে কোন সাবলিস্টটি শেষ হয় এবং পরেরটি শুরু হয়। সম্পূর্ণ জনবহুল তালিকার জন্য প্রয়োজনীয় মোট স্টোরেজ 2 * 781250 + 7 * 1000000 = 8562500 বিট, যা প্রায় 1.021 এম-বাইট।
4 টি সাবস্টিস্ট শিরোনামের মানগুলি হ'ল:
00 খালি সাবলিস্ট, কিছুই অনুসরণ করে না।
01 সিঙ্গলটন, সাবলিস্টে কেবল একটি প্রবেশ রয়েছে এবং পরবর্তী 7 বিট এটি ধরে রাখবে।
10 সাবলিস্টটিতে কমপক্ষে 2 টি স্বতন্ত্র সংখ্যা রয়েছে। এন্ট্রিগুলি হ্রাস না করা ক্রমে সংরক্ষণ করা হয়, ব্যতীত শেষ এন্ট্রি প্রথমটির চেয়ে কম বা সমান হয়। এটি সাবলিস্টের শেষটি চিহ্নিত করার অনুমতি দেয়। উদাহরণস্বরূপ, 2,4,6 নম্বরগুলি (4,6,2) হিসাবে সংরক্ষণ করা হবে। 2,2,3,4,4 নম্বরগুলি (2,3,4,4,2) হিসাবে সংরক্ষণ করা হবে।
11 সাবলিস্টে একটি সংখ্যার 2 বা ততোধিক পুনরাবৃত্তি রয়েছে। পরবর্তী 7 বিট নম্বর দেয়। তারপরে শূন্য বা আরও বেশি 7-বিট এন্ট্রি 1 এর সাথে আসবে, তার পরে মান 0 সহ 7-বিট এন্ট্রি হবে the সাবলিস্ট বডিটির দৈর্ঘ্য পুনরাবৃত্তির সংখ্যা নির্দেশ করে। উদাহরণস্বরূপ, 12,12 নম্বর (12,0) হিসাবে সংরক্ষণ করা হবে, 12,12,12 নম্বর (12,1,0) হিসাবে সংরক্ষণ করা হবে, 12,12,12,12 হবে (12,1) , 1,0) এবং আরও অনেক কিছু।
আমি একটি খালি তালিকা দিয়ে শুরু করি, সংখ্যার একগুচ্ছ পড়ি এবং এগুলিকে 32 বিট ইন্টিজার হিসাবে সংরক্ষণ করি, নতুন সংখ্যাটি স্থানে সাজিয়ে রাখি (হিপসোর্ট ব্যবহার করে, সম্ভবত) এবং তারপরে তাদের একটি নতুন কমপ্যাক্ট বাছাই করা তালিকায় মার্জ করি। পড়ার মতো আর সংখ্যা না পাওয়া পর্যন্ত পুনরাবৃত্তি করুন, তারপরে আউটপুট তৈরি করতে আরও একবার কমপ্যাক্ট তালিকায় হাঁটুন।
নীচের লাইনটি তালিকা সংশ্লেষ ক্রিয়াকলাপ শুরুর ঠিক আগে স্মৃতি উপস্থাপন করে। "O" গুলি হ'ল এমন অঞ্চল যা বাছাই করা 32-বিট পূর্ণসংখ্যা রাখে। "এক্স" গুলি সেই অঞ্চল যা পুরাতন কমপ্যাক্টের তালিকাটি ধারণ করে। "=" চিহ্নগুলি হ'ল কমপ্যাক্ট তালিকার সম্প্রসারণ কক্ষ, "ও" এস এর প্রতিটি পূর্ণসংখ্যার জন্য 7 বিট। "জেড" গুলি অন্যান্য র্যান্ডম ওভারহেড।
ZZZOOOOOOOOOOOOOOOOOOOOOOOOOO==========XXXXXXXXXXXXXXXXXXXXXXXXXX
মার্জ রুটিনটি বামদিকে "O" এবং বামদিকে "X" এ পড়া শুরু করে এবং বাম পাশে "=" লেখা শুরু করে। নতুন ইন্টিজারগুলি একত্রিত না হওয়া পর্যন্ত রাইটিং পয়েন্টারটি কমপ্যাক্ট তালিকার পয়েন্ট পয়েন্টারটি ধরে না, কারণ উভয় পয়েন্টার প্রতিটি সাবলিস্টের জন্য 2 বিট এবং পুরানো কমপ্যাক্ট তালিকার প্রতিটি প্রবেশের জন্য 7 বিট অগ্রসর করে এবং এর জন্য পর্যাপ্ত অতিরিক্ত জায়গা রয়েছে নতুন সংখ্যাগুলির জন্য 7-বিট এন্ট্রি।
পার্ট 2, এটি 1 এম এ ক্র্যামিং
উপরের সমাধানটি 1 এম তে চেপে ধরার জন্য, আমার কমপ্যাক্ট তালিকার বিন্যাসটি আরও কিছুটা কমপ্যাক্ট করা দরকার। আমি সাবলিস্ট ধরণের একটি থেকে মুক্তি পাব, যাতে কেবলমাত্র 3 টি পৃথক সাবস্টিস্ট শিরোনামের মান হবে। তারপরে আমি সাবলিস্ট শিরোনামের মান হিসাবে "00", "01" এবং "1" ব্যবহার করতে পারি এবং কয়েকটি বিট সংরক্ষণ করতে পারি। সাবলিস্টের প্রকারগুলি হ'ল:
খালি সাবলিস্ট, কিছুই অনুসরণ করে না।
বি সিঙ্গেলটন, সাবলিস্টে কেবল একটি প্রবেশ আছে এবং পরবর্তী 7 বিট এটি ধারণ করে।
সি সাবলিস্টে কমপক্ষে 2 টি স্বতন্ত্র সংখ্যা ধারণ করে। এন্ট্রিগুলি হ্রাস না করা ক্রমে সংরক্ষণ করা হয়, ব্যতীত শেষ এন্ট্রি প্রথমটির চেয়ে কম বা সমান হয়। এটি সাবলিস্টের শেষটি চিহ্নিত করার অনুমতি দেয়। উদাহরণস্বরূপ, 2,4,6 নম্বরগুলি (4,6,2) হিসাবে সংরক্ষণ করা হবে। 2,2,3,4,4 নম্বরগুলি (2,3,4,4,2) হিসাবে সংরক্ষণ করা হবে।
ডি সাবলিস্টে একটি সংখ্যার 2 বা তার বেশি পুনরাবৃত্তি থাকে।
আমার 3 সাবলিস্টের শিরোনামের মানগুলি "এ", "বি" এবং "সি" হবে, সুতরাং আমার ডি-টাইপ সাবলিস্ট উপস্থাপনের জন্য একটি উপায় প্রয়োজন।
ধরুন আমার কাছে সি-টাইপ সাবলিস্ট শিরোনাম রয়েছে এবং তারপরে 3 টি এন্ট্রি রয়েছে, যেমন "সি [17] [101] [58]"। এটি উপরে বর্ণিত হিসাবে বৈধ সি-ধরণের সাবলিস্টের অংশ হতে পারে না, কারণ তৃতীয় এন্ট্রি দ্বিতীয়টির চেয়ে কম তবে প্রথমটির চেয়ে বেশি more আমি এই ধরণের কনস্ট্রাক্টটি ডি-টাইপ সাবলিস্ট উপস্থাপন করতে ব্যবহার করতে পারি। বিট কথায়, আমার কাছে যে কোনও জায়গায় "C {00 ?????} {1 ??????} {01 ?????}" একটি অসম্ভব সি-টাইপ সাবলিস্ট। আমি এটি একটি সংখ্যার 3 বা ততোধিক পুনরাবৃত্তি সমন্বিত সাবলিস্ট উপস্থাপন করতে ব্যবহার করব। প্রথম দুটি 7-বিট শব্দ নম্বরটি এনকোড করে (নীচে "এন" বিট) এবং তার পরে শূন্য বা আরও {0100001} শব্দ পরে একটি {0100000} শব্দটি আসে।
For example, 3 repetitions: "C{00NNNNN}{1NN0000}{0100000}", 4 repetitions: "C{00NNNNN}{1NN0000}{0100001}{0100000}", and so on.
এটি কেবলমাত্র একক সংখ্যার 2 পুনরাবৃত্তি ধারণ করে এমন তালিকা ছেড়ে দেয়। আমি অন্য একটি অসম্ভব সি-টাইপ সাবলিস্ট প্যাটার্ন সহ তাদের প্রতিনিধিত্ব করব: "সি {0 ??????} {11 ?????} {10 ?????}"। প্রথম 2 টি শব্দের সংখ্যার 7 বিটের জন্য প্রচুর জায়গা রয়েছে, তবে এই প্যাটার্নটি উপস্থাপন করা উপ-তালিকার চেয়ে দীর্ঘতর, যা কিছুটা জটিল করে তোলে। শেষে থাকা পাঁচটি প্রশ্ন-চিহ্নকে প্যাটার্নের অংশ হিসাবে বিবেচনা করা যাবে না, সুতরাং আমার কাছে রয়েছে: "সি {0NNNNNN} N 11N ????} 10" আমার প্যাটার্ন হিসাবে, "এন-এ পুনরাবৃত্তি করা সংখ্যাটি সহ "s। এটি 2 বিট খুব দীর্ঘ।
আমাকে 2 বিট ধার নিতে হবে এবং এই প্যাটার্নে 4 টি অব্যবহৃত বিট থেকে তাদের ফেরত দিতে হবে। "C {0NNNNNN} N 11N00AB} 10" এর মুখোমুখি পড়ার সময়, "N" s তে সংখ্যাটির 2 টি উদাহরণ আউটপুট, বি এবং এ বি দ্বারা শেষদিকে "10" ওভাররাইট করে, এবং পয়েন্ট পয়েন্টারটি 2 দিয়ে রিওয়াইন্ড করুন বিট। এই অ্যালগরিদমের জন্য ধ্বংসাত্মক পাঠগুলি ঠিক আছে, যেহেতু প্রতিটি কমপ্যাক্টের তালিকা কেবল একবারে পায়।
একটি একক সংখ্যার 2 পুনরাবৃত্তির একটি সাবলিস্ট লেখার সময়, "C {0NNNNNN} 11N00" লিখুন এবং ধার করা বিটগুলি 2 এর বিপরীতে সেট করুন যেখানে প্রতিটি লেখায় যেখানে ধার করা বিটের কাউন্টারটি শূন্য নয় সেখানে প্রতিটি বিট লিখিত জন্য এটি হ্রাস করা হয় এবং "10" লেখা হয় যখন কাউন্টার শূন্য হিট হয়। সুতরাং লিখিত পরবর্তী 2 বিটগুলি স্লট এ এবং বিতে যাবে এবং তারপরে "10" শেষের দিকে নামবে।
"00", "01" এবং "1" দ্বারা প্রতিনিধিত্ব করা 3 টি সাবলিস্ট শিরোনামের মান সহ, আমি "1" সর্বাধিক জনপ্রিয় সাবলিস্ট টাইপের জন্য নির্ধারণ করতে পারি। সাবলিস্টের ধরণের তালিকাতে শিরোনামের শিরোনামের মানগুলির মানচিত্রের জন্য আমার একটি ছোট টেবিলের প্রয়োজন হবে এবং প্রতিটি সাবলিস্টের ধরণের জন্য আমার একটি উপস্থিতি কাউন্টারের প্রয়োজন হবে যাতে আমি জানতে পারি যে সেরা সাবলিস্ট শিরোনাম ম্যাপিংটি কী।
সমস্ত সাবলিস্টের প্রকারগুলি সমানভাবে জনপ্রিয় হলে পুরোপুরি জনবহুল সংক্ষিপ্ত তালিকার সর্বনিম্ন প্রতিনিধিত্ব ঘটে। সেক্ষেত্রে আমি প্রতি 3 সাবলিস্ট শিরোনামের জন্য 1 বিট সংরক্ষণ করি, তাই তালিকার আকার 2 * 781250 + 7 * 1000000 - 781250/3 = 8302083.3 বিট। 32 বিট শব্দের বাউন্ডারি পর্যন্ত গোলাকার, 8302112 বিট বা 1037764 বাইটের গণ্ডি।
টিসিপি / আইপি রাজ্য এবং বাফারগুলির জন্য 1 এম বিয়োগ 2 কে 1022 * 1024 = 1046528 বাইট, আমাকে খেলতে 8764 বাইট রেখে।
তবে সাবলিস্ট শিরোনাম ম্যাপিং পরিবর্তন প্রক্রিয়া সম্পর্কে কি? নীচের স্মৃতি মানচিত্রে, "জেড" হল এলোমেলো ওভারহেড, "=" মুক্ত স্থান, "এক্স" কমপ্যাক্ট তালিকা list
ZZZ=====XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
বামতম "এক্স" থেকে পড়া শুরু করুন এবং বাম পাশে "=" এ লেখা শুরু করুন এবং ডানদিকে কাজ করুন। এটি সম্পন্ন হওয়ার পরে কমপ্যাক্টের তালিকাটি কিছুটা ছোট হবে এবং এটি মেমরির ভুল প্রান্তে থাকবে:
ZZZXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX=======
সুতরাং তখন আমার এটি ডানদিকে নামানো দরকার:
ZZZ=======XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
শিরোনাম ম্যাপিং পরিবর্তন প্রক্রিয়াতে, সাবলিস্ট শিরোনামগুলির 1/3 টি পর্যন্ত 1-বিট থেকে 2-বিটে পরিবর্তন হবে। সবচেয়ে খারাপ ক্ষেত্রে এগুলি সমস্ত তালিকার শীর্ষে থাকবে, সুতরাং আমি শুরুর আগে আমার কমপক্ষে 781250/3 বিট ফ্রি স্টোরেজ প্রয়োজন, যা আমাকে কমপ্যাক্ট তালিকার পূর্ববর্তী সংস্করণটির মেমরির প্রয়োজনীয়তাগুলিতে ফিরিয়ে নিয়ে যায়: (
এটি পেতে, আমি 781250 টি সাবলিস্টগুলিকে প্রতিটি 78125 সাবলিস্টের 10 টি সাবলিস্ট গ্রুপে বিভক্ত করব। প্রতিটি গ্রুপের নিজস্ব স্বতন্ত্র সাবলিস্ট শিরোনাম ম্যাপিং রয়েছে। দলগুলির জন্য A থেকে J অক্ষর ব্যবহার:
ZZZ=====AAAAAABBCCCCDDDDDEEEFFFGGGGGGGGGGGHHIJJJJJJJJJJJJJJJJJJJJ
প্রতিটি সাবলিস্ট গোষ্ঠী একটি সাবলিস্ট শিরোনাম ম্যাপিং পরিবর্তনের সময় সঙ্কুচিত বা একই থাকে:
ZZZ=====AAAAAABBCCCCDDDDDEEEFFFGGGGGGGGGGGHHIJJJJJJJJJJJJJJJJJJJJ
ZZZAAAAAA=====BBCCCCDDDDDEEEFFFGGGGGGGGGGGHHIJJJJJJJJJJJJJJJJJJJJ
ZZZAAAAAABB=====CCCCDDDDDEEEFFFGGGGGGGGGGGHHIJJJJJJJJJJJJJJJJJJJJ
ZZZAAAAAABBCCC======DDDDDEEEFFFGGGGGGGGGGGHHIJJJJJJJJJJJJJJJJJJJJ
ZZZAAAAAABBCCCDDDDD======EEEFFFGGGGGGGGGGGHHIJJJJJJJJJJJJJJJJJJJJ
ZZZAAAAAABBCCCDDDDDEEE======FFFGGGGGGGGGGGHHIJJJJJJJJJJJJJJJJJJJJ
ZZZAAAAAABBCCCDDDDDEEEFFF======GGGGGGGGGGGHHIJJJJJJJJJJJJJJJJJJJJ
ZZZAAAAAABBCCCDDDDDEEEFFFGGGGGGGGGG=======HHIJJJJJJJJJJJJJJJJJJJJ
ZZZAAAAAABBCCCDDDDDEEEFFFGGGGGGGGGGHH=======IJJJJJJJJJJJJJJJJJJJJ
ZZZAAAAAABBCCCDDDDDEEEFFFGGGGGGGGGGHHI=======JJJJJJJJJJJJJJJJJJJJ
ZZZAAAAAABBCCCDDDDDEEEFFFGGGGGGGGGGHHIJJJJJJJJJJJJJJJJJJJJ=======
ZZZ=======AAAAAABBCCCDDDDDEEEFFFGGGGGGGGGGHHIJJJJJJJJJJJJJJJJJJJJ
ম্যাপিং পরিবর্তনের সময় সাবলিস্ট গোষ্ঠীর অস্থায়ী প্রসারণটি 412-এর নীচে 78125/3 = 26042 বিট হয়। যদি আমি 4k প্লাস 1037764 বাইটগুলিকে সম্পূর্ণ জনবহুল কমপ্যাক্ট তালিকার জন্য অনুমতি দেয় তবে এটি আমাকে স্মৃতি মানচিত্রে "জেড" এর জন্য 8764 - 4096 = 4668 বাইট ছেড়ে যায়।
এটি 10 সাবলিস্ট শিরোনাম ম্যাপিং টেবিল, 30 সাবলিস্ট শিরোলেখের উপস্থিতি গণনা এবং অন্যান্য কয়েকটি কাউন্টার, পয়েন্টার এবং ছোট বাফারগুলির জন্য প্রচুর পরিমাণে হওয়া উচিত, এবং ফাংশন কল রিটার্ন ঠিকানাগুলির জন্য স্ট্যাক স্পেসের মতো জায়গা আমি লক্ষ্য না করেই ব্যবহার করেছি and স্থানীয় পরিবর্তনশীল।
পার্ট 3, এটি চালাতে কত সময় লাগবে?
একটি খালি কমপ্যাক্ট তালিকার সাথে 1-বিট তালিকা শিরোনামটি খালি সাবলিস্টের জন্য ব্যবহার করা হবে এবং তালিকার প্রারম্ভিক আকারটি 781250 বিট হবে। সবচেয়ে খারাপ ক্ষেত্রে তালিকার প্রতিটি সংখ্যার জন্য 8 টি বিট বৃদ্ধি পায়, তাই 32 + 8 = 40 বিট খালি প্রতিটি জায়গার জন্য 32-বিট সংখ্যার প্রত্যেককে তালিকার বাফারের শীর্ষে স্থাপন করতে হবে এবং তারপরে বাছাই এবং একত্রিত করা হবে। সবচেয়ে খারাপ ক্ষেত্রে সাবলিস্ট শিরোনাম ম্যাপিংয়ের পরিবর্তনের ফলে 2 * 781250 + 7 * এন্ট্রি - 781250/3 বিটের স্থান ব্যবহার হয়।
তালিকায় কমপক্ষে 800000 নম্বর পাওয়া গেলে প্রতি পঞ্চম সংশ্লেষের পরে সাবলিস্ট শিরোনাম ম্যাপিং পরিবর্তন করার নীতিমালা সহ, সবচেয়ে খারাপ ক্ষেত্রে প্রায় কমপক্ষে প্রায় 30M কমপ্যাক্ট তালিকার পড়া এবং লেখার ক্রিয়াকলাপ জড়িত।
সূত্র:
http://nick.cleaton.net/ramsortsol.html