হাইপারলগলগ অ্যালগরিদম কীভাবে কাজ করে?


172

আমি সম্প্রতি আমার অতিরিক্ত সময়ে বিভিন্ন অ্যালগরিদম সম্পর্কে শিখছি, এবং আমি যেটি এসে পৌঁছলাম তা খুব আকর্ষণীয় বলে মনে হয় তাকে হাইপারলগলগ অ্যালগরিদম বলা হয় - যা তালিকার মধ্যে কতগুলি অনন্য আইটেম রয়েছে তা অনুমান করে।

এটি আমার কাছে বিশেষ আকর্ষণীয় ছিল কারণ এটি আমার মাইএসকিউএল দিনগুলিতে ফিরে এলো যখন আমি দেখলাম যে "কার্ডিনালিটি" মানটি (যা আমি সর্বদা ধরে ধরেছিলাম যে এটি হিসাব করা হয় নি)।

সুতরাং আমি কীভাবে ( এন ) এ একটি অ্যালগরিদম লিখতে জানি যা গণনা করবে যে একটি অ্যারেতে কতগুলি অনন্য আইটেম রয়েছে। আমি এটি জাভাস্ক্রিপ্টে লিখেছি:

function countUniqueAlgo1(arr) {
    var Table = {};
    var numUnique = 0;
    var numDataPoints = arr.length;
    for (var j = 0; j < numDataPoints; j++) {
        var val = arr[j];
        if (Table[val] != null) {
            continue;
        }
        Table[val] = 1;
        numUnique++;
    }
    return numUnique;
}

তবে সমস্যাটি হ'ল আমার অ্যালগরিদম, যখন ( এন ), প্রচুর মেমরি ব্যবহার করে (মানগুলি সংরক্ষণ করে Table)।

( এন ) সময়ে কোনও তালিকায় নকলকে কীভাবে গণনা করতে হবে এবং ন্যূনতম স্মৃতি ব্যবহার করতে হবে সে সম্পর্কে আমি এই কাগজটি পড়ছি ।

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

আমি কাগজটি পড়েছি, তবে আমি এটি বুঝতে পারি না। কেউ কি আরও বেশি ল্যাপারসনের ব্যাখ্যা দিতে পারেন? আমি জানি হ্যাশগুলি কী, তবে এই হাইপারলগলগ অ্যালগরিদমে কীভাবে সেগুলি ব্যবহৃত হয় তা আমি বুঝতে পারি না।


4
এই গবেষণাপত্র ( গবেষণা .google.com/pubs/pub40671.html) হাইপারলগলগ অ্যালগরিদম এবং কিছু উন্নতির সংক্ষিপ্তসারও দেয়। আমি মনে করি এটি মূল কাগজের চেয়ে বোঝা সহজ।
zhanxw

11
নামকরণের জন্য কেবল একটি ইঙ্গিত: কিছু লোক অনন্য আইটেমের সংকলন বর্ণনা করতে সেট শব্দটি ব্যবহার করে । তাদের পরিবর্তে, আপনি যদি শব্দটির পরিবর্তে শব্দ তালিকা বা অ্যারে ব্যবহার করেন তবে আপনার প্রশ্নটি আরও ভাল।
প্যাডি 3118

উত্তর:


153

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

এটি হল, পূর্ণসংখ্যার এলোমেলো প্রবাহে, 50% সংখ্যার (বাইনারিতে) "1" দিয়ে শুরু হয়, 25% "01" দিয়ে শুরু হয়, 12,5% "001" দিয়ে শুরু হয়। এর অর্থ হ'ল আপনি যদি এলোমেলো স্ট্রিমটি পর্যবেক্ষণ করেন এবং "001" দেখেন তবে এই স্ট্রিমটির 8 এর কার্ডিনালিটি থাকার উচ্চতর সম্ভাবনা রয়েছে।

("00..1" উপসর্গটির কোনও বিশেষ অর্থ নেই most এটি কেবল সেখানে রয়েছে কারণ বেশিরভাগ প্রসেসরের বাইনারি সংখ্যায় সর্বাধিক উল্লেখযোগ্য বিট পাওয়া সহজ)

অবশ্যই, আপনি যদি কেবল একটি পূর্ণসংখ্যার পর্যবেক্ষণ করেন তবে এই মানটি ভুল হওয়ার সম্ভাবনা বেশি। এজন্যই অ্যালগরিদম স্ট্রিমটিকে "এম" স্বতন্ত্র সাবস্ট্রিমগুলিতে ভাগ করে এবং প্রতিটি স্ট্রিমের দেখা "00 ... 1" উপসর্গের সর্বাধিক দৈর্ঘ্য রাখে। তারপরে, প্রতিটি স্ট্রিমের গড় মূল্য নিয়ে চূড়ান্ত মানটি অনুমান করে।

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


"এই স্ট্রিমটির 8 টির মূল পরিচয় রয়েছে এমন উচ্চতর সম্ভাবনা রয়েছে" আপনি কী দয়া করে ব্যাখ্যা করতে পারবেন যে 000 কেন পরীক্ষার সংখ্যা প্রত্যাশিত 2 ^ 3? আমি গণ্য প্রত্যাশার সংখ্যার পরীক্ষার গণনা করার চেষ্টা করে ধরেছিলাম যে আমরা কমপক্ষে 3 টি জিরো নিয়ে একটি রান করেছি এবং 4 টি জিরো দিয়ে কোনও রান নেই ...
ইউরা

5
আমি এটি পড়ার আগে পর্যন্ত কাগজটি বেশ বুঝতে পারিনি। এখন এটি বোধগম্য হয়।
জোশিয়ার

5
@ ইউরা আমি জানি এটি একটি খুব পুরানো মন্তব্য, তবে এটি অন্যান্য লোকের পক্ষে কার্যকর হতে পারে। তিনি বলেছিলেন "এটি হল পূর্ণসংখ্যার এলোমেলো প্রবাহে, (...) 12,5%" 001 "দিয়ে শুরু হয়।" সম্ভাব্য কার্ডিনালিটি 8 কারণ 12,5% পুরো স্ট্রিমের এক অষ্টম প্রতিনিধিত্ব করে।
ব্রুনমাগ্রিন

111

হাইপারলগলগ একটি সম্ভাব্য ডেটা স্ট্রাকচার । এটি একটি তালিকায় স্বতন্ত্র উপাদানগুলির সংখ্যা গণনা করে। তবে এটি করার সহজ পদ্ধতির তুলনায় (একটি সেট থাকা এবং সেটে উপাদান যুক্ত করা) এটি আনুমানিক উপায়ে এটি করে।

হাইপারলগলগ অ্যালগরিদম কীভাবে এটি করে তা দেখার আগে আপনার কেন এটি প্রয়োজন তা বুঝতে হবে। সোজা উপায় সহ সমস্যাটি হ'ল এটি 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% সর্বাধিক সংখ্যার অপসারণ করলে আপনি অনুমানটি উল্লেখযোগ্যভাবে উন্নত করেন। তারা গড় সংখ্যাগুলির জন্য আরও একটি অ্যালগরিদম ব্যবহার করেছিল। কাগজটি গণিত-ভারী।


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


2
আমি তাত্ত্বিকভাবে ধরে নিচ্ছি যে k zeroesকোনও বিশেষ জিনিস নয়। আপনি তার পরিবর্তে সন্ধান করতে পারেন k onesএবং যুক্তিটি একই হতে পারে এমনকি k lengthস্ট্রিংয়ের সন্ধান {0,1}করতে পারে তবে এরকম একটি স্ট্রিং নিন এবং এটির সাথে লেগে থাকুন? কারণ এই জাতীয় বাইনারি স্ট্রিংয়ের ক্ষেত্রে তাদের সকলেরই 1/2 ^ k সমান সম্ভাবনা রয়েছে?
ব্যবহারকারী 881300

3
হাইপারলগলগ সর্বাধিক সংখ্যার 30% সরিয়ে দেয় না। এটি লগলগ পেপারে বর্ণিত সুপারলগলগ অ্যালগরিদমের ধারণা is হাইপারলগলগ অ্যালগরিদমের মূল ধারণা হ'ল সুপারলগলগ এবং লগলগ দ্বারা ব্যবহৃত জ্যামিতিক গড়ের পরিবর্তে হারমোনিক গড় ব্যবহার করে দ্বিগুণের শক্তি গড় করা।
ওটমার

21

অন্তর্নিহিততাটি হ'ল যদি আপনার ইনপুটটি এলোমেলো সংখ্যার (যেমন হ্যাশ মানগুলি) একটি বড় সেট হয় তবে তাদের সমানভাবে পরিসীমাতে বিতরণ করা উচিত। ধরা যাক 1024 অবধি মান উপস্থাপন করতে 10 বিট অবধি পরিসীমা রয়েছে Then তারপরে ন্যূনতম মানটি পর্যবেক্ষণ করুন। ধরা যাক এটি 10। তারপরে কার্ডিনালিটিটি প্রায় 100 (10 × 100 ≈ 1024) হিসাবে ধরা হবে।

অবশ্যই আসল যুক্তি জন্য কাগজ পড়ুন।

নমুনা কোড সহ আরও একটি ভাল ব্যাখ্যা এখানে পাওয়া যাবে:
দাম্পত্য শীতল অ্যালগরিদম: কার্ডিনালিটি অনুমান - নিক এর ব্লগ


3
অভিশাপ কুল অ্যালগরিদম ব্লগ পোস্টের লিঙ্কের জন্য আপভোটড। এটি আমাকে সত্যিই অ্যালগরিদম বুঝতে সাহায্য করেছিল।
ইগোর সেরিব্রায়ানি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.