অসীম তালিকা থেকে 100 টি সর্বোচ্চ নম্বর পান


53

আমার এক বন্ধুকে এই সাক্ষাত্কারের প্রশ্ন জিজ্ঞাসা করা হয়েছিল -

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

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

তারপর প্রশ্ন বাড়ানো হয়েছিল -

"আপনি কী নিশ্চিত করতে পারেন যে সন্নিবেশের আদেশটি ও (1) হওয়া উচিত? এটি কি সম্ভব?"

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

আমি ভারসাম্য বাইনারি গাছের কথা ভেবেছিলাম, তবে সেখানেও আপনি 1 ক্রমানুসারে সন্নিবেশ পাবেন না। একই প্রশ্নটি আমার এখনই আছে। উপরের সমস্যার জন্য অর্ডার 1-এ সন্নিবেশ করতে পারে এমন কোনও ডেটা স্ট্রাকচার আছে কিনা তা জানতে চেয়েছিলেন বা এটি মোটেও সম্ভব নয়।


19
হতে পারে এটি কেবল আমার প্রশ্নের ভুল বোঝাবুঝি, তবে কেন আপনার বাছাই করা তালিকা রাখা দরকার ? কেন কেবল সর্বনিম্ন সংখ্যার উপরে নজর রাখবেন না, এবং যদি এর চেয়ে বেশি সংখ্যক একটি নম্বর মুখোমুখি হয় তবে সর্বনিম্ন সংখ্যাটি সরিয়ে নতুন নম্বরটিতে তালিকাটি বাছাই না করে রাখুন। এটি আপনাকে ও (1) দেবে।
এডোডোডো

36
@ এডোডো - এবং এই অপারেশনের পরে, আপনি কীভাবে জানবেন যে নতুন সর্বনিম্ন সংখ্যাটি কী?
দামিয়েন_ও_বিশ্বাসীরা

19
[O (100 * লগ (100)) = ও (1)] তালিকাটি সাজান বা নতুন সর্বনিম্ন নম্বর পেতে সর্বনিম্ন [ও (100) = ও (1)] এর মাধ্যমে লিনিয়ার অনুসন্ধান করুন search আপনার তালিকাটি একটি ধ্রুব আকার, সুতরাং এই সমস্ত ক্রিয়াকলাপ এছাড়াও ধ্রুবক সময়।
র্যান্ডম 832

6
আপনার পুরো তালিকাটি বাছাই করতে হবে না। সর্বোচ্চ বা ২ য়-সর্বোচ্চ সংখ্যাটি কী তা আপনার যত্ন নেই। আপনাকে কেবল সর্বনিম্নটি ​​কী তা জানতে হবে। সুতরাং আপনি একটি নতুন সংখ্যা sertোকানোর পরে, আপনি কেবল 100 সংখ্যাগুলি অতিক্রম করবেন এবং দেখুন যেটি এখন সবচেয়ে কম। এটা ধ্রুবক সময়।
টম জাইচ

27
কোনও অপারেশনের অ্যাসিম্পটোটিক ক্রমটি কেবল তখনই আকর্ষণীয় যখন সমস্যার আকারটি বাধা ছাড়াই বাড়তে পারে। আপনার প্রশ্ন থেকে এটি খুব স্পষ্ট নয় যে কোন পরিমাণটি আবদ্ধ ছাড়া বাড়ছে; দেখে মনে হচ্ছে আপনি অ্যাসেম্পটোটিক অর্ডার এমন কোনও সমস্যার জন্য যা জিজ্ঞাসা করছেন যার আকার 100 গন্ডীযুক্ত; এটি জিজ্ঞাসা করা একটি বুদ্ধিমান প্রশ্নও নয়; কিছু আবদ্ধ ছাড়া বাড়তে হবে। যদি প্রশ্নটি হয় "ও (1) সময়ে আপনি কি শীর্ষ 100 টি না, শীর্ষ 100 টি রাখার জন্য এটি করতে পারেন?" তাহলে প্রশ্নটি বুদ্ধিমানের।
এরিক লিপার্ট

উত্তর:


35

ধরা যাক কে আপনি সর্বাধিক সংখ্যার জানতে চান (আপনার উদাহরণে 100)। তারপরে, আপনি একটি নতুন নম্বর যুক্ত করতে পারেন O(k)যা এটি O(1)। কারণ O(k*g) = O(g) if k is not zero and constant


6
ও (50) হ'ল হে (এন), ও (1) নয়। ও (1) সময়ে দৈর্ঘ্যের N এর তালিকাতে সন্নিবেশনের অর্থ হ'ল সময় N এর মানের উপর নির্ভর করে না তার অর্থ 100 যদি 10000 হয়ে যায় তবে 50 টি অবশ্যই 5000 হয়ে উঠবে না।

18
@ হ্যামস্টারজিন - তবে এই প্রশ্নের ক্ষেত্রে, Nবাছাই করা তালিকার আকার বা এতদূর পর্যন্ত প্রক্রিয়াজাত হওয়া আইটেমগুলির সংখ্যা কী? আপনি যদি 10000 আইটেমগুলি প্রক্রিয়া করেন এবং শীর্ষস্থানীয় 100 আইটেমগুলিকে তালিকায় রাখেন বা 1000000000 আইটেমগুলি প্রসেস করেন এবং শীর্ষ 100 আইটেমকে বাছাই করা তালিকায় রাখেন তবে সেই তালিকার সন্নিবেশ ব্যয় একই থাকবে।
দামিয়েন_ও_বিশ্বাসীরা

6
@ হ্যামস্টারজিন: সেক্ষেত্রে আপনি বেসিকগুলি ভুল পেয়েছেন। আপনার উইকিপিডিয়া লিংকের মাধ্যমে একটি সম্পত্তি ( "একটি ধ্রুবক দ্বারা গুণ") থাকে: O(k*g) = O(g) if k not zero and constant। => O(50*1) = O(1)
duedl0r

9
আমি মনে করি duedl0r ঠিক আছে। আসুন সমস্যা হ্রাস করুন এবং বলুন যে আপনার কেবল ন্যূনতম এবং সর্বাধিক মান প্রয়োজন। সর্বনিম্ন এবং সর্বোচ্চ 2 এর কারণে এটি কি ও (এন) হয়? (এন = 2) 2 নং সমস্যা সংজ্ঞা অংশ। একটি ধ্রুবক, সুতরাং এটি ও (কে * কিছু) এর একে যা ও (কিছু) এর সমান
xanatos

9
@ হ্যামস্টারজিন: আপনি কোন অনুষ্ঠানের কথা বলছেন? 100 মানটি আমার কাছে বেশ ধ্রুব বলে মনে হচ্ছে ..
duedl0r

19

তালিকাটি অকার্যকর রাখুন। কোনও নতুন নম্বর সন্নিবেশ করানো হবে কিনা তা নির্ধারণ করতে আরও বেশি সময় লাগবে, তবে সন্নিবেশটি ও (1) হবে।


7
আমি মনে করি এটি অন্য কিছু না হলে আপনি স্মার্ট-অ্যালেক পুরষ্কারটি পাবেন। * 8 ')
মার্ক বুথ

4
এমিলিও, আপনি প্রযুক্তিগতভাবে সঠিক - এবং অবশ্যই এটি সবচেয়ে ভাল ধরণের সঠিক…
গ্যারেথ

1
তবে আপনি আপনার 100 টি সংখ্যার মধ্যেও সর্বনিম্ন রাখতে পারেন, তবে আপনাকে ও (1) এ সন্নিবেশ করানো দরকার কিনা তাও আপনি ঠিক করতে পারেন। তারপরে আপনি কেবল কোনও সংখ্যা সন্নিবেশ করলেই আপনাকে নতুন সর্বনিম্ন সংখ্যাটি অনুসন্ধান করতে হবে। তবে এটি সন্নিবেশ করানোর সিদ্ধান্ত নেওয়ার চেয়ে বিরল ঘটে যা প্রতিটি নতুন সংখ্যার জন্য ঘটে।
আন্দ্রেই বাজনা II

12

এটা সহজ. ধ্রুবকের তালিকার আকার, সুতরাং তালিকার বাছাইয়ের সময়টি ধ্রুবক। ধ্রুবক সময়ে কার্যকর হওয়া একটি অপারেশনকে ও (1) বলা হয়। সুতরাং নির্দিষ্ট আকারের তালিকার জন্য তালিকাটি বাছাই করুন ও (1)।


9

আপনি একবার 100 নম্বর পাস করার পরে, পরবর্তী সংখ্যাটির জন্য আপনি যে সর্বাধিক ব্যয় করতে পারবেন তা হ'ল সংখ্যাটি সর্বোচ্চ 100 সংখ্যায় ( চেকটাইমকে লেবেল দেওয়া হয় ) এবং সেই সাথে সেট করে প্রবেশের জন্য নির্ধারিত ব্যয়টি যাচাই করার জন্য ব্যয় করতে হবে is সর্বনিম্ন এক (আসুন আমরা এন্টারটাইম বলি ) যা ধ্রুবক সময় (কমপক্ষে সীমিত সংখ্যার জন্য), বা ও (1)

Worst = CheckTime + EnterTime

এর পরে, যদি সংখ্যার বিতরণটি এলোমেলো হয়, তবে গড় ব্যয় আপনার আরও সংখ্যায় কমবে। উদাহরণস্বরূপ, আপনাকে সর্বাধিক সেটে 101 তম সংখ্যাটি প্রবেশের সুযোগটি 100/101, 1000 তম সংখ্যাটির সম্ভাবনা 1/10 এবং নবম সংখ্যাটির সম্ভাবনা 100 / এন হবে। সুতরাং, গড় ব্যয়ের জন্য আমাদের সমীকরণটি হবে:

Average = CheckTime + EnterTime / n

এইভাবে এন অসীমের কাছে যাওয়ার সাথে সাথে কেবলমাত্র চেকটাইমই গুরুত্বপূর্ণ:

Average = CheckTime

যদি সংখ্যাগুলি সীমাবদ্ধ থাকে তবে চেকটাইম স্থির থাকে এবং সুতরাং এটি ও (1) সময়।

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

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


তালিকাটি স্বেচ্ছাচারিতা ব্যতীত, যদি এটি ক্রমবর্ধমান সংখ্যার একটি তালিকা থাকে?
ড্যান_ ওয়াটারওয়ার্থ

@ উদ্যান_ ওয়াটারওয়ার্থ: যদি অসীম তালিকাটি অভ্যাসগত হয় এবং কেবল কখনও বাড়তে থাকে (যার প্রতিক্রিয়াগুলি 1 / be হবে!), তবে এটি CheckTime + EnterTimeপ্রতিটি সংখ্যার সবচেয়ে খারাপ পরিস্থিতি মানায় । সংখ্যাগুলি সীমাহীন থাকলে এটি কেবল তখনই বোঝা যায় এবং তাই CheckTimeএবং EnterTimeসংখ্যার আকার বৃদ্ধির কারণে উভয়ই কমপক্ষে লগারিদমিকভাবে বৃদ্ধি পাবে।
ব্রিগুই 37

1
সংখ্যাগুলি এলোমেলো নয়, রয়েছে নির্বিচারে। প্রতিকূলতার বিষয়ে কথা বলার কোনও মানে হয় না।
ড্যান_ওয়াটারওয়ার্থ

@ উদ্যান_ ওয়াটারওয়ার্থ: আপনি এখন দুবার বলেছেন যে সংখ্যাগুলি নির্বিচারে। আপনি কোথায় থেকে এই পাচ্ছেন? এছাড়াও, আমি বিশ্বাস করি যে আপনি এখনও এলোমেলো কেস দিয়ে শুরু করে নির্বিচারে সংখ্যায় পরিসংখ্যান প্রয়োগ করতে পারেন এবং সালিশ সম্পর্কে আরও জানার সাথে তাদের যথার্থতা উন্নত করতে পারেন। উদাহরণস্বরূপ, আপনি যদি সালিশকারী হন, এটির চেয়ে বেশি ক্রমবর্ধমান সংখ্যা বাছাই করার সম্ভাবনা বেশি দেখা যায়, বলুন, আমি
সালিশকারী

7

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


আপনার প্রয়োজনীয় উপাদানগুলিকে কেন সঞ্চয় করবেন? (মানগুলি যা খুব কম) এটি একটি কাস্টম অ্যালগরিদমের মতো আরও উপযুক্ত বলে মনে হয়। মানগুলি যখন সর্বনিম্ন মানেরগুলির চেয়ে বেশি না হয় তখন আপনি 'যোগ করতে পারবেন না' তা না বলে।
স্টিভেন জিউরিস

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

3
কিছুটা মিথ স্তরের নীচে কিছু ফেলে দেওয়ার জন্য একটি গাদা পরিবর্তন করা যেতে পারে (বাইনারি হ্যাপ এবং কে = 100 এর জন্য, মি 7 হবে, যেহেতু নোডের সংখ্যা = 2 ^ এম -1)। এটি এটিকে ধীর করে দেবে, তবে এটি ধ্রুবক সময় হিসাবে নিয়মিত করা হবে।
প্লিটর

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

1
@ চালক, আপনি বাইনারি হ্যাপগুলি আপনাকে দেয় না এমন কিছু গ্যারান্টি ধরে নিচ্ছেন। এটি বাইনারি গাছ হিসাবে দেখার জন্য এটি এমন ঘটনা হতে পারে যে বাম শাখায় প্রতিটি উপাদান ডান শাখার যে কোনও উপাদানের চেয়ে ছোট, তবে আপনি ধরে নিচ্ছেন যে ক্ষুদ্রতম উপাদানগুলি মূলের নিকটে রয়েছে।
পিটার টেলর

6

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

আমি ধরে নিয়েছি যে সাক্ষাত্কারকারীর প্রশ্নটি অর্থবহ ছিল, তিনি ও (1) হওয়ার কিছু কীভাবে তৈরি করবেন তা জিজ্ঞাসা করেননি যা ইতিমধ্যে এটি খুব স্পষ্টতই is

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

প্রথম যে বিষয়টি মনে আসে তা হ'ল সাজানো গণনা, যা হে (এম) স্থান ব্যবহারের মূল্যের জন্য শীর্ষ-এন-সমস্যার জন্য সংখ্যা অনুসারে ও (1) সময়ের জটিলতা কিনে দেবে, যেখানে এম আগত সংখ্যার দৈর্ঘ্য of । হ্যাঁ, এটা সম্ভব।


4

একটি ফাইবোনাচি হিপ দিয়ে প্রয়োগ করা ন্যূনতম-অগ্রাধিকারের সারিটি ব্যবহার করুন , যার ধ্রুবক সন্নিবেশের সময় রয়েছে:

1. Insert first 100 elements into PQ
2. loop forever
       n = getNextNumber();
       if n > PQ.findMin() then
           PQ.deleteMin()
           PQ.insert(n)

4
"অপারেশনগুলি O(log n)মোড়িত সময়ে ন্যূনতম কাজ মুছতে এবং মুছুন " , সুতরাং এটি এখনও আইটেমগুলির পরিমাণের পরিমাণ O(log k)কোথায় রাখবে তার ফলস্বরূপ k
স্টিভেন জিউরিস

1
এটি ইমিলিওর জবাবের চেয়ে আলাদা নয় যা মুছে ফেলা মিনিট ও (লগ এন) (উইকিপিডিয়া অনুসারে ) পরিচালনা করে "স্মার্ট-অ্যালেক পুরষ্কার" হিসাবে ডাব পেয়েছে ।
নিকোল

@ রেনেসিস এমিলিওর উত্তর ন্যূনতম সন্ধানের জন্য ও (কে) হবে, খনি হ'ল (লগ কে)
গাবে মোথার্ট

1
@ গ্যাবে ফেয়ার যথেষ্ট, আমি কেবল নীতি বলতে চাইছি। অন্য কথায়, আপনি যদি ধ্রুব হতে 100 না নেন, তবে এই উত্তরটিও বিপরীত সময় নয়।
নিকোল

@ রেনেসিস উত্তরটি থেকে আমি (ভুল) বিবৃতিটি সরিয়েছি।
গাবে মোথার্ট

2

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

এখানে কৌশলটি হ'ল যদিও তালিকাটি সন্নিবেশ করানোর জন্য ও (1) প্রয়োজনীয়তার কথা বলা হয়েছে, পুরো সংখ্যাটিতে অনুসন্ধানের সময়ের ক্রম সম্পর্কে প্রশ্নটি কিছু বলেনি, তবে এটি O (1) করা যেতে পারে যেমন. এরপরে সমাধানটি নিম্নরূপ:

  1. মানগুলির জন্য কী এবং যুক্ত লিঙ্ক তালিকার পয়েন্টারগুলির সংখ্যার সাথে একটি হ্যাশটেবলের ব্যবস্থা করুন। পয়েন্টারগুলির প্রতিটি জুটি লিঙ্কযুক্ত তালিকার ক্রমের শুরু এবং শেষ। এটি সাধারণত একটি উপাদান হবে তার পরের অংশে। লিঙ্কযুক্ত তালিকার প্রতিটি উপাদান পরবর্তী সর্বোচ্চ সংখ্যার সাথে উপাদানের পাশে যায়। লিঙ্কযুক্ত তালিকায় প্রয়োজনীয় সংখ্যার সাজানো ক্রম থাকে contains সর্বনিম্ন সংখ্যার একটি রেকর্ড রাখুন।

  2. এলোমেলো স্ট্রিম থেকে একটি নতুন সংখ্যা এক্স নিন।

  3. এটি কি সর্বশেষ রেকর্ড সর্বনিম্ন সংখ্যার চেয়ে বেশি? হ্যাঁ => পদক্ষেপ 4, ন => পদক্ষেপ 2

  4. সবে নেওয়া নম্বরটি দিয়ে হ্যাশ টেবিলটি হিট করুন। এন্ট্রি আছে কি? হ্যাঁ => পদক্ষেপ No নং => একটি নতুন নম্বর নিন x-1 এবং এই পদক্ষেপটি পুনরাবৃত্তি করুন (এটি একটি সরল নিম্নগামী রৈখিক অনুসন্ধান, কেবল এখানে আমার সহ্য করুন, এটি উন্নত করা যেতে পারে এবং আমি কীভাবে ব্যাখ্যা করব)

  5. হ্যাশ টেবিল থেকে সন্ধান প্রাপ্ত তালিকার সাথে, সংযুক্ত তালিকার উপাদানটির ঠিক পরে নতুন সংখ্যাটি সন্নিবেশ করুন (এবং হ্যাশ আপডেট করুন)

  6. রেকর্ড করা সর্বনিম্ন সংখ্যাটি নিন (এবং এটি হ্যাশ / তালিকা থেকে সরিয়ে দিন)।

  7. সবে নেওয়া নম্বরটি দিয়ে হ্যাশ টেবিলটি হিট করুন। এন্ট্রি আছে কি? হ্যাঁ => পদক্ষেপ 8. না => একটি নতুন নম্বর নিন l + 1 এবং এই পদক্ষেপটি পুনরাবৃত্তি করুন (এটি একটি সরল upর্ধ্বমুখী রৈখিক অনুসন্ধান)

  8. ধনাত্মক আঘাতের সাথে সংখ্যাটি নতুন সর্বনিম্ন সংখ্যাতে পরিণত হয়। পদক্ষেপ 2 এ যান

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

এখানে সন্নিবেশ O (1)। উল্লিখিত অনুসন্ধানগুলি হ'ল, আমি ও (সংখ্যার মধ্যে গড় পার্থক্য) এর মতো কিছু অনুমান করি। গড় পার্থক্য সংখ্যা জায়গার আকারের সাথে বৃদ্ধি পায়, তবে সংখ্যার তালিকার প্রয়োজনীয় দৈর্ঘ্যের সাথে হ্রাস পায়।

সুতরাং লিনিয়ার অনুসন্ধান কৌশলটি বেশ দুর্বল, যদি সংখ্যার স্থানটি বড় হয় (যেমন একটি 4 বাইট ইনট টাইপের জন্য, 0 থেকে 2 ^ 32-1) এবং এন = 100। এই পারফরম্যান্স ইস্যুটি ঘুরে দেখার জন্য আপনি হ্যাশ টেবিলের সমান্তরাল সেট রাখতে পারেন, যেখানে উপযুক্ত কীগুলি তৈরি করতে সংখ্যাগুলি উচ্চতর প্রশস্ততা (যেমন 1s, 10s, 100s, বাক্য) এর সাথে গোল হয়। এইভাবে আপনি প্রয়োজনীয় অনুসন্ধানগুলি আরও দ্রুত সম্পাদন করতে গিয়ারগুলি ধাপে উপরে উঠতে পারেন। পারফরম্যান্সটি তখন ও (লগ নম্বররেঞ্জ) হয়ে যায়, আমি মনে করি, যা ধ্রুবক, অর্থাৎ ও (1)।

এই পরিষ্কার করার জন্য, কল্পনা করুন যে আপনার হাতে আছে 197 নম্বর। আপনি '১৯০' দিয়ে 10 হ্যাশ টেবিলটি আঘাত করেছেন, এটি প্রায় নিকটে দশটি গোল হয়েছে। কিছু? না। সুতরাং আপনি 120 বলার আগ পর্যন্ত 10 এর নিচে চলে যান Then তারপরে আপনি 1 হ্যাশটেবলে 129 থেকে শুরু করতে পারেন, তারপরে আপনি কিছু আঘাত না করা পর্যন্ত 128, 127 দিয়ে চেষ্টা করতে পারেন। সংযুক্ত তালিকার মধ্যে যেখানে 197 নম্বরটি সন্নিবেশ করানোর জন্য আপনি খুঁজে পেয়েছেন it এটিকে প্রবেশ করানোর সময়, আপনাকে অবশ্যই 197 টি প্রবেশের সাথে 1s হ্যাশটেবল আপডেট করতে হবে, ১৯০ নম্বর সহ ১০ টি হ্যাশটেবল, ১০০ এর সাথে ১০০ ইত্যাদি, সবচেয়ে গুরুত্বপূর্ণ পদক্ষেপগুলি আপনি এখানে করতে হবে সংখ্যা পরিসীমা লগ 10 বার।

আমি বিশদগুলির কিছু ভুল পেয়েছি, তবে যেহেতু এটি প্রোগ্রামার এক্সচেঞ্জ, এবং প্রসঙ্গটি ছিল সাক্ষাত্কার I আমি আশা করব উপরের পরিস্থিতিটির জন্য দৃ .় প্রত্যয়যুক্ত উত্তর।

সম্পাদনা করুন আমি সমান্তরাল হ্যাশটেবল স্কিমটি ব্যাখ্যা করতে এখানে কিছু অতিরিক্ত বিশদ যুক্ত করেছি এবং এর অর্থ কীভাবে আমি বর্ণিত দরিদ্র রৈখিক অনুসন্ধানগুলি ও (1) অনুসন্ধানের সাথে প্রতিস্থাপন করা যেতে পারে। আমি আরও বুঝতে পেরেছি যে পরবর্তী সর্বনিম্ন সংখ্যাটি অনুসন্ধান করার দরকার নেই, কারণ আপনি হ্যাশটেবলটি সর্বনিম্ন সংখ্যার সাথে সন্ধান করে এবং পরবর্তী উপাদানটিতে অগ্রগতি করে সরাসরি এটিতে যেতে পারেন।


1
অনুসন্ধানটি সন্নিবেশ ফাংশনের অংশ হতে হবে - এগুলি স্বতন্ত্র ফাংশন নয়। যেহেতু আপনার অনুসন্ধান ও (এন), তাই আপনার সন্নিবেশ ফাংশনটিও ও (এন)।
কির্ক ব্রডহর্স্ট

না। আমি যে কৌশলটি বর্ণনা করেছি সেগুলি ব্যবহার করে, যেখানে আরও বেশি হ্যাশ টেবিল সংখ্যা দ্রুত স্থান অতিক্রম করতে ব্যবহৃত হয়, এটি হে (1)। আমার উত্তরটি আবার পড়ুন।
বেনেডিক্ট

1
@ বেনিডিক্ট, আপনার উত্তরটি বেশ স্পষ্টভাবে বলেছে যে এর ৪ and এবং steps ধাপে লিনিয়ার অনুসন্ধান রয়েছে Line লিনিয়ার অনুসন্ধানগুলি ও (১) নয়।
পিটার টেলর

হ্যাঁ, এটি হয় তবে আমি পরে এটি মোকাবিলা করি। দয়া করে বাকীটা পড়তে কি আপত্তি করবেন? প্রয়োজনে আমি আমার উত্তরটি এটিকে পরিস্কারভাবে পরিষ্কার করার জন্য সম্পাদনা করব।
বেনেডিক্ট

@ বেনিডিক্ট আপনি সঠিক - অনুসন্ধান ব্যতীত আপনার উত্তর হ'ল (1)। দুর্ভাগ্যক্রমে এই সমাধানটি অনুসন্ধান ছাড়া কাজ করবে না।
কર્ક ব্রডহর্স্ট

1

আমরা কি ধরে নিতে পারি যে সংখ্যাগুলি একটি নির্দিষ্ট ডেটা ধরণের, যেমন পূর্ণসংখ্যার? যদি তা হয় তবে যুক্ত প্রতিটি সংখ্যার একটি ট্যালি রাখুন keep এটি একটি ও (1) অপারেশন।

  1. যতগুলি সম্ভব সংখ্যা রয়েছে তত পরিমাণ উপাদান সহ একটি অ্যারে ঘোষণা করুন:
  2. প্রবাহিত হওয়ার সাথে সাথে প্রতিটি সংখ্যা পড়ুন।
  3. নম্বর ট্যালি। আপনার যদি কখনও এটির প্রয়োজন না হয় সেজন্য যদি এই সংখ্যাটি 100 বার দীর্ঘ করা হয়ে থাকে তবে এটিকে উপেক্ষা করুন। এটি সীমাহীন সংখ্যক সময়ের সাথে তাল মিলিয়ে ওভারফ্লোগুলি বাধা দেয়।
  4. পদক্ষেপ 2 থেকে পুনরাবৃত্তি করুন।

ভিবি.নেট কোড:

Const Capacity As Integer = 100

Dim Tally(Integer.MaxValue) As Integer ' Assume all elements = 0
Do
    Value = ReadValue()
    If Tally(Value) < Capacity Then Tally(Value) += 1
Loop

আপনি যখন তালিকাটি ফিরিয়ে দেন, আপনি নিজের পছন্দ মতো সময় নিতে পারেন। কেবলমাত্র তালিকাটির শেষে থেকে তাড়িত করুন এবং রেকর্ড করা সর্বোচ্চ 100 টি মানের একটি নতুন তালিকা তৈরি করুন। এটি একটি ও (এন) অপারেশন, তবে এটি অপ্রতিরোধ্য।

Dim List(Capacity) As Integer
Dim ListCount As Integer = 0
Dim Value As Integer = Tally.Length - 1
Dim ValueCount As Integer = 0
Do Until ListCount = List.Length OrElse Value < 0
    If Tally(Value) > ValueCount Then
        List(ListCount) = Value
        ValueCount += 1
        ListCount += 1
    Else
        Value -= 1
        ValueCount = 0
    End If
Loop
Return List

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


1

একশ নম্বর সহজেই একটি অ্যারে, 100 মাপের আকারে সংরক্ষণ করা হয় Any যে কোনও গাছ, তালিকা বা সেটটি ওভারকিল দিয়ে দেওয়া কাজটি হাতে রেখে দেওয়া হয় given

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

যেহেতু আপনি তালিকাটি শুরু থেকে বাছাই করে রেখেছেন, আপনার কোনও ধরণের অ্যালগরিদম চালানোর দরকার নেই। এটি ও (1)।


0

আপনি বাইনারি ম্যাক্স-হিপ ব্যবহার করতে পারেন। আপনাকে সর্বনিম্ন নোডের দিকে নির্দেশকের ট্র্যাক রাখতে হবে (যা অজানা / নাল হতে পারে)।

আপনি গাদা মধ্যে প্রথম 100 নম্বর সন্নিবেশ শুরু করুন। সর্বোচ্চটি শীর্ষে থাকবে। এটি সম্পন্ন হওয়ার পরে, আপনি সর্বদা সেখানে 100 নম্বর রাখবেন।

তারপরে আপনি যখন একটি নতুন নম্বর পাবেন:

if(minimumNode == null)
{
    minimumNode = findMinimumNode();
}
if(newNumber > minimumNode.Value)
{
    heap.Remove(minimumNode);
    minimumNode = null;
    heap.Insert(newNumber);
}

দুর্ভাগ্যক্রমে findMinimumNodeহ'ল ও (এন), এবং আপনি প্রতি সন্নিবেশে একবার ব্যয় করতে পারেন (তবে সন্নিবেশের সময় নয় :)। সর্বনিম্ন নোড অপসারণ এবং নতুন নোড সন্নিবেশ করা হয়, গড়ে, হে (1) কারণ তারা স্তূপের নীচের দিকে ঝুঁকবে।

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

অবশ্যই, যদি এন ধ্রুব থাকে, তবে আপনার সর্বদা ও (1) থাকে। :)

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