খুব বড় ফাইলে যে উপাদানটি সবচেয়ে বেশি ঘটে তা সন্ধান করা হচ্ছে


12

আমি এই সাক্ষাত্কারের প্রশ্নটি অনেক জিজ্ঞাসা করেছি শুনেছি এবং ভাল উত্তরগুলি কী হতে পারে সে সম্পর্কে আমি কিছু মতামত পাওয়ার আশা করছিলাম: আপনার কাছে একটি বড় ফাইল 10+ গিগাবাইট রয়েছে এবং আপনি কোন উপাদানটি সবচেয়ে বেশি ঘটে তা খুঁজে পেতে চান, একটি ভাল উপায় কী এটা করতে?

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

একাধিক থ্রেডের মাধ্যমে পুনরাবৃত্তি করতে এবং প্রক্রিয়া করার জন্য ফাইলটি বিভক্ত করার মধ্যে আমি অন্যান্য চিন্তাভাবনাগুলি অন্তর্ভুক্ত করেছি এবং তারপরে ফলাফলগুলি একত্রিত করেছি, তবে মানচিত্রের জন্য মেমরির সমস্যা এখনও আছে।


2
ফাইলের উপাদানগুলি কী কী? তারা স্ট্রিং হয়? আপনি যদি উপাদানগুলির জন্য অক্ষর গ্রহণ করেন তবে মানচিত্রে কোনও মেমরির সমস্যা হবে না। উপাদানগুলি যদি শব্দ হয় তবে আমি আবারও মনে করি এটি কোনও সমস্যা হবে না। আপনার যদি সমস্ত সম্ভাব্য সাবস্ট্রিংগুলি থাকে, তবে আপনার সমস্যা হতে পারে ...
Nejc

1
যদি শর্তটি "এমন একটি উপাদান ছিল যা মোট উপাদানগুলির অর্ধেকেরও বেশি প্রদর্শিত হয়" তবে একটি রৈখিক সমাধান ছিল।
st0le

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

1
যদি বয়ের-মুর সংখ্যাগরিষ্ঠ প্রার্থী অ্যালগরিদম প্রযোজ্য হয় তবে এটি লিনিয়ার সময়ে চলে এবং স্থানে রয়েছে।
জুহো

উত্তর:


6

আপনার যখন সত্যই বড় ফাইল এবং এতে অনেকগুলি উপাদান রয়েছে তবে সর্বাধিক সাধারণ উপাদানটি খুব সাধারণ - সময় ভগ্নাংশ হয় - আপনি স্থান ( কে ) শব্দগুলির সাথে রৈখিক সময়ে এটি খুঁজে পেতে পারেন ( হে ( ) স্বরলিখনের মধ্যে ধ্রুবকটি খুব ছোট, মূলত 2 যদি আপনি হ্যাশিংয়ের মতো সহায়ক জিনিসের জন্য সঞ্চয়স্থান গণনা না করেন)। তদুপরি, এটি বাহ্যিক স্টোরেজ সহ দুর্দান্ত কাজ করে, কারণ ফাইলটি একসাথে একটি উপাদানকে ক্রমানুসারে প্রক্রিয়া করা হয় এবং অ্যালগরিদম কখনই "পিছনে ফিরে দেখায়" না। এটি করার একটি উপায় হ'ল মিশ্রা এবং গ্রিজের একটি ধ্রুপদী অ্যালগরিদমের মাধ্যমে, এই বক্তৃতা নোটগুলি দেখুন>1/kO(k)O()। সমস্যাটি এখন ভারী হিটার সমস্যা হিসাবে পরিচিত (ঘন ঘন উপাদানগুলি ভারী হিটকারী হওয়ায়)।

খুব ঘন ঘন উপাদান প্রদর্শিত হয় এমন অনুমান খুব কম সংখ্যক সংখ্যক সময়ের জন্য সময়ের 1 / কে ভগ্নাংশটি দৃ seem় মনে হতে পারে তবে এটি প্রয়োজনীয় উপায়ে! উদাহরণস্বরূপ, আপনার কাছে যদি আপনার ফাইলে ক্রমান্বয়ে অ্যাক্সেস থাকে (এবং যদি ফাইলটি বিশাল এলোমেলো অ্যাক্সেস খুব ব্যয়বহুল হয়), কোনও অ্যালগরিদম যা সর্বদা নিয়মিত সংখ্যায় পাসের সংখ্যায় সবচেয়ে ঘন উপাদান খুঁজে বের করে তা উপাদানগুলির সংখ্যায় স্পেস লিনিয়ার ব্যবহার করবে । সুতরাং আপনি যদি ইনপুট সম্পর্কে কিছু না ধরে থাকেন তবে আপনি হ্যাশ টেবিলটি বীট করতে পারবেন না। খুব ঘন ঘন উপাদান খুব ঘন ঘন এই ধারণাটি সম্ভবত নেতিবাচক ফলাফলগুলির কাছাকাছি আসার সবচেয়ে প্রাকৃতিক উপায়।>1/kk

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

  • যদি ফাইলের বর্তমান উপাদানটি সঞ্চিত উপাদানগুলির সমান হয় তবে একটি করে গণনা বাড়ান
  • যদি ফাইলের বর্তমান উপাদান স্টোরেজ উপাদান থেকে আলাদা হয় তবে একের সাথে গণনা হ্রাস করুন
  • যদি আপডেট গণনা 0 হয় তবে সঞ্চিত উপাদানটিকে "কিক আউট" করুন এবং ফাইলটির বর্তমান উপাদানটি সংরক্ষণ করুন; গণনা 1 এ বাড়িয়ে দিন
  • ফাইলের পরবর্তী উপাদানটিতে এগিয়ে যান

এই প্রক্রিয়াটি সম্পর্কে একটু চিন্তাভাবনা আপনাকে বোঝাবে যে যদি সেখানে একটি "সংখ্যাগরিষ্ঠ" উপাদান উপস্থিত থাকে, অর্থাৎ অর্ধেকেরও বেশি সময় উপস্থিত হয়, তবে সেই ফাইলটি পুরো ফাইলটি প্রক্রিয়া করার পরে সঞ্চিত উপাদান হবে be

kk1k1kk

k11/kO(k)

k1/kk1


আপনি বায়ার-মুর বা মিস্রা-গ্রিজ-ডেমাইন আলগোরিদিমগুলি ব্যবহার করতে পারবেন না। উল্লিখিত সমস্যাটি ভিন্ন: আপনি সংখ্যাগরিষ্ঠ উপাদান অনুসন্ধান করছেন না, তবে এমন উপাদানটির জন্য যা ঘটনাকারী> = সমস্ত উপাদানের সংঘটন হিসাবে of এখানে একটি সাধারণ পাল্টা নমুনা। আসুন n এর মতো সামগ্রীর মোট সংখ্যা, যেমন এন = 2 কে + 1 । প্রথম কে উপাদানগুলিকে 0 হতে দিন, পরবর্তী কে উপাদানগুলি 1 এবং শেষ উপাদানটি 2 হওয়া উচিত The তবে, এই নির্দিষ্ট উদাহরণের জন্য আউটপুটটি 0 বা 1 এর হতে হবে
ম্যাসিমো ক্যাফারো

O(1)Ω(n)

আমি কেবল উল্লেখ করেছি যে আপনি যদি ভুল ধারণা তৈরি করেন তবে আপনি ভুল ফলাফল পেতে পারেন। এর চেয়ে আরও ভাল কী, একটি ছোট মেমরির পদচিহ্ন এবং একটি সম্ভাব্য ভুল ফলাফল বা সঠিক ফলাফল এমনকি আপনার আরও কিছু স্মৃতি ব্যয় করতে পারে? যদি আমার কোনও সম্ভাব্য ভুল ফলাফল চয়ন করতে হয় তবে আমি বয়ির-মুরের মতো এমন কিছু ধরে নিচ্ছি যা আমি জানি না এটি আসলে সত্য।
ম্যাসিমো কাফেরো

@ মাসিমো ক্যাফারো যেটি আপনার নিতে হবে এমন কোনও ট্রেড অফ নয়। যেহেতু আমি ফাইলটির ওপরে একটি একক পাস সহজেই যাচাই করেছিলাম যদি ধারণাটি সন্তুষ্ট হয়!
সাশো নিকোলভ

@ মাসিমো ক্যাফারো এবং এটি কেবল তুচ্ছ সমাধান! কোনও অতিরিক্ত পাস ছাড়াই সিএম স্কেচ সহ উচ্চ সম্ভাবনার সাথে অনুমানটি যাচাই করা যেতে পারে।
সাশো নিকোলভ

3

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

Θ(nlogn).


আপনি কি হাফম্যান এনকোডিং পদ্ধতির আরও বিস্তারিত বলতে পারবেন? আমি এর আগে একটি হাফম্যান এনকোডার লিখেছি তবে কিছুক্ষণ হয়ে গেছে, আপনি ঠিক কীভাবে এ ক্ষেত্রে ব্যবহার করবেন?
প্যাট

@ প্যাট কখনই সেই অংশটি মনে রাখবেন না এটি খুব সকালে হয়েছিল এবং একরকম আমি ভেবেছিলাম যে ইনপুটটি সংকুচিত করার অর্থ হবে।
জের্নেজ

1

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


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