শীর্ষস্থানীয় 10 টি শর্তাবলী খুঁজতে অ্যালগরিদম


115

আমি বর্তমানে একটি সাক্ষাত্কারের জন্য প্রস্তুত করছি, এবং এটি আমাকে পূর্ববর্তী সাক্ষাত্কারে একবার জিজ্ঞাসা করা একটি প্রশ্নের স্মরণ করিয়ে দিয়েছিল যা এরকম কিছু হয়েছিল:

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

(i) সর্বকালের সেরা 10 অনুসন্ধান পদগুলি প্রদর্শিত করুন (যেমন আপনি যেহেতু ফিডটি পড়া শুরু করেছেন)।

(ii) গত মাসের জন্য কেবলমাত্র শীর্ষ 10 অনুসন্ধানের শর্তাদি প্রদর্শন করুন, প্রতি ঘন্টা আপডেট করা হয়েছে।

আপনি শীর্ষ 10 তালিকা প্রাপ্ত করতে একটি পড়তা ব্যবহার করতে পারেন, কিন্তু আপনি আপনার পছন্দের ন্যায্যতা প্রতিপাদন করা আবশ্যক। "
আমি এই সাক্ষাৎকারে বোমাবর্ষণ এবং এখনও সত্যিই কোন ধারণা কিভাবে এই বাস্তবায়ন করতে হবে।

প্রথম অংশে একটি অনন্ত তালিকার ক্রমাগত ক্রমবর্ধমান উপ-অনুক্রমের 10 টি ঘন ঘন আইটেমের জন্য জিজ্ঞাসা করা হয়েছে। আমি নির্বাচন অ্যালগরিদমগুলিতে সন্ধান করেছি, তবে এই সমস্যাটি সমাধান করার জন্য কোনও অনলাইন সংস্করণ খুঁজে পাইনি।

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

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

কোন ধারনা?


11
@ ব্লুরাজা - এটি একটি মূর্খ সাক্ষাত্কারের প্রশ্ন নয়, এটি ওপির পক্ষ থেকে একটি খারাপ ব্যাখ্যা। এটি অসীম তালিকার সর্বাধিক ঘন আইটেমগুলির জন্য জিজ্ঞাসা করছে না, এটি অসীম তালিকার সীমাবদ্ধ উপসর্গের সর্বাধিক ঘন আইটেমগুলির জন্য জিজ্ঞাসা করছে। আপনার উপমা চালিয়ে যেতে,what is the most frequent item in the subsequence [2; 2; 3; 3; 3; 4; 4; 4; 4; 5; 5] of your sequence?
IVlad

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

উত্তর:


47

ওয়েল, সমস্ত ফ্রিকোয়েন্সিগুলি সঞ্চয় করার জন্য সম্ভবত একটি প্রতিরোধমূলক ব্যয় সহ, প্রচুর ডেটা দেখতে পাওয়া যায়। যখন ডেটার পরিমাণ এত বেশি হয় যে আমরা এগুলি সব সঞ্চয় করার আশা করতে পারি না, আমরা ডেটা স্ট্রিম অ্যালগরিদমের ডোমেনটি প্রবেশ করি ।

এই অঞ্চলে দরকারী বই: মুথুকৃষ্ণান - "ডেটা স্ট্রিমস: অ্যালগরিদম এবং অ্যাপ্লিকেশন"

সমস্যাটির ঘনিষ্ঠভাবে সম্পর্কিত সমস্যাটি যা আমি উপরের দিক থেকে বেছে নিয়েছি: মানকু, মোতওয়ানি - "ডেটা স্ট্রিমগুলির উপরে আনুমানিক ফ্রিকোয়েন্সি গণনা" [পিডিএফ]

যাইহোক, স্ট্যানফোর্ডের মোতওয়ানি (সম্পাদনা) খুব গুরুত্বপূর্ণ "র্যান্ডমাইজড অ্যালগরিদম" বইয়ের একজন লেখক ছিলেন । এই বইয়ের 11 তম অধ্যায়ে এই সমস্যাটি রয়েছেসম্পাদনা: দুঃখিত, খারাপ রেফারেন্স, particular বিশেষ অধ্যায়টি একটি ভিন্ন সমস্যা। চেক করার পরে, আমি পরিবর্তে অনলাইনে উপলব্ধ মুথুকৃষ্ণনের বইয়ের 5.1.2 বিভাগের সুপারিশ করছি ।

হেই, সুন্দর সাক্ষাত্কারের প্রশ্ন।


2
+1 খুব আকর্ষণীয় স্টাফ, সাইটগুলিতে "পড়তে" স্টাফ ট্যাগ করার একটি উপায় থাকা উচিত। ভাগ করে নেওয়ার জন্য ধন্যবাদ.
রামধীর সিং

@ গোলম: আমার বুকমার্কগুলিতে আমার একটি পড়ার ফোল্ডার রয়েছে; আপনি ঠিক এটি করতে পারে। আমি জানি যে লিঙ্কগুলি আমার সাথে যুক্ত করা হচ্ছে :)
ক্যাম

+1 টি। স্ট্রিমিং অ্যালগরিদমগুলি এখানে ঠিক ঠিক আলোচ্য বিষয় এবং মুঠুর বইটি (এ পর্যন্ত লেখা একমাত্র বই, এএফাইক) দুর্দান্ত।
শ্রীভাত্সআর

1
+1 টি। সম্পর্কিত: en.wikedia.org/wiki/Online_algorithm । BTW, Motwani সম্প্রতি মারা গেছেন, তাই সম্ভবত ছিল একজন লেখক আরো সঠিক।

খুব অদ্ভুত. আমি তাকে বইটি থেকে জানতাম, তবে তিনি অবশ্যই এর কারণেই বেশি বিখ্যাত হয়েছিলেন: "পেজর্যাঙ্ক অ্যালগরিদমের প্রভাবশালী প্রাথমিক কাগজের মোতওয়ানি অন্যতম সহ-লেখক ছিলেন (ল্যারি পেজ এবং সের্গেই ব্রিন এবং টেরি উইনগ্রাড সহ), গুগলের সার্চ কৌশল ভিত্তি। "( en.wikipedia.org/wiki/Rajeev_Motwani )
দিমিত্রিস Andreou

55

ফ্রিকোয়েন্সি অনুমানের ওভারভিউ

কিছু সুপরিচিত অ্যালগরিদম রয়েছে যা নির্দিষ্ট পরিমাণ স্টোরেজ ব্যবহার করে এ জাতীয় স্ট্রিমের জন্য ফ্রিকোয়েন্সি অনুমান সরবরাহ করতে পারে। একটি হ'ল ঘন ঘন, মিস্রা এবং গ্রিজ (1982) দ্বারা। এন আইটেমের একটি তালিকা থেকে , এটি কে - 1 কাউন্টার ব্যবহার করে, এন / কে বারের বেশি সংখ্যক আইটেম সন্ধান করে । এটি বয়র এবং মুর মেজরিটি অ্যালগরিদমের একটি সাধারণীকরণ (ফিশার-সালজবার্গ, 1982), যেখানে কে ২। মানকু এবং মোতওয়ানির লসিসাউন্টিং (২০০২) এবং মেটওয়ালির স্পেস সেভিং (২০০৫) অ্যালগরিদমের একই জায়গার প্রয়োজনীয়তা রয়েছে তবে নির্দিষ্ট হিসাবে আরও সঠিক অনুমান সরবরাহ করতে পারে শর্ত।

গুরুত্বপূর্ণ বিষয়টি মনে রাখবেন যে এই অ্যালগরিদমগুলি কেবল ফ্রিকোয়েন্সি অনুমান সরবরাহ করতে পারে। বিশেষত, মিশ্রা-গ্রিজের অনুমানটি (এন / কে) আইটেমগুলির মাধ্যমে প্রকৃত ফ্রিকোয়েন্সিটিকে কম গণনা করতে পারে ।

মনে করুন যে আপনার কাছে একটি অ্যালগরিদম ছিল যা ইতিবাচকভাবে কেবল কোনও আইটেমটি সনাক্ত করতে পারে যখন এটি 50% এরও বেশি সময় ঘটে। এই অ্যালগরিদমকে N স্বতন্ত্র আইটেমগুলির একটি স্ট্রিমটি খাওয়ান এবং তারপরে আরও 2 এন - একটি আইটেমের 1 টি অনুলিপি, x , মোট 2 এন - 1 আইটেমের জন্য যুক্ত করুন। যদি অ্যালগরিদম আপনাকে বলে যে এক্স মোটের 50% ছাড়িয়ে গেছে, এটি অবশ্যই প্রথম প্রবাহে ছিল; যদি এটি না হয়, এক্স প্রাথমিক প্রবাহে ছিল না। অ্যালগরিদম এই সংকল্পটি তৈরি করার জন্য, এটি অবশ্যই প্রাথমিক স্ট্রিমটি (বা এর দৈর্ঘ্যের সাথে আনুপাতিক কিছু সংক্ষিপ্তসার) সংরক্ষণ করতে হবে! সুতরাং, আমরা নিজেরাই প্রমাণ করতে পারি যে এই জাতীয় "সঠিক" অ্যালগরিদম দ্বারা প্রয়োজনীয় স্থানটি হবে Ω ( এন )।

পরিবর্তে, এখানে বর্ণিত এই ফ্রিকোয়েন্সি অ্যালগরিদমগুলি একটি অনুমান সরবরাহ করে, প্রান্তিক ছাড়িয়ে যে আইটেমকে নির্দিষ্ট ব্যবধানে তার নিচে পড়ে এমন কিছু আইটেম সনাক্ত করে। উদাহরণস্বরূপ, মেজরিটি অ্যালগরিদম, একটি একক কাউন্টার ব্যবহার করে, সর্বদা ফলাফল দেয়; যদি কোনও আইটেম স্ট্রিমের 50% ছাড়িয়ে যায় তবে এটি পাওয়া যাবে। তবে এটি আপনাকে এমন একটি আইটেম দেয় যা কেবল একবারে ঘটে। আপনি ডেটা দিয়ে দ্বিতীয় পাস না করে জানতেন না (আবার, একটি একক কাউন্টার ব্যবহার করে, তবে কেবলমাত্র সেই আইটেমটির সন্ধান করছেন)।

ঘন ঘন অ্যালগরিদম

এখানে মিস্রা-গ্রিজের ঘন ঘন অ্যালগরিদমের একটি সাধারণ বিবরণ দেওয়া হল । ডামাইন (২০০২) এবং অন্যরা অ্যালগরিদমকে অনুকূলিত করেছেন, তবে এটি আপনাকে সূচনা দেয়।

প্রান্তিক ভগ্নাংশ উল্লেখ করুন, 1 / কে ; এন / কে বারের বেশি সংঘটিত যে কোনও আইটেম পাওয়া যাবে। একটি খালি মানচিত্র তৈরি করুন (লাল-কালো গাছের মতো); কীগুলি অনুসন্ধানের পদসমূহ হবে এবং মানগুলি এই পদটির জন্য একটি পাল্টা হবে।

  1. স্ট্রিমের প্রতিটি আইটেম দেখুন।
  2. শব্দটি মানচিত্রে উপস্থিত থাকলে সংশ্লিষ্ট কাউন্টারকে বাড়িয়ে দিন।
  3. অন্যথায়, মানচিত্রটি যদি কে - 1 টি প্রবেশের চেয়ে কম হয় , তবে একটির সাথে একটি মানচিত্রের সাথে মানচিত্রটি যুক্ত করুন।
  4. তবে মানচিত্রে যদি ইতিমধ্যে কে - 1 টি প্রবেশিকা থাকে তবে প্রতিটি এন্ট্রিতে কাউন্টার হ্রাস করুন। যদি এই প্রক্রিয়া চলাকালীন কোনও কাউন্টার শূন্যে পৌঁছে যায় তবে তা মানচিত্র থেকে সরান।

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

অনুসন্ধানগুলি গণনা করা হচ্ছে

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

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


আমি বিশ্বাস করি যে এই সমাধানটি আপনার আগ্রহের শর্তগুলির সংখ্যা হ্রাস করে ফিল্টার হিসাবে কাজ করতে পারে। যদি কোনও শব্দ এটিকে মানচিত্রে তৈরি করে, তা মানচিত্রের বাইরে না থাকলেও এটির প্রকৃত পরিসংখ্যানগুলি সন্ধান শুরু করুন। এরপরে আপনি দ্বিতীয় পাসটি ডেটা ছাড়তে পারবেন এবং সীমাবদ্ধ পরিসংখ্যান থেকে সংগৃহীত শীর্ষ 10 তৈরি করতে পারবেন।
ডল্ফ

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

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

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

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

19

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

ইনপুট

ইনপুটটি ইংরেজী শব্দ বা বাক্যাংশগুলির অন্তহীন স্ট্রিম (আমরা তাদের হিসাবে উল্লেখ করি tokens)।

আউটপুট

  1. আউটপুট শীর্ষ এন টোকেন আমরা এখন পর্যন্ত দেখেছি (আমরা দেখেছি সমস্ত টোকেন থেকে!)
  2. Dayতিহাসিক উইন্ডোতে আউটপুট শীর্ষ এন টোকেন, বলুন, গত দিন বা গত সপ্তাহে।

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

পূর্ণসংখ্যা মধ্যে স্ট্রিং

সিস্টেমের প্রতিটি শব্দের জন্য একটি পূর্ণসংখ্যা আইডি রয়েছে। যদিও ইন্টারনেটে প্রায় অসীম সম্ভাব্য শব্দ রয়েছে তবে প্রচুর শব্দের সংশ্লেষের পরে নতুন শব্দ খুঁজে পাওয়ার সম্ভাবনা কম এবং নিম্নতর হয়। আমরা ইতিমধ্যে 4 মিলিয়ন বিভিন্ন শব্দ খুঁজে পেয়েছি এবং প্রত্যেকটির জন্য একটি অনন্য আইডি নির্ধারণ করেছি। এই পুরো ডেটা সেটটি প্রায় 300MB মেমরি গ্রহণ করে হ্যাশ টেবিল হিসাবে মেমরিতে লোড করা যায়। (আমরা আমাদের নিজস্ব হ্যাশ টেবিলটি প্রয়োগ করেছি Java জাভা বাস্তবায়ন বিশাল মেমরির ওভারহেড নেয়)

প্রতিটি বাক্যটি তখন পূর্ণসংখ্যার অ্যারে হিসাবে চিহ্নিত করা যায়।

এটি গুরুত্বপূর্ণ, কারণ স্ট্রিংয়ের চেয়ে বাছাই এবং সংখ্যার তুলনা অনেক দ্রুত

সংরক্ষণাগার ডেটা

সিস্টেম প্রতিটি টোকেনের জন্য সংরক্ষণাগার ডেটা রাখে। মূলত এটি জোড়া (Token, Frequency)। যাইহোক, ডেটা সংরক্ষণ করে এমন টেবিলটি এত বিশাল হবে যে আমাদের টেবিলটি শারীরিকভাবে ভাগ করতে হবে। একবার পার্টিশন প্রকল্পটি টোকেনের এনজিগ্রামের উপর ভিত্তি করে তৈরি হয়। টোকেনটি যদি একক শব্দ হয় তবে এটি 1 গ্রাম। যদি টোকেনটি দ্বি-শব্দের বাক্যাংশ হয় তবে এটি 2 গ্রাম। এবং এই যায়। প্রায় 4gram এ আমাদের প্রায় 1 বিলিয়ন রেকর্ড রয়েছে, প্রায় 60 গিগাবাইটের টেবিলের আকার রয়েছে।

আগত স্ট্রিমগুলি প্রক্রিয়াজাতকরণ

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

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

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

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

দিনের সমাপ্তি

দিনের শেষে, সিস্টেমে মেমোরিতে সংরক্ষিত ফ্রিকোয়েন্সি সহ অনেকগুলি ঘন ঘন টোকন থাকবে এবং কয়েকটি অন্যান্য ডিস্ক ফাইলগুলিতে সঞ্চিত অন্যান্য কম ঘন ঘন টোকন থাকবে (এবং প্রতিটি ফাইল সাজানো থাকে)।

সিস্টেমটি ইন-মেমরি মানচিত্রটিকে একটি ডিস্ক ফাইলে ফ্লাশ করে (এটি সাজান)। এখন, সমস্যাটি বাছাই করা ডিস্ক ফাইলের একটি সেট মার্জ হয়ে যায়। অনুরূপ প্রক্রিয়া ব্যবহার করে, আমরা শেষে একটি বাছাই করা ডিস্ক ফাইল পাবেন।

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

   for each record in sorted disk file
        update archive database by increasing frequency
        if rowcount == 0 then put the record into a list
   end for

   for each record in the list of having rowcount == 0
        insert into archive database
   end for

স্বজ্ঞাততাটি হ'ল কিছু সময়ের পরে, সন্নিবেশের সংখ্যাটি আরও ছোট হয়ে উঠবে। আরও এবং আরও বেশি অপারেশন কেবল আপডেট করা হবে। এবং এই আপডেটটি সূচক দ্বারা দন্ডিত হবে না।

আশা করি এই পুরো ব্যাখ্যাটি সাহায্য করবে। :)


আমি পাই না। শব্দের পূর্ণসংখ্যার আইডিতে কোন ধরণের অর্থপূর্ণ বাছাই বা তুলনা করা যায়? সংখ্যাগুলি কি স্বেচ্ছাচারী নয়?
দিমিত্রিস আন্দ্রেউ

এছাড়াও, শব্দের ঘনত্বগুলি গণনা হ'ল গুগলের ম্যাপ্রেডস পেপারে ( ল্যাবসগ্রাফিকাল্প / পেপারস / ম্যাপ্রেডস এইচটিএমএল ) প্রথম উদাহরণ , এটি মুষ্টিমেয় লাইনে স্ক্যালবেলি সমাধান করা। আপনি এমনকি গুগল অ্যাপ এঙ্গিনে আপনার ডেটা স্থানান্তর করতে এবং এই জাতীয় মানচিত্র (কোড. google.com/p/appengine-mapreduce ) করতে পারেন
দিমিত্রিস আন্দ্রেউ

@ ডিমিত্রিস অ্যান্ড্রেউ: স্ট্রিংয়ের উপর পূর্ণসংখ্যার বাছাই করা আরও দ্রুত হবে। এটি কারণ দুটি সংখ্যার সাথে তুলনা করা দুটি স্ট্রিংয়ের তুলনায় দ্রুত।
সিলেন্ট এসএনজি

@ ডিমিট্রিস অ্যান্ড্রেউ: গুগলের মানচিত্রটি এই সমস্যাটি সমাধান করার জন্য একটি দুর্দান্ত বিতরণ পদ্ধতি। আহ! লিঙ্ক সরবরাহ করার জন্য ধন্যবাদ। হ্যাঁ, একাধিক মেশিন ব্যবহার করে বাছাই করা আমাদের পক্ষে ভাল। চমৎকার পন্থা।
সিলেন্ট এসএনজি

@ ডিমিত্রিস অ্যান্ড্রেউ: এখন পর্যন্ত আমি কেবল একক মেশিন বাছাইয়ের পদ্ধতি বিবেচনা করছি। বিতরণ বাছাই করার জন্য কি দুর্দান্ত ধারণা।
সিলেন্ট এসএনজি

4

আপনি বাইনারি অনুসন্ধান গাছের সাথে মিলিত একটি হ্যাশ টেবিল ব্যবহার করতে পারেন । একটি অভিধান প্রয়োগ করুন যা আপনাকে জানায় যে প্রতিটি অনুসন্ধান শব্দটি কতবার অনুসন্ধান করা হয়েছিল।<search term, count>

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

এটি সর্বকালের সেরা -10-এর সমস্যা সমাধান করে।


সত্যই জটিল অংশটি মাসিক প্রতিবেদনে একটি শব্দটির সাথে অন্যটির স্থান গ্রহণের সাথে আচরণ করছে (উদাহরণস্বরূপ, "স্ট্যাক ওভারফ্লো" গত দুই মাসের জন্য 50 000 হিট হতে পারে, তবে গত মাসে মাত্র 10 000 হতে পারে, তবে "অ্যামাজনের" 40 থাকতে পারে গত দু'মাসের জন্য 000 তবে গত মাসে 30 000 টি monthly আপনি আপনার মাসিক প্রতিবেদনে "স্ট্যাক ওভারফ্লো" এর আগে "অ্যামাজন" আসতে চান)। এটি করার জন্য, আমি সমস্ত বড় (সর্বদা 10,000 উপরে) অনুসন্ধানের পদগুলির জন্য সংরক্ষণ করব, একটি 30 দিনের তালিকা যা আপনাকে জানায় যে প্রতি দিন এই শব্দটি কতবার অনুসন্ধান করা হয়েছিল। তালিকাটি একটি ফিফোর কাতারের মতো কাজ করবে: আপনি প্রথম দিনটি সরিয়ে দিন এবং প্রতিদিন একটি নতুন সন্নিবেশ করান (তবে প্রতি ঘন্টা, তবে আপনাকে আরও তথ্য সংরক্ষণ করতে হবে, যার অর্থ আরও বেশি মেমরি / স্পেস। এটি, অন্যথায় যে "অনুমান" জন্য যান

এটি একটি দুর্দান্ত শুরু বলে মনে হচ্ছে। তারপরে আপনি যে পদগুলিতে> 10 000 হিট রয়েছে তার ছাঁটাই সম্পর্কে চিন্তিত হতে পারেন তবে অনেক দিন হয়নি এবং এর মতো স্টাফ রয়েছে।


3

কেস আই)

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

শীর্ষস্থানীয় দশের তালিকার জন্য ও (1) অনুসন্ধান এবং হ্যাশটবেলে সর্বাধিক ও (লগ (এন)) সন্নিবেশ (স্ব-ভারসাম্য বাইনারি গাছ দ্বারা পরিচালিত সংঘর্ষগুলি ধরে নেওয়া)।

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

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

Time: 0 hours
      -Search Terms:
          -free stuff: 56
          -funny pics: 321
          -stackoverflow: 1234
Time: 1 hour
      -Search Terms:
          -ebay: 12
          -funny pics: 1
          -stackoverflow: 522
          -BP sucks: 92

তারপরে, প্রতি ঘন্টা: যদি তালিকার কমপক্ষে 720 ঘন্টা দীর্ঘ হয় (এটি 30 দিনের মধ্যে কয়েক ঘন্টার সংখ্যা), তালিকার প্রথম উপাদানটি দেখুন এবং প্রতিটি অনুসন্ধানের শব্দটির জন্য উপযুক্ত পরিমাণে হ্যাশটেবলের সেই উপাদানটি হ্রাস করতে হবে । এরপরে তালিকার প্রথম ঘন্টাটির উপাদানটি মুছুন।

সুতরাং আসুন আমরা 721 ঘন্টা এ বলি এবং আমরা আমাদের তালিকার প্রথম দিকে (উপরে) তাকানোর জন্য প্রস্তুত। আমরা হ্যাশটেবল, মজাদার ছবিগুলিতে 321 ইত্যাদি দ্বারা ফ্রি স্টাফ হ্রাস করতে চাই এবং তারপরে 0 ঘন্টাটিকে পুরোপুরি সরিয়ে ফেলব কারণ আমাদের আর এটি দেখার দরকার নেই।

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


সম্পাদনা করুন: স্থানের যথার্থতা ত্যাগ করা হচ্ছে ...

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


2

মোটামুটি চিন্তাভাবনা ...

সর্বকালের শীর্ষ দশের জন্য

  • হ্যাশ সংগ্রহ ব্যবহার করে যেখানে প্রতিটি শর্তের জন্য একটি গণনা সঞ্চয় করা হয় (শোধন শর্তাদি ইত্যাদি)
  • একটি সাজানো অ্যারে যা চলমান শীর্ষ 10 টি অন্তর্ভুক্ত করে, একটি পদ / গণনা এই অ্যারেতে যুক্ত হয় যখনই কোনও পদটির গণনা অ্যারের ক্ষুদ্রতম গণনার চেয়ে সমান বা বৃহত্তর হয়

মাসিক শীর্ষ 10 জন্য প্রতি ঘন্টা আপডেট করা হয়:

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

ত্রুটি ... মানে? আমি বাস্তব জীবনে যেমনটি করতাম তেমনটি ভাবিনি

হ্যাঁ, উল্লেখ করতে ভুলে গেছেন, মাসিক পরিসংখ্যানগুলির জন্য প্রয়োজনীয় প্রতি ঘন্টার "অনুলিপি / সমতলকরণ" প্রকৃতপক্ষে সর্বকালের শীর্ষ দশের জন্য ব্যবহৃত একই কোডটি পুনরায় ব্যবহার করতে পারে, একটি দুর্দান্ত পার্শ্ব প্রতিক্রিয়া।


2

সঠিক সমাধান

প্রথমত, এমন একটি সমাধান যা সঠিক ফলাফলের গ্যারান্টি দেয় তবে এর জন্য প্রচুর স্মৃতি প্রয়োজন (একটি বড় মানচিত্র)।

"সর্বকালীন" বৈকল্পিক

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

প্রশ্নের স্ট্রিমটি পড়ার সাথে সাথে মানচিত্রটিকে নিয়মিত আপডেট করুন। প্রতিবার কোনও গণনা বর্তমান প্রান্তিকের চেয়ে বেশি হয়ে গেলে, নিম্নলিখিতটি করুন: "শীর্ষ 10" তালিকা থেকে 10 তম কোয়েরিটি সরিয়ে ফেলুন, আপনার সদ্য আপডেট হওয়া ক্যোয়ারীটি এটির সাথে প্রতিস্থাপন করুন এবং পাশাপাশি থ্রোসোল্ডটিও আপডেট করুন।

"গত মাসে" বৈকল্পিক

একই "শীর্ষ 10" তালিকা রাখুন এবং উপরের মত একইভাবে আপডেট করুন। এছাড়াও, অনুরূপ মানচিত্র রাখুন, তবে এবার 30 * 24 = 720 গণনা (প্রতি ঘন্টাের জন্য একটি) ভেক্টরকে মান হিসাবে সঞ্চয় করুন। প্রতি ঘন্টা প্রতিটি কীটির জন্য নিম্নলিখিতটি করুন: ভেক্টর থেকে পুরানো কাউন্টারটি সরিয়ে ফেলুন শেষে একটি নতুন যুক্ত করুন (0 থেকে শুরু)) ভেক্টর অল-শূন্য থাকলে মানচিত্র থেকে কীটি সরান। এছাড়াও, প্রতি ঘন্টা আপনাকে স্ক্র্যাচ থেকে "শীর্ষ 10" তালিকা গণনা করতে হবে।

দ্রষ্টব্য: হ্যাঁ, এবার আমরা একটির পরিবর্তে 720 টি পূর্ণসংখ্যা সংরক্ষণ করছি, তবে অনেকগুলি কী রয়েছে (সর্বকালের বৈকল্পিকটির সত্যই দীর্ঘ লেজ রয়েছে)।

অনুমান

এই অনুমানগুলি সঠিক সমাধানের গ্যারান্টি দেয় না, তবে কম স্মৃতিশক্তি গ্রহণ করে।

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

আমি আনুমানিক 1 এর মধ্যে সম্ভাব্য পদ্ধতির পছন্দ করি But তবে আনুমানিক 2 (এলআরইউ ক্যাশে) ব্যবহার করে, প্রাথমিকভাবে খুব বেশি জনপ্রিয় ছিল না এমন পদগুলি পরে জনপ্রিয় হয়ে উঠলে কী ঘটে? তাদের যোগ করা প্রত্যেকবার যুক্ত হওয়ার পরে কি তাদের ফেলে দেওয়া হবে না, কারণ তাদের গণনা খুব কম হবে?
দেল

@ ডেল আপনি ঠিক বলেছেন, দ্বিতীয় অনুমানটি কেবলমাত্র অনুসন্ধানের কয়েকটি স্ট্রিমের জন্য কাজ করবে। এটি কম নির্ভরযোগ্য, তবে একই সাথে কম সংস্থান প্রয়োজন। দ্রষ্টব্য: আপনি উভয় অনুমানকে একত্রিত করতে পারেন।
বলো

2

গত মাসে শীর্ষস্থানীয় 10 টি শর্তাবলী

মেমোরি দক্ষ ইন্ডেক্সিং / ডেটা স্ট্রাকচার, যেমন শক্তভাবে প্যাক করা চেষ্টাগুলি (উইকিপিডিয়া এন্ট্রি থেকে চেষ্টা করে ) ব্যবহার করে প্রায় মেমরির প্রয়োজনীয়তা এবং n - পদগুলির সংখ্যার মধ্যে কিছু সম্পর্ককে সংজ্ঞায়িত করে।

যদি প্রয়োজনীয় মেমরি উপলব্ধ থাকে ( অনুমান 1 ), আপনি সঠিক মাসিক পরিসংখ্যান রাখতে এবং প্রতি মাসে এটি সর্বকালের পরিসংখ্যানগুলিতে একত্রিত করতে পারেন।

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

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

অনুমান 1

যদি আমরা পুরো মাসের জন্য নিখুঁত পরিসংখ্যানটি ধরে রাখতে না পারি তবে আমাদের একটি নির্দিষ্ট সময়কালের সন্ধান করা উচিত যার জন্য আমাদের নিখুঁত পরিসংখ্যান রাখতে সক্ষম হওয়া উচিত। উদাহরণস্বরূপ, ধরে নিলাম আমাদের কাছে কিছু সময়ের পি সম্পর্কে নিখুঁত পরিসংখ্যান রয়েছে যা মাসের n বারে যায়।
পারফেক্ট পরিসংখ্যান ফাংশন সংজ্ঞায়িত করে f(search_term) -> search_term_occurance

আমরা যদি সমস্ত nনিখুঁত স্ট্যাটাস টেবিলগুলিকে স্মৃতিতে রাখতে পারি তবে স্লাইডিং মাসিক পরিসংখ্যানগুলি এইভাবে গণনা করা যেতে পারে:

  • নতুন সময়ের জন্য পরিসংখ্যান যুক্ত করুন
  • প্রাচীনতম সময়ের জন্য পরিসংখ্যানগুলি সরান (সুতরাং আমাদের nনিখুঁত স্ট্যাট টেবিল রাখতে হবে )

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

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

শীর্ষ 10 টিরও বেশি শর্তাদি তথ্য রাখার মাধ্যমে এটি অফসেট করা যেতে পারে, উদাহরণস্বরূপ শীর্ষ 100 শর্তাদি, আশা করি শীর্ষ 10 টি সঠিক হবে।

আমি মনে করি যে আরও বিশ্লেষণের পরিসংখ্যানের অংশ হয়ে উঠতে (যা সর্বাধিক ত্রুটির সাথে সম্পর্কিত) হয়ে ওঠার জন্য প্রয়োজনীয় ন্যূনতম সংখ্যার সাথে সম্পর্কিত হতে পারে I

(কোন এন্ট্রিগুলি পরিসংখ্যানগুলির অংশ হওয়া উচিত সে সিদ্ধান্তে প্রবণতাগুলিও নিরীক্ষণ ও ট্র্যাক করতে পারে; উদাহরণস্বরূপ, যদি প্রতিটি সময়ের পিতে প্রতিটি সময়কালে সংঘটিতের রৈখিক এক্সট্রোপোলেশন আপনাকে বলে যে এই শব্দটি এক বা দুই মাসের মধ্যে আপনি তাত্পর্যপূর্ণ হয়ে উঠবেন আপনি ইতিমধ্যে এটি ট্র্যাকিং শুরু হতে পারে Similar অনুরূপ নীতিটি ট্র্যাক পুল থেকে অনুসন্ধান শব্দটি সরিয়ে দেওয়ার জন্য প্রযোজ্য))

উপরোক্তগুলির জন্য সবচেয়ে খারাপ ক্ষেত্রে হ'ল যখন আপনার প্রায় সমানভাবে ঘন ঘন শর্তাবলী থাকে এবং সেগুলি সর্বদা পরিবর্তিত হয় (উদাহরণস্বরূপ যদি কেবল 100 টি শর্তাদি অনুসরণ করা হয়, তবে শীর্ষ 150 পদ যদি সমানভাবে ঘন ঘন ঘটে থাকে তবে শীর্ষ 50 টি প্রথম মাসে বেশি হয় এবং পাছে বেশিরভাগ সময় পরে পরিসংখ্যান সঠিকভাবে রাখা হবে না)।

এছাড়াও আরেকটি পদ্ধতি থাকতে পারে যা মেমরির আকারে স্থির নয় (ভালভাবে কঠোরভাবে বলা উপরেরটি নয়), যা সংঘটন / সময়কাল (দিন, মাস, বছর, সর্বকালীন) এর ক্ষেত্রে ন্যূনতম তাত্পর্যকে সংজ্ঞায়িত করবে যার জন্য এটি রাখা উচিত পরিসংখ্যান। এটি সম্মিলনের সময় প্রতিটি পরিসংখ্যানে সর্বোচ্চ ত্রুটির গ্যারান্টি দিতে পারে (আবার রাউন্ড রবিন দেখুন)।


2

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

এখানে অ্যালগরিদমের একটি দৃশ্য উপস্থাপনা: ক্লক পৃষ্ঠা প্রতিস্থাপন অ্যালগরিদম


0

জায়ান্ট হ্যাশ টেবিলের মধ্যে অনুসন্ধানের পদগুলির গণনা সংরক্ষণ করুন, যেখানে প্রতিটি নতুন অনুসন্ধানের ফলে একটি নির্দিষ্ট উপাদানকে একে একে বাড়ানো হয়। শীর্ষ 20 বা তত্কালীন অনুসন্ধান শর্তাদি নজর রাখুন; যখন 11 তম স্থানে উপাদানটি বাড়ানো হয় তখন এটি # 10 * দিয়ে অবস্থানের অদলবদল করা দরকার কিনা তা পরীক্ষা করে দেখুন (শীর্ষ 10টি বাছাই করা প্রয়োজনীয় নয়; আপনি যে সমস্ত বিষয় যত্নশীল তা 10 ম এবং 11 তম মধ্যে পার্থক্য আঁকছে)।

* নতুন অনুসন্ধান শব্দটি 11 তম স্থানে রয়েছে কিনা তা দেখতে অনুরূপ চেকগুলি করা দরকার, সুতরাং এই অ্যালগরিদম অন্যান্য অনুসন্ধানের পদগুলিতেও বুদবুদ হয় - তাই আমি কিছুটা সরল করছি।


আপনি আপনার হ্যাশ টেবিলের আকার সীমাবদ্ধ করতে চাইবেন। আপনি যদি অনন্য অনুসন্ধানের একটি স্ট্রিম পান তবে কি হবে? আপনার অবশ্যই নিশ্চিত হওয়া উচিত যে আপনি নিয়মিত কিন্তু খুব কম সময়ে অনুসন্ধান করা একটি শব্দ লক্ষ্য করা থেকে নিজেকে আটকাচ্ছেন না। সময়ের সাথে সাথে এটি শীর্ষ সন্ধানের শব্দ হতে পারে, বিশেষত যদি অন্য সমস্ত অনুসন্ধান পদগুলি "বর্তমান ঘটনা" হয়, যেমন এখন প্রচুর অনুসন্ধান করা হয়েছে, তবে পরের সপ্তাহে তেমন নয়। প্রকৃতপক্ষে, এই জাতীয় বিবেচনাগুলি আপনি তৈরি করতে চান এমন আনুমানিকতা হতে পারে। এগুলি বলার দ্বারা ন্যায়সঙ্গত করুন, আমরা এই ধরণের জিনিসগুলি ধরব না কারণ এটি করার কারণে অ্যালগরিদম পথটি আরও সময় / স্থান ব্যয়বহুল হয়ে যায়।
কেপ 1232

আমি নিশ্চিত যে গুগলের কাছে সমস্ত কিছুর একটি গণনা রয়েছে - কিছু পরিসংখ্যান স্থিতিশীলভাবে রক্ষণাবেক্ষণ করা হয় না, বরং প্রয়োজনীয় হিসাবে গণনা করা হয়।
ইথার

0

কখনও কখনও সেরা উত্তর হয় "আমি জানি না"।

আমি আরও গভীর ছুরিকাঘাত করব। আমার প্রথম প্রবৃত্তিটি ফলাফলকে একটি Q এ খাওয়ানো হবে process

পদ -> গণনা

প্রতিবার একটি কিউ আইটেম প্রক্রিয়া করা হয়, আপনি কেবল অনুসন্ধান শব্দটি সন্ধান করেন এবং গণনা বৃদ্ধি করেন।

একই সময়ে, আমি মানচিত্রে শীর্ষ 10 এন্ট্রিগুলির জন্য রেফারেন্সের একটি তালিকা বজায় রাখব।

বর্তমানে যে এন্ট্রি প্রয়োগ করা হয়েছিল তার জন্য, শীর্ষ ১০-এর ক্ষুদ্রতম প্রবেশের গণনার চেয়ে তার গণনা বড় কিনা তা দেখুন (যদি ইতিমধ্যে তালিকায় নেই) in যদি তা হয় তবে এন্ট্রির সাথে সবচেয়ে ছোটটি প্রতিস্থাপন করুন।

আমি মনে করি এটি কাজ করবে। কোন অপারেশন সময় নিবিড় হয়। গণনা মানচিত্রের আকার পরিচালনা করার জন্য আপনাকে একটি উপায় খুঁজতে হবে। তবে এটি একটি সাক্ষাত্কারের উত্তরের জন্য যথেষ্ট ভাল।

তারা কোনও সমাধানের প্রত্যাশা করছেন না, এটি আপনি ভাবতে পারেন কিনা তা দেখতে চাই। আপনার তখন সমাধানটি লিখতে হবে না ...


12
ডেটা স্ট্রাকচারকে বলা হয় একটি queue, Qএকটি চিঠি :)।
আইভ্ল্যাড

3
যদি আমি সাক্ষাত্কারটি পরিচালনা করতাম তবে "আমি জানি না <স্টপ>" সেরা উত্তর হবে না। আপনার পায়ে চিন্তা করুন। যদি আপনি না জানেন তবে এটি বের করুন - বা কমপক্ষে চেষ্টা করুন।
স্টিফেন

সাক্ষাত্কারে, যখন আমি হাইবারনেটযুক্ত কাউকে তাদের their পৃষ্ঠায় পুনরায় শুরু করতে দেখি এবং তারা আমাকে ওআরএম কী তা বলতে পারে না, আমি সঙ্গে সঙ্গে সাক্ষাত্কারটি শেষ করি। আইডির পরিবর্তে তারা এটিকে তাদের জীবনবৃত্তান্তে রাখে না এবং কেবল বলে: "আমি জানি না"। নুনি সব জানেন। @ আইআইআইডিএড, আমি ভান করছি যে আমি সি বিকাশকারী ছিলাম এবং বিটগুলি সংরক্ষণ করার চেষ্টা করছিলাম ...;)
এইচভিগোটকোড

0

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

অ্যালগরিদম সহজ, তবে অপূর্ণতা আরও বেশি স্মৃতি এবং সময় খরচ হবে।


0

10 নোড সহ একটি স্প্লে ট্রি ব্যবহার সম্পর্কে কী ? প্রতিবার আপনি গাছের মধ্যে থাকা কোনও মান (অনুসন্ধান শব্দ) অ্যাক্সেস করার চেষ্টা করবেন না, কোনও পাতা ফেলে দিন, পরিবর্তে মানটি সন্নিবেশ করুন এবং এটি অ্যাক্সেস করুন।

এর পিছনে ধারণাটি আমার অন্যান্য উত্তরের মতোই । এই অনুমানের অধীনে যে অনুসন্ধানের পদগুলি সমানভাবে / নিয়মিত অ্যাক্সেস করা হয় এই সমাধানটি খুব ভাল সম্পাদন করা উচিত।

সম্পাদন করা

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


0

ডান্নো যদি বুঝি ঠিক আছে কিনা। আমার সমাধান হিপ ব্যবহার করা হয়। শীর্ষ 10 অনুসন্ধান আইটেমগুলির কারণে, আমি 10 মাপের একটি গাদা তৈরি করি Then যদি কোনও নতুন অনুসন্ধানের ফ্রিকোয়েন্সি হিপ (ম্যাক্স হিপ) শীর্ষের চেয়ে বেশি হয় তবে আপডেট করুন। সবচেয়ে ছোট ফ্রিকোয়েন্সি সহ একটিকে ত্যাগ করুন।

তবে, কীভাবে নির্দিষ্ট অনুসন্ধানের ফ্রিকোয়েন্সি গণনা করা যায় তা অন্য কোনও কিছুতে গণনা করা হবে। সবাই যেমন বলেছে, ডেটা স্ট্রিম অ্যালগরিদম ....


0

শুরু থেকে সমস্ত অনুসন্ধানের গণনা সংরক্ষণের জন্য সেমি-স্কেচ ব্যবহার করুন, শীর্ষ 10 এর সাথে এটির সাথে 10 মাপের একটি নূন্যতম হিপ রাখুন, মাসিক ফলাফলের জন্য, 30 সেমি-স্কেচ / হ্যাশ-টেবিল রাখুন এবং এটির সাথে ন্যূনতম হিপ রাখুন, প্রতিটি শুরু করুন গত 30, 29 .. থেকে 1 দিন গণনা এবং আপডেট হচ্ছে। একটি দিন পাস হিসাবে, শেষটি সাফ করুন এবং এটি দিন হিসাবে 1 ব্যবহার করুন। প্রতি ঘন্টা ফলাফলের জন্য একই, 60 হ্যাশ-টেবিল এবং ন্যূনতম হিপ রাখুন এবং শেষ 60, 59, ... 1 মিনিটের জন্য গণনা শুরু করুন। এক মিনিট সময় হিসাবে, শেষটি সাফ করুন এবং এটি মিনিট 1 হিসাবে ব্যবহার করুন।

গোপনীয় ফলাফল 1 দিনের ব্যাপ্তিতে নির্ভুল, প্রতি ঘণ্টায় ফলাফল 1 মিনিটের ব্যাপ্তিতে নির্ভুল


0

আপনার যখন একটি নির্দিষ্ট পরিমাণ মেমরি এবং টোকেনের একটি 'অসীম' (খুব বড় ভাবেন) স্ট্রিম থাকে তখন সমস্যাটি সর্বজনীনভাবে সমাধানযোগ্য নয়।

মোটামুটি ব্যাখ্যা ...

কেন তা দেখতে, ইনপুট প্রবাহে প্রতিটি এন টোকেনের একটি নির্দিষ্ট টোকেন (অর্থাত্ শব্দ) টি রয়েছে এমন একটি টোকেন স্ট্রিম বিবেচনা করুন।

এছাড়াও, ধরে নিন যে মেমরিটি সর্বাধিক এম টোকেনগুলিতে রেফারেন্সগুলি (ওয়ার্ড আইডি এবং গণনা) রাখতে পারে।

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

এটি শীর্ষ-এন অ্যালগরিদমের বিশদগুলির থেকে পৃথক। এটি কেবল এম এর সীমা উপর নির্ভর করে

কেন এটি সত্য তা দেখতে দুটি অভিন্ন টোকেনের গ্রুপ নিয়ে আগত স্ট্রিমটি বিবেচনা করুন:

T a1 a2 a3 ... a-M T b1 b2 b3 ... b-M ...

যেখানে ক এবং খ এর সমস্ত বৈধ টোকেন টি এর সমান নয় where

লক্ষ করুন যে এই স্ট্রিমে টি প্রতিটি আই এবং দ্বি দ্বিগুণ হয়ে থাকে। তবুও এটি সিস্টেম থেকে বিচ্ছিন্নভাবে খুব কমই উপস্থিত হয়।

খালি মেমরি দিয়ে শুরু করে, প্রথম টোকেন (টি) মেমরিতে একটি স্লট গ্রহণ করবে (এম দ্বারা আবদ্ধ)। তারপরে এম 1 ক্লান্ত হয়ে যাবে, এম থেকে ক্লান্ত হয়ে যাওয়ার পরে সমস্ত পথে a- (M-1) ব্যবহার করবে।

যখন এএম এলগোরিদিম এলে একটি প্রতীক ফেলে দিতে হয় তাই এটি টি হতে দিন next পরের প্রতীকটি বি -১ হবে যা এ -১ টি প্রবাহিত করবে, ইত্যাদি etc.

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

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