আমার সমাধান: সেরা কেস 7.025 বিট / সংখ্যা, সবচেয়ে খারাপ ক্ষেত্রে 14.193 বিট / সংখ্যা, মোটামুটি গড় 8.551 বিট / সংখ্যা। স্ট্রিম-এনকোডেড, এলোমেলো অ্যাক্সেস নেই।
এমনকি রসিকের উত্তর পড়ার আগে, আমি তত্ক্ষণাত্ প্রতিটি সংখ্যার মধ্যে পার্থক্য এনকোডিংয়ের কথা ভাবলাম, যেহেতু এটি ছোট হবে এবং তুলনামূলকভাবে সামঞ্জস্যপূর্ণ হওয়া উচিত, তবে সমাধানটি অবশ্যই সবচেয়ে খারাপ পরিস্থিতি সামঞ্জস্য করতে সক্ষম হতে হবে। আমাদের 100000 সংখ্যার একটি স্পেস রয়েছে যা কেবলমাত্র 1000 টি সংখ্যা ধারণ করে। নিখুঁতভাবে অভিন্ন ফোন বইয়ে, প্রতিটি সংখ্যা 100 দ্বারা আগের সংখ্যাটির চেয়ে বেশি হবে:
55555-12 3 45
55555-12 4 45
55555-12 5 45
যদি এটি হয় তবে এটির একটি ধ্রুবক হিসাবে সংখ্যার পার্থক্যগুলি এনকোড করতে জিরো স্টোরেজ প্রয়োজন। দুর্ভাগ্যক্রমে, সংখ্যাগুলি 100 এর আদর্শ পদক্ষেপের চেয়ে পৃথক হতে পারে 100 100 এর আদর্শ বৃদ্ধি থেকে আমি পার্থক্যটি এনকোড করব, যাতে দুটি সংলগ্ন সংখ্যা যদি 103 দ্বারা পৃথক হয় তবে আমি 3 নম্বরটি এনকোড করব এবং যদি দুটি সংলগ্ন সংখ্যা 92, I দ্বারা পৃথক হয় এনকোড হবে -8। আমি 100 "এর একটি আদর্শ বৃদ্ধি থেকে ব-দ্বীপ কল ভ্যারিয়েন্স "।
ভেরিয়েন্সটি -৯৯ (অর্থাত্ টানা দুটি সংখ্যা) থেকে শুরু করে 99000 (পুরো ফোনবুকটি 00000… 00999 এবং একটি অতিরিক্ত দূরবর্তী নম্বর 99999 নিয়ে গঠিত) হতে পারে, যা 99100 সম্ভাব্য মানগুলির পরিসীমা।
আমি বড় পার্থক্য (যেমন সম্মুখীন সবচেয়ে সাধারণ পার্থক্য এনকোড এবং স্টোরেজ প্রসারিত করতে একটি ন্যূনতম স্টোরেজ বরাদ্দ করা তাগ চাই ProtoBuf এর varint
)। আমি সাতটি বিট, স্টোরেজের জন্য ছয় এবং শেষে একটি অতিরিক্ত পতাকা বিট ব্যবহার করব যেটি বোঝাতে পারে যে এই বৈকল্পটি বর্তমানের পরে একটি অতিরিক্ত অংশের সাথে সর্বাধিক তিনটি অংশ পর্যন্ত সংরক্ষণ করা হবে (যা সর্বোচ্চ প্রদান করবে) 3 * 6 = 18 বিট স্টোরেজ, যা 262144 সম্ভাব্য মান, সম্ভাব্য রূপগুলির সংখ্যা (99100) এর চেয়ে বেশি a প্রতিটি উত্ক্রান্ত পতাকা যা একটি উত্থিত পতাকা অনুসরণ করে তার উচ্চতর বিট থাকে, তাই প্রথম খণ্ডটিতে সর্বদা 0- বিট থাকে 5, alচ্ছিক দ্বিতীয় অংশে 6-10 বিট রয়েছে এবং thirdচ্ছিক তৃতীয় অংশে 12-17 বিট রয়েছে।
একটি একক অংশ ছয় বিট স্টোরেজ সরবরাহ করে যা values৪ টি মানকে সমন্বিত করতে পারে। আমি সেই একক অংশে ফিট করার জন্য smal৪ টি ক্ষুদ্রতম রূপগুলি মানচিত্র করতে চাই (যেমন -32 থেকে +31 এর রূপগুলি) সুতরাং আমি প্রোটোফুফ জিগজ্যাগ এনকোডিংটি ব্যবহার করব, -99 থেকে +98 এর ভেরিয়েন্স পর্যন্ত (যেহেতু কোনও প্রয়োজন নেই) -৯৯ এর বাইরে নেতিবাচক বৈকল্পিকের জন্য), যে সময়ে আমি নিয়মিত এনকোডিংয়ে স্যুইচ করব, অফসেটটি 98 দ্বারা:
বৈচিত্র্য | এনকোডেড মান
----------- + ----------------
0 | 0
-1 | ঘ
1 | ঘ
-২ | ঘ
2 | ঘ
-৩ | ৫
3 | ।
... | ...
-31 | 61
31 | 62
-32 | 63
----------- | --------------- 6 টি বিট
32 | 64
-33 | 65
33 | 66
... | ...
-98 | 195
98 | 196
-99 | 197
----------- | --------------- জিগজ্যাগের সমাপ্তি
100 | 198
101 | 199
... | ...
3996 | 4094
3997 | 4095
----------- | --------------- 12 বিট
3998 | 4096
3999 | 4097
... | ...
262045 | 262143
----------- | --------------- 18 বিট
কীভাবে বৈকল্পিকগুলি বিট হিসাবে এনকোড করা হবে তার কয়েকটি উদাহরণ যেমন অতিরিক্ত খণ্ডটি চিহ্নিত করতে পতাকা সহ:
বৈচিত্র্য | এনকোড বিটস
----------- + ----------------
0 | 000000 0
5 | 001010 0
-8 | 001111 0
-32 | 111111 0
32 | 000000 1 000001 0
-99 | 000101 1 000011 0
177 | 010011 1 000100 0
14444 | 001110 1 100011 1 000011 0
সুতরাং একটি নমুনা ফোন বইয়ের প্রথম তিনটি নম্বর বিটগুলির প্রবাহ হিসাবে এনকোড করা হবে:
বিন 000101001011001000100110010000011001 000110 1 010110 1 00001 0
PH # 55555-12345 55555-12448 55555-12491
পস 1 2 3
সর্বোত্তম ক্ষেত্রে পরিস্থিতি , ফোন বইটি কিছুটা সমানভাবে বিতরণ করা হয়েছে এবং 32 টির চেয়ে বেশি তারতম্য রয়েছে এমন কোনও দুটি ফোন নম্বর নেই, সুতরাং এটি 32 + 7 * 999 এর মোট সংখ্যার জন্য প্রারম্ভিক সংখ্যার জন্য 32 বিট প্লাস 32 বিট ব্যবহার করবে = 7025 বিট ।
একটি মিশ্র দৃশ্য , যেখানে ৮০০ ফোন নম্বরগুলির প্রকারভেদ এক অংশের মধ্যে ফিট করে (৮০০ * 00 = ৫ fits০০), ১৮০ নম্বর দুটি খণ্ডে ফিট করে (১৮০ * ২ * = = ২৫২০) এবং ১৯ টি সংখ্যা তিনটি খণ্ডে খাপ খায় (২০ * ৩ * 7 = 399), প্রাথমিক 32 বিট, মোট 8551 বিট ।
সবচেয়ে খারাপ পরিস্থিতি , 25 টি সংখ্যা তিনটি অংশে ফিট (25 * 3 * 7 = 525 বিট) এবং বাকী 974 সংখ্যা দুটি খণ্ডে মাপসই (974 * 2 * 7 = 13636 বিট), এবং 32 টি বিট প্রথম সংখ্যার জন্য বিট মোট14193 বিট ।
এনকোডড সংখ্যার পরিমাণ |
1-খণ্ড | 2-খণ্ড | 3-খণ্ড | মোট বিট
--------- + ---------- + ---------- + ------------
999 | 0 | 0 | 7025
800 | 180 | 19 | 8551
0 | 974 | 25 | 14193
আমি আরও চারটি অপটিমাইজেশন দেখতে পাচ্ছি যা প্রয়োজনীয় স্থানটি আরও কমাতে সম্পাদন করা যেতে পারে:
- তৃতীয় অংশটির পুরো সাতটি বিটের দরকার নেই, এটি কেবল পাঁচ বিট এবং একটি পতাকা বিট ছাড়াই হতে পারে।
- প্রতিটি খণ্ডের জন্য সেরা আকারের গণনা করার জন্য সংখ্যার প্রাথমিক পাস হতে পারে। কোনও নির্দিষ্ট ফোনবুকের জন্য, প্রথম খণ্ডটিতে 5 + 1 বিট, দ্বিতীয় 7 + 1 এবং তৃতীয় 5 + 1 থাকা ভাল হবে mal এটি আকারটিকে আরও সর্বনিম্ন 6 * 999 + 32 = 6026 বিট হিসাবে কমিয়ে দেবে, আরও তিনটি বিটের দুটি সেট খণ্ড 1 এবং 2 এর আকারগুলি সংরক্ষণ করবে (অংশ 3 এর আকার প্রয়োজনীয় 16 বিটের অবশিষ্টাংশ) 6032 বিট!
- একই প্রাথমিক পাসটি ডিফল্ট 100 এর চেয়ে ভাল প্রত্যাশিত বৃদ্ধির গণনা করতে পারে Maybe বিতরণ (সম্ভবত স্ট্যান্ডার্ড বিচ্যুতি) এবং কিছু অন্যান্য অনুকূল প্রত্যাশিত বর্ধন ব্যবহার করা যেতে পারে। এটি আদর্শ বৈকল্পিকতা হ্রাস করতে পারে এবং এটি এমনকি আরও ছোট প্রথম অংশ ব্যবহার করার অনুমতি দেয়।
- ফোনের বইটিকে বিভাজন করার অনুমতি দেওয়ার জন্য আরও বিশ্লেষণ প্রথম পাসে করা যেতে পারে, প্রতিটি পার্টিশনের নিজস্ব প্রত্যাশিত বর্ধন এবং খণ্ড আকারের অপ্টিমাইজেশন রয়েছে। এটি ফোনের বইয়ের নির্দিষ্ট ইউনিফর্মের কিছু অংশের (ছোট খাওয়ার বিটের সংখ্যা হ্রাস করা) এবং অ-ইউনিফর্ম অংশগুলির জন্য বৃহত্তর অংশগুলি (ধারাবাহিক পতাকাগুলিতে নষ্ট বিটের সংখ্যা হ্রাস) এর জন্য প্রথম ছোট ছোট আকারের মঞ্জুরি দেয়।