হাইপারলগলগ একটি সম্ভাব্য ডেটা স্ট্রাকচার । এটি একটি তালিকায় স্বতন্ত্র উপাদানগুলির সংখ্যা গণনা করে। তবে এটি করার সহজ পদ্ধতির তুলনায় (একটি সেট থাকা এবং সেটে উপাদান যুক্ত করা) এটি আনুমানিক উপায়ে এটি করে।
হাইপারলগলগ অ্যালগরিদম কীভাবে এটি করে তা দেখার আগে আপনার কেন এটি প্রয়োজন তা বুঝতে হবে। সোজা উপায় সহ সমস্যাটি হ'ল এটি O(distinct elements)
স্থান খায় । এখানে কেবল আলাদা স্বতন্ত্র উপাদানের পরিবর্তে কেন একটি বড় ও স্বরলিপি রয়েছে? কারণ উপাদানগুলি বিভিন্ন আকারের হতে পারে। একটি উপাদান 1
অন্য উপাদান হতে পারে "is this big string"
। সুতরাং আপনার কাছে যদি একটি বিশাল তালিকা (বা উপাদানগুলির একটি বিশাল প্রবাহ) থাকে তবে এটি অনেক বেশি স্মৃতি গ্রহণ করবে।
সম্ভাব্য গণনা
কীভাবে একজন বেশ কয়েকটি অনন্য উপাদানের যুক্তিসঙ্গত অনুমান পেতে পারেন? ধরে নিন যে আপনার দৈর্ঘ্যের একটি স্ট্রিং রয়েছে m
যা {0, 1}
সমান সম্ভাবনা নিয়ে গঠিত । এটি 0, 2 জিরো এবং কে জিরো দিয়ে শুরু হবে এমন সম্ভাবনা কী? এটা 1/2
, 1/4
এবং 1/2^k
। এর অর্থ হ'ল যদি আপনি k
জিরোসের সাথে কোনও স্ট্রিংয়ের মুখোমুখি হয়ে থাকেন তবে আপনি আনুমানিক 2^k
উপাদানগুলি সন্ধান করেছেন। সুতরাং এটি একটি ভাল সূচনা পয়েন্ট। এর মধ্যে সমানভাবে বিতরণের উপাদানগুলির একটি তালিকা থাকা 0
এবং 2^k - 1
আপনি বাইনারি উপস্থাপনায় শূন্যের বৃহত্তম উপসর্গের সর্বাধিক সংখ্যা গণনা করতে পারেন এবং এটি আপনাকে একটি যুক্তিসঙ্গত অনুমান দেবে।
সমস্যাটি হ'ল 0
টি থেকে সমানভাবে বিতরণ করা সংখ্যার প্রাপ্তি 2^k-1
অর্জন করা খুব কঠিন (আমরা যে ডেটা দেখেছি সেগুলি বেশিরভাগই সংখ্যার নয়, প্রায় সমানভাবে বিতরণ করা হয় না এবং কোনও মানের মধ্যেও হতে পারে But তবে একটি ভাল হ্যাশিং ফাংশন ব্যবহার করে আপনি ধরে নিতে পারেন) আউটপুট বিটগুলি সমানভাবে বিতরণ করা হবে এবং বেশিরভাগ হ্যাশিংয়ের ফাংশনটির মধ্যে আউটপুট থাকে 0
এবং 2^k - 1
( এসএইচএ 1 আপনাকে 0
এবং এর মধ্যে মান দেয় 2^160
) So তাই আমরা এখন পর্যন্ত যা অর্জন করেছি তা হ'ল k
কেবলমাত্র বিটগুলির সর্বাধিক কার্ডিনালিটি সহ অনন্য উপাদানের সংখ্যাটি অনুমান করতে পারি only আকারের log(k)
বিটগুলির একটি সংখ্যা The1984 এর সম্ভাব্য গণনা সংক্রান্ত কাগজ (এটি অনুমানের সাথে সামান্য স্মার্ট, তবে এখনও আমরা নিকটে আছি)।
LogLog
আরও এগিয়ে যাওয়ার আগে আমাদের বুঝতে হবে আমাদের প্রথম অনুমান কেন এতটা দুর্দান্ত নয়। এর পেছনের কারণ হ'ল উচ্চ ফ্রিকোয়েন্সি 0-উপসর্গের উপাদানটির একটি এলোমেলো ঘটনা সমস্ত কিছু নষ্ট করতে পারে। এটিকে উন্নত করার একটি উপায় হ'ল অনেকগুলি হ্যাশ ফাংশন ব্যবহার করা, প্রতিটি হ্যাশ ফাংশন সর্বাধিক গণনা করা এবং শেষে এগুলি গড়তে হবে। এটি একটি দুর্দান্ত ধারণা, যা অনুমানের উন্নতি করবে, তবে লগলগ কাগজটি কিছুটা ভিন্ন পদ্ধতির ব্যবহার করেছে (সম্ভবত হ্যাশিং এক ধরণের ব্যয়বহুল কারণ)।
তারা একটি হ্যাশ ব্যবহার করেছে তবে এটিকে দুটি ভাগে ভাগ করেছে। একটিকে বালতি বলা হয় (বালতির মোট সংখ্যা 2^x
) এবং অন্যটি - মূলত আমাদের হ্যাশের মতো h যা চলছে তা পাওয়া আমার পক্ষে কঠিন ছিল, তাই আমি একটি উদাহরণ দেব। মনে করুন আপনি দুটি উপাদান এবং আপনার হ্যাশ ফাংশন যা মান ফর্ম দেয় আছে 0
করার 2^10
উত্পাদিত 2 মান: 344
এবং 387
। আপনি 16 বালতি রাখার সিদ্ধান্ত নিয়েছেন। সুতরাং তোমার আছে:
0101 011000 bucket 5 will store 1
0110 000011 bucket 6 will store 4
আরও বালতি থাকার ফলে আপনি বৈকল্পিকতা হ্রাস করুন (আপনি কিছুটা বেশি জায়গা ব্যবহার করেন তবে এটি এখনও ছোট)। গণিত দক্ষতা ব্যবহার করে তারা ত্রুটির পরিমাণ নির্ধারণ করতে সক্ষম হয়েছিল (যা হ'ল 1.3/sqrt(number of buckets)
)।
HyperLogLog
হাইপারলগলগ কোনও নতুন ধারণা প্রবর্তন করে না, তবে পূর্ববর্তী অনুমানটি উন্নত করতে বেশিরভাগ গণিত ব্যবহার করে। গবেষকরা সন্ধান করেছেন যে আপনি বালতিগুলি থেকে 30% সর্বাধিক সংখ্যার অপসারণ করলে আপনি অনুমানটি উল্লেখযোগ্যভাবে উন্নত করেন। তারা গড় সংখ্যাগুলির জন্য আরও একটি অ্যালগরিদম ব্যবহার করেছিল। কাগজটি গণিত-ভারী।
এবং আমি একটি সাম্প্রতিক কাগজ দিয়ে শেষ করতে চাই, যা হাইপারলগলগ অ্যালগরিদমের একটি উন্নত সংস্করণ দেখায় (এখনও অবধি আমার এটিকে পুরোপুরি বুঝতে সময় পেল না, তবে সম্ভবত পরে আমি এই উত্তরটি উন্নত করব)।