1 বিলিয়ন সংখ্যার অ্যারের মধ্যে 100 টি বৃহত্তম সংখ্যা খুঁজতে একটি প্রোগ্রাম লিখুন


300

আমি সম্প্রতি একটি সাক্ষাত্কারে অংশ নিয়েছি যেখানে আমাকে জিজ্ঞাসা করা হয়েছিল "1 বিলিয়ন সংখ্যার অ্যারের মধ্যে 100 টি বৃহত্তম সংখ্যা খুঁজে বের করার জন্য একটি প্রোগ্রাম লিখুন।"

আমি কেবলমাত্র একটি দৃ force় বল সমাধান দিতে সক্ষম হয়েছি যা হে (এনলগন) সময় জটিলতায় অ্যারে বাছাই করে শেষ 100 নম্বর নিয়েছিল।

Arrays.sort(array);

সাক্ষাত্কারকারক আরও ভাল সময়ের জটিলতার সন্ধান করছিলেন, আমি বেশ কয়েকটি অন্যান্য সমাধান চেষ্টা করেছিলাম তবে তার উত্তর দিতে ব্যর্থ হয়েছি। আরও ভাল সময়ের জটিলতা সমাধান আছে?


70
সম্ভবত সমস্যাটি হ'ল এটি কোনও বাছাই করার প্রশ্ন ছিল না , বরং একটি সন্ধানকারী
জিওমাগাস

11
প্রযুক্তিগত নোট হিসাবে, বাছাই সমস্যা সমাধানের সেরা উপায় নাও হতে পারে, তবে আমি মনে করি না এটি নিষ্ঠুর শক্তি - এটি করার আরও অনেক খারাপ উপায় সম্পর্কে আমি ভাবতে পারি।
বার্নহার্ড বার্কার 15

88
আমি কেবল আরও বোকা ব্রুট ফোর্স পদ্ধতির কথা ভেবেছিলাম ... 1 বিলিয়ন উপাদান অ্যারের থেকে 100 টি উপাদানের সমস্ত সম্ভাব্য সংমিশ্রণ সন্ধান করুন এবং দেখুন যেগুলির মধ্যে কোনটির সংমিশ্রণের মধ্যে সবচেয়ে বড় যোগফল রয়েছে।
শশাঙ্ক

10
নোট করুন যে সমস্ত ডিটারমিনিস্টিক (এবং সঠিক) অ্যালগরিদমগুলি O(1)এই ক্ষেত্রে, কারণ কোনও মাত্রা বৃদ্ধি নেই। সাক্ষাত্কারকারীর জিজ্ঞাসা করা উচিত ছিল "এন >> এম এর সাথে এন এর অ্যারে থেকে এম বৃহত্তম উপাদানগুলি কীভাবে সন্ধান করবেন?"।
বাকুরিউ

উত্তর:


328

আপনি ১০০ টি বৃহত্তম সংখ্যার একটি অগ্রাধিকার সারি রাখতে পারেন, বিলিয়ন সংখ্যার মধ্য দিয়ে পুনরাবৃত্তি করতে পারেন, যখনই আপনি কাতারে থাকা সর্বাধিক সংখ্যার (সারির শিরোনাম) এর চেয়ে বড় সংখ্যার মুখোমুখি হন, সারিটির শিরোনামটি সরিয়ে নতুন নম্বর যুক্ত করুন কাতারে।

সম্পাদনা: যেমন দেব উল্লেখ করেছেন যে একটি অগ্রাধিকার সারিটি একটি গাদা দিয়ে প্রয়োগ করা হয়েছে, সারি সন্নিবেশের জটিলতা হ'লO(logN)

সবচেয়ে খারাপ ক্ষেত্রে আপনি যা ভাল চেয়ে ভালbillionlog2(100)billionlog2(billion)

সাধারণভাবে, আপনার যদি এন সংখ্যার সেট থেকে বৃহত্তম কে নম্বর প্রয়োজন হয় তবে জটিলতাটি O(NlogK)বরং তার চেয়ে কম O(NlogN), যখন এন এর সাথে তুলনা করা খুব কম হয় তখন এটি খুব তাৎপর্যপূর্ণ হতে পারে K

EDIT2:

এই অ্যালগরিদমের প্রত্যাশিত সময়টি বেশ আকর্ষণীয়, কারণ প্রতিটি পুনরাবৃত্তিতে একটি সন্নিবেশ ঘটতে পারে বা নাও পারে। কাতারে সন্নিবেশ করা হবে i-Kএমন প্রথম সংখ্যার সম্ভাবনা হ'ল একই বন্টন থেকে কমপক্ষে এলোমেলো ভেরিয়েবলের চেয়ে বড় এলোমেলো ভেরিয়েবলের সম্ভাবনা (প্রথম কে সংখ্যাগুলি স্বয়ংক্রিয়ভাবে কাতারে যুক্ত হবে)। এই সম্ভাবনাটি গণনা করতে আমরা অর্ডার পরিসংখ্যান ( লিঙ্কটি দেখুন ) ব্যবহার করতে পারি । উদাহরণস্বরূপ, ধরে নেওয়া যাক যে সংখ্যাগুলি এলোমেলোভাবে থেকে অভিন্নভাবে নির্বাচিত হয়েছিল {0, 1}, (iK) তম সংখ্যার (i নম্বরগুলির মধ্যে) এর প্রত্যাশিত মান (i-k)/iএবং এ মানের চেয়ে এলোমেলো পরিবর্তনশীল হওয়ার সম্ভাবনা রয়েছে 1-[(i-k)/i] = k/i

সুতরাং, সন্নিবেশের প্রত্যাশিত সংখ্যাটি হ'ল:

এখানে চিত্র বর্ণনা লিখুন

এবং প্রত্যাশিত চলমান সময়টি প্রকাশ করা যেতে পারে:

এখানে চিত্র বর্ণনা লিখুন

( kপ্রথম kউপাদানগুলির সাথে সারি তৈরির সময় , তারপরে n-kতুলনা এবং উপরে বর্ণিত হিসাবে সন্নিবেশের প্রত্যাশিত সংখ্যা, প্রতিটি গড়ে log(k)/2সময় নেয় )

মনে রাখবেন যে Nতুলনা করা যখন খুব বড় হয় K, এই প্রকাশটি nবরং অনেক বেশি কাছাকাছি হয় NlogK। এটি কিছুটা স্বজ্ঞাত, যেমন প্রশ্নের ক্ষেত্রে, 10000 পুনরাবৃত্তির পরেও (যা এক বিলিয়ন এর সাথে তুলনা করা খুব কম), একটি সংখ্যার কাতারে প্রবেশ করার সম্ভাবনা খুব কম small


6
এটি প্রতিটি সন্নিবেশের জন্য আসলে কেবল ও (100)
MrSmith42

8
@ রনটেলার আপনি কোনও লিঙ্কযুক্ত তালিকার দক্ষতার সাথে বাইনারি অনুসন্ধান করতে পারবেন না, এজন্য একটি অগ্রাধিকার সারিটি সাধারণত একটি গাদা দিয়ে প্রয়োগ করা হয়। বর্ণিত হিসাবে আপনার সন্নিবেশের সময়টি হ'ল (এন) ও (লগইন) নয়। স্কিজ আপনাকে দ্বিতীয় ধারণা না করা পর্যন্ত আপনার প্রথমবার এটি ছিল (অর্ডারযুক্ত সারি বা অগ্রাধিকারের সারি) had
দেব

17
@ থমাস জাংব্লুট বিলিয়নও একটি ধ্রুবক, তাই যদি এটি হয় তবে এটি ও (1): পি
রন টেলার

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

5
যেহেতু আপনার কাছে 1 জি আইটেম রয়েছে, তাই এলোমেলোভাবে 1000 টি উপাদানের নমুনা করুন এবং বৃহত্তম 100 টি বাছাই করুন That এটি হ্রাসকারী মামলাগুলি (সাজানো, বিপরীত সাজানো, বেশিরভাগ বাছাই করা) এড়ানো উচিত, যাতে প্রবেশের সংখ্যাটি যথেষ্ট পরিমাণে হ্রাস পায়।
চককট্রিল

136

যদি এটি একটি সাক্ষাত্কারে জিজ্ঞাসা করা হয়, আমি মনে করি সাক্ষাত্কারটি সম্ভবত আপনার অ্যালগোরিদমের জ্ঞান নয়, আপনার সমস্যা সমাধানের প্রক্রিয়াটি দেখতে চায়।

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

যাইহোক, প্রশ্নটিকে আরও সুনির্দিষ্ট এবং পরিষ্কার করে দেওয়া একটি সাক্ষাত্কারে আপনার পক্ষে ভাল।


26
খুব ভাল পয়েন্ট। এই সংখ্যাগুলির বন্টন সম্পর্কে অন্য কেউ জিজ্ঞাসা বা নির্দেশ করেনি - সমস্যাটিতে কীভাবে যোগাযোগ করা যায় তাতে এটি সমস্ত পার্থক্য করতে পারে।
নিলবি

13
আমি এই উত্তরটি প্রসারিত করার জন্য যথেষ্ট চাই। ন্যূনতম / সর্বাধিক মান পেতে একবারে সংখ্যাগুলি পড়ুন যাতে আপনি বিতরণটি ধরে নিতে পারেন। তারপরে, দুটি বিকল্পের মধ্যে একটি নিন। যদি পরিসরটি যথেষ্ট ছোট হয় তবে এমন একটি অ্যারে তৈরি করুন যেখানে সংখ্যাটি ঘটে যাওয়ার সাথে সাথে আপনি কেবল যাচাই করতে পারেন। যদি পরিসরটি খুব বড় হয় তবে উপরে আলোচিত বাছাই করা হিপ অ্যালগরিদম ব্যবহার করুন .... কেবল একটি চিন্তা thought
রিচার্ড_জি

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

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

যারা এই সমাধান সম্পর্কে ভাবেননি, তাদের জন্য আমি গণনা বাছাই en.wikedia.org/wiki/Counting_sort সম্পর্কে পড়ার পরামর্শ দেব । এটি আসলে একটি দুর্দান্ত সাধারণ সাক্ষাত্কারের প্রশ্ন: আপনি ও (এনলগন) এর চেয়ে আরও ভাল কোনও অ্যারে বাছাই করতে পারেন। এই প্রশ্নটি কেবল একটি প্রসারিত।
ম্যাক্সিমাম চুরামি

69

O (n) নেওয়ার সংখ্যার উপরে আপনি পুনরাবৃত্তি করতে পারেন

যখনই আপনি বর্তমান সর্বনিম্নের চেয়ে বেশি মান খুঁজে পান 100 এর আকারযুক্ত একটি বৃত্তাকার সারিতে নতুন মান যুক্ত করুন।

সেই বৃত্তাকার সারির মিনিটটি হল আপনার নতুন তুলনার মান। সেই কাতারে যুক্ত করা চালিয়ে যান। যদি পূর্ণ হয়, সারি থেকে সর্বনিম্ন সরান।


3
এটি কাজ করে না। উদাহরণস্বরূপ {1, 100, 2, 99 of এর শীর্ষ 2 সন্ধান করুন শীর্ষ 2 হিসাবে {100,1} দেবে
স্কিজেড

7
সাজানো সারিটি ধরে রাখতে আপনি প্রায় পেতে পারেন না। (যদি আপনি পরবর্তী ক্ষুদ্রতম উপাদানের জন্য প্রতিবার গর্তের
সারিটি

3
@ মিস্টারস্মিথ 42 আংশিক বাছাই, যেমন একটি গাদা, যথেষ্ট। রন টেলারের উত্তর দেখুন।
ক্রিস্টোফার ক্রিউটজিগ

1
হ্যাঁ, আমি নিঃশব্দে ধরে নিয়েছি যে একটি এক্সট্রাক্ট-মিনিট-সারিটি স্তূপ হিসাবে প্রয়োগ করা হয়েছে।
রেজেনশেইন

100 মাপের বৃত্তাকার কাতারে নূন্যতম হিপ ব্যবহারের পরিবর্তে, এটিতে সর্বনিম্ন সর্বনিম্ন শত নম্বর থাকবে number সারি করার ক্ষেত্রে ও (এন) এর তুলনায় এটি কেবল ও (লগ এন)
লাগবে

33

আমি বুঝতে পেরেছিলাম যে এটি 'অ্যালগরিদম' দিয়ে ট্যাগ করা হয়েছে তবে এটি অন্য কিছু বিকল্পও টস করবে, কারণ এটি সম্ভবত 'সাক্ষাত্কার' হিসাবে ট্যাগ হওয়া উচিত।

1 বিলিয়ন সংখ্যার উত্স কী? যদি এটি একটি ডাটাবেস হয় তবে 'মানচিত্রের সীমা 100 দ্বারা টেবিল ক্রম থেকে মান নির্বাচন করুন' কাজটি খুব সুন্দরভাবে করবে - দ্বন্দ্বের পার্থক্য থাকতে পারে।

এটি কি একসময়ের, বা এমন কিছু যা পুনরাবৃত্তি হবে? যদি পুনরাবৃত্তি হয় তবে কত ঘন ঘন? যদি এটি এক-অফ হয় এবং ডেটা কোনও ফাইলে থাকে তবে 'বিড়াল সিআরসিফিল | সাজানো (প্রয়োজনীয় হিসাবে অপশন) | শিরোনাম -100 'কম্পিউটারটি এই তুচ্ছ কাজটি পরিচালনা করার সময় আপনি যে দ্রুত ফলশ্রুতি দিয়ে কাজটি করতে চলেছেন তা দ্রুত করবে।

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

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

পরের সাক্ষাত্কারে ভাল ভাগ্য।


2
ব্যতিক্রমী উত্তর। অন্য প্রত্যেকে প্রশ্নের প্রযুক্তিগত দিকে মনোনিবেশ করেছে, যখন এই প্রতিক্রিয়াটি এর ব্যবসায়িক সামাজিক অংশটিকে মোকাবেলা করে।
ভবোকান

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

1
কেন আমরা বিলিয়ন উপাদানগুলির একটি গাদা তৈরি করতে পারি না এবং 100 টি বৃহত্তম উপাদান বের করতে পারি না। এই পথে ব্যয় = ও (বিলিয়ন) + 100 * ও (লগ (বিলিয়ন)) ??
মোহিত শাহ

17

এর জন্য আমার তাত্ক্ষণিক প্রতিক্রিয়া হ'ল একটি হিপ ব্যবহার করা হবে, তবে যে কোনও এক সময়ে সমস্ত ইনপুট মান হাতছাড়া না করেই কুইকসিলিট ব্যবহার করার উপায় রয়েছে।

200 মাপের একটি অ্যারে তৈরি করুন এবং এটি প্রথম 200 ইনপুট মানগুলি পূরণ করুন। কুইক সিলেক্ট চালান এবং কম 100 টি ফেলে দিন, আপনাকে 100 টি মুক্ত স্থান রেখে। পরবর্তী 100 ইনপুট মানগুলিতে পড়ুন এবং আবার কুইকসलेक्ट নির্বাচন করুন। 100 ব্যাচের পুরো ইনপুটটি চালানো পর্যন্ত চালিয়ে যান।

শেষে আপনার শীর্ষ 100 মান রয়েছে। এন মানগুলির জন্য আপনি মোটামুটি এন / 100 বার কুইকসलेक्ट নির্বাচন করেছেন। প্রতিটি কুইক সিলেক্টের জন্য প্রায় 200 গুণ কিছু ধ্রুবক ব্যয় হয়, সুতরাং মোট ব্যয় কিছু ধ্রুবক 2N গুণ। এটি আমার কাছে ইনপুট আকারে রৈখিক দেখায়, প্যারামিটার আকারটি নির্বিশেষে আমি এই ব্যাখ্যায় ১০০ হতে শক্ত হতে চাই।


10
আপনি একটি ছোট তবে সম্ভাব্য গুরুত্বপূর্ণ অপটিমাইজেশন যুক্ত করতে পারেন: আকার 200 অ্যারে বিভাজনে কুইকসিলিট চালানোর পরে শীর্ষ 100 উপাদানগুলির সর্বনিম্ন জানা যায়। তারপরে, পুরো ডেটা সেটটিতে পুনরাবৃত্তি করার সময়, বর্তমান মানটি সর্বনিম্নের চেয়ে বেশি হলে কেবলমাত্র 100 টি মান পূরণ করুন। সি ++ এ এই অ্যালগরিদমের একটি সাধারণ বাস্তবায়ন partial_sort200 মিলিয়ন 32-বিটের int(সমানভাবে বিতরণকৃত একটি এমটি 19937 এর মাধ্যমে তৈরি) সরাসরি ডেটা সেটে লাইবস্টিডি ++ এর চালিত সমতুল্য ।
dyp

1
ভাল ধারণা - সবচেয়ে খারাপ কেস বিশ্লেষণকে প্রভাবিত করে না তবে এটি করা ভাল দেখায়।
এমসিডোওয়েলা

@ এমসিডোওয়েলা এটি চেষ্টা করার মতো এবং আমি এটি করব, ধন্যবাদ!
ইউজারএক্স

8
এটি গুয়ারা ঠিক তাই Ordering.greatestOf(Iterable, int)করে। এটি একেবারে লিনিয়ার-টাইম এবং একক-পাস এবং এটি একটি দুর্দান্ত বুদ্ধিমান অ্যালগরিদম। এফডাব্লুআইডাব্লু, আমাদের কয়েকটি বাস্তব মানদণ্ড রয়েছে: এর ধ্রুবক কারণগুলি গড় ক্ষেত্রে প্রচলিত অগ্রাধিকারের কাতারের চেয়ে চুল ধীর হয় তবে এই বাস্তবায়নটি "সবচেয়ে খারাপ ক্ষেত্রে" ইনপুট (যেমন কঠোরভাবে আরোহণের ইনপুট) এর চেয়ে অনেক বেশি প্রতিরোধী।
লুই ওয়াসারম্যান

15

আপনি (অর্ডার অনুসারে) সূচক [বিলিয়ন-101] নাম্বারটি খুঁজে পেতে এবং তারপরে সংখ্যাগুলির পুনরাবৃত্তি করতে এবং সেই সংখ্যাটি থেকে যে সংখ্যাটি পেয়েছেন তা খুঁজে পেতে আপনি কুইক সিলেক্ট অ্যালগরিদম ব্যবহার করতে পারেন ।

array={...the billion numbers...} 
result[100];

pivot=QuickSelect(array,billion-101);//O(N)

for(i=0;i<billion;i++)//O(N)
   if(array[i]>=pivot)
      result.add(array[i]);

এই অ্যালগরিদম সময়টি হল: 2 এক্সও (এন) = ও (এন) (গড় ক্ষেত্রে পারফরম্যান্স)

টমাস জাংব্লুতের মত দ্বিতীয় বিকল্পটি হ'ল:

ব্যবহারের গাদা MAX টি গাদা হে নিতে হবে (এন) বিল্ডিং, তারপর শীর্ষ 100 সর্বোচ্চ নম্বর গাদা উপরের থাকবে, সব আপনি প্রয়োজন গাদা থেকে তাদের বহিস্কার করতে চায় (100 XO (লগ (এন))।

এই অ্যালগরিদম সময়টি: ও (এন) + 100 এক্সও (লগ (এন)) = ও (এন)


8
আপনি পুরো তালিকাটি তিনবার কাজ করছেন। 1 বায়ো। পূর্ণসংখ্যাগুলি মোটামুটি 4 জিবি হয়, আপনি যদি সেগুলিকে মেমরির সাথে ফিট করতে না পারেন তবে আপনি কী করবেন? এই ক্ষেত্রে চটপট নির্বাচন সবচেয়ে খারাপ পছন্দ। একবারে আইট্রেট করা এবং শীর্ষ 100 আইটেমগুলির একটি গাদা রাখা হ'ল ও (এন) এর সর্বোত্তম পারফরম্যান্স সমাধান আইএমএইচও (নোট করুন যে আপনি গাদাতে এন হিসাবে হ্যাপ সন্নিবেশনের ও (লগ এন) কেটে ফেলতে পারেন 100 = ধ্রুবক = খুব ক্ষুদ্র )।
থমাস জংবলুট

3
এটি এখনও থাকা সত্ত্বেও O(N)দুটি কুইকসিলিচ এবং অন্য লিনিয়ার স্ক্যান করা প্রয়োজনের চেয়ে ওভারহেড।
কেভিন 15

এটি পিএসইউডো কোড যা এখানে সমস্ত সমাধানগুলিতে আরও বেশি সময় লাগবে (ও (এনএলওজি (এন) বা 100 * ও (এন))
ওয়ান ম্যান ক্রু

1
100*O(N)(যদি এটি বৈধ বাক্য গঠন)) = O(100*N)= O(N)(অবশ্যই 100 টি পরিবর্তনশীল হতে পারে, যদি তাই হয় তবে এটি কঠোরভাবে সত্য নয়)। ওহ, এবং কুইকসিলিচেটে ও (এন ^ 2) (আউট ) এর সবচেয়ে খারাপ অবস্থা রয়েছে । এবং যদি এটি মেমরির সাথে খাপ খায় না, আপনি ডিস্ক থেকে ডেটা দুটি পুনরায় লোড করবেন যা একের চেয়ে অনেক খারাপ (এটিই বাধা)।
বার্নহার্ড বার্কার 15 ই

সমস্যাটি রয়েছে যে এটি চলমান সময় এবং সবচেয়ে খারাপ পরিস্থিতি নয় বলে প্রত্যাশা করা হয়েছে, তবে শালীন পিভট নির্বাচন কৌশলটি ব্যবহার করে (যেমন এলোমেলোভাবে 21 টি উপাদান বেছে নিন এবং সেই 21 টির মূলটিকে পাইভট হিসাবে বেছে নিন), তারপরে তুলনা করার সংখ্যাটি হতে পারে স্বতঃস্ফূর্তভাবে ছোট ধ্রুবক জন্য সর্বাধিক (2 + সি) এন হওয়ার উচ্চ সম্ভাবনার সাথে গ্যারান্টিযুক্ত গ।
ওয়ান ম্যান ক্রু

10

যদিও অন্যান্য কুইক সিলেকশন দ্রবণটিকে নিম্নচলাচল করা হয়েছে, তবুও এই সত্যটি রয়ে গেছে যে কুইকলেক নির্বাচনটি 100 মাপের সারি ব্যবহার করার চেয়ে দ্রুত সমাধানটি সন্ধান করতে পারে Quick তুলনার দিক থেকে কুইকসलेक्टটিতে 2n + o (n) এর প্রত্যাশিত চলমান সময় রয়েছে। খুব সহজভাবে বাস্তবায়ন হবে

array = input array of length n
r = Quickselect(array,n-100)
result = array of length 100
for(i = 1 to n)
  if(array[i]>r)
     add array[i] to result

এটি গড়ে 3n + o (n) তুলনা করবে) তদ্ব্যতীত, কুইকসलेक्टটি 100 টি ডান-সর্বাধিক অবস্থানগুলিতে অ্যারের বৃহত্তম 100 আইটেম ছেড়ে যাবে এই বিষয়টি ব্যবহার করে এটি আরও দক্ষ করা যায়। সুতরাং বাস্তবে, চলমান সময়টিকে 2n + o (n) এ উন্নত করা যেতে পারে।

সমস্যাটি রয়েছে যে এটি চলমান সময় এবং সবচেয়ে খারাপ পরিস্থিতি নয় বলে প্রত্যাশা করা হয়েছে, তবে শালীন পিভট নির্বাচন কৌশলটি ব্যবহার করে (যেমন এলোমেলোভাবে 21 টি উপাদান বেছে নিন এবং সেই 21 টির মূলটিকে পাইভট হিসাবে বেছে নিন), তারপরে তুলনা করার সংখ্যাটি হতে পারে স্বতঃস্ফূর্তভাবে ছোট ধ্রুবক জন্য সর্বাধিক (2 + সি) এন হওয়ার উচ্চ সম্ভাবনা সহ গ্যারান্টিযুক্ত

প্রকৃতপক্ষে, একটি অনুকূলিতকরণের নমুনা কৌশল ব্যবহার করে (উদাহরণস্বরূপ নমুনা স্কয়ার্ট (এন) উপাদানগুলি এলোমেলোভাবে বেছে নিন এবং 99 তম পার্সেন্টাইল চয়ন করুন), চলমান সময়টি নির্বিচারে ছোট সি এর জন্য (1 + সি) এন + ও (এন) পর্যন্ত নামানো যেতে পারে (ধরে নিলাম কে, নির্বাচিত উপাদানের সংখ্যা হ'ল o (n))।

অন্যদিকে, 100 মাপের একটি সারি ব্যবহার করে ও (লগ (100) এন) তুলনা প্রয়োজন হবে এবং 100 এর লগ বেস 2 প্রায় 6.6 এর সমান।

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

মন্তব্যে, এটি উল্লেখ করা হয়েছিল যে সারি সমাধান প্রত্যাশিত সময়ে এন + কে লগ এন এলোমেলো ইনপুটটিতে চলবে on অবশ্যই, প্রশ্নটি এলোমেলোভাবে বর্ণিত না হলে এলোমেলো ইনপুট অনুমানটি কখনই বৈধ হয় না। অ্যারেটিকে এলোমেলোভাবে ক্রম সরিয়ে ফেলার জন্য কিউ সমাধানটি তৈরি করা যেতে পারে, তবে এটি কোনও এলোমেলো নম্বর জেনারেটরের সাথে এন কলগুলির অতিরিক্ত ব্যয় বজায় রাখার পাশাপাশি পুরো ইনপুট অ্যারেকে অনুমতি দেবে বা অন্যথায় দৈর্ঘ্যের এন এর একটি নতুন অ্যারে বরাদ্দ করবে this র্যান্ডম সূচকগুলি।

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


4
আপনার শেষ অনুচ্ছেদটি মূল পয়েন্ট: এক বিলিয়ন সংখ্যার সাথে, সমস্ত ডেটা মেমরিতে রাখা বা চারপাশের উপাদানগুলিকে অদলবদল করা সম্ভব নয়। (কমপক্ষে সমস্যাটি আমি কীভাবে ব্যাখ্যা করব, এটি একটি সাক্ষাত্কারের প্রশ্ন ছিল))
টেড হপ

14
যে কোনও অ্যালগরিদমিক প্রশ্নে ডেটা পড়া যদি একটি সমস্যা হয় তবে তা অবশ্যই প্রশ্নের মধ্যে উল্লেখ করতে হবে। প্রশ্নটিতে ডিস্কে একটি অ্যারে দেওয়া "নয়" একটি অ্যারে দেওয়া হয়েছে যা মেমরির সাথে খাপ খায় না এবং ভন নিউম্যান মডেল অনুসারে ম্যানিপুলেট করা যায় না যা আলগোরিদমের বিশ্লেষণের মান। আজকাল আপনি 8gigs র্যাম সহ একটি ল্যাপটপ পেতে পারেন। আমি নিশ্চিত নই যে স্মৃতিতে একটি বিলিয়ন সংখ্যা রাখার ধারণাটি আসে না কোথা থেকে আসে। এই মুহূর্তে আমার ওয়ার্কস্টেশনটিতে আমার বেশ কয়েক বিলিয়ন সংখ্যা রয়েছে।
mrip

কুইকলেক্টের এফওয়াইআই সবচেয়ে খারাপ ক্ষেত্রে রানটাইম হ'ল ও (এন ^ 2) (দেখুন এন.ইউইকিপিডিয়া.org / উইকি / কিউসিলেক্ট ) এবং এটি ইনপুট অ্যারেতে উপাদানগুলির ক্রমও পরিবর্তন করে। খুব বড় ধ্রুবক (এন । উইকিপিডিয়া . org / উইকি / মিডিয়ান_ওফমিডিয়ানস ) সহ একটি খারাপ ক্ষেত্রে ও (এন) সমাধান হওয়া সম্ভব ।
pts

কুইক-সিলেকের সবচেয়ে খারাপ পরিস্থিতিটি ঘটনাক্রমে অসম্ভাব্য, যার অর্থ এটি ব্যবহারিক উদ্দেশ্যে এটি অপ্রাসঙ্গিক। কুইক নির্বাচন নির্বাচন করা সহজ, যাতে উচ্চ সম্ভাবনার সাথে তুলনা সংখ্যা নির্বিচারে ছোট গ এর জন্য (2 + সি) এন + ও (এন) হয় is
mrip

"সত্য এখনও রয়ে গেছে যে কুইকসलेक्टটি 100 মাপের একটি সারি ব্যবহার করার চেয়ে দ্রুত সমাধানটি সন্ধান করবে" - না। হিপ সলিউশনটি কুইকলেক্টের জন্য 2 এন গড় এবং মেডিয়ানদের মেডিয়ার 2.95 এর তুলনায় প্রায় এন + ব্লগ (এন) তুলনা করে। প্রদত্ত কে এর পক্ষে এটি স্পষ্টতই দ্রুত
নীল জি

5

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


3
উফ আমার নিজের চেয়ে বেশি বিস্তারিত উত্তর দেখতে পায় নি।
স্যামুয়েল থারস্টন

প্রথম 500 বা তার বেশি সংখ্যার সংখ্যা নিন এবং তালিকাটি পূরণের পরে কেবল বাছাই করতে থামুন (এবং কম 400 নামিয়ে দিন)। (এবং এটি বলার অপেক্ষা রাখে না যে আপনি তখনই তালিকায় যুক্ত করুন তবে নতুন সংখ্যাটি নির্বাচিত ১০০ এর মধ্যে সর্বনিম্ন থাকে))
হট লিকস

4

দুটি বিকল্প:

(1) গাদা (অগ্রাধিকারের কিউ)

100 এর আকারের সাথে একটি মিনিট-হিপ বজায় রাখুন ar অ্যারেটি অতিক্রম করুন। একসময় উপাদানটি স্তূপের প্রথম উপাদানের চেয়ে ছোট হয়ে গেলে এটি প্রতিস্থাপন করুন।

InSERT ELEMENT INTO HEAP: O(log100)
compare the first element: O(1)
There are n elements in the array, so the total would be O(nlog100), which is O(n)

(2) মানচিত্র হ্রাস মডেল।

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

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


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

@ সিলভিউ বুর্কিয়া অনেক ধন্যবাদ Thanks আমি মানচিত্রেও মান করি। :)
ক্রিস সু

যদিও 100 টির আকার এই উদাহরণে স্থির থাকে, আপনার সত্যিকার অর্থে এটি আলাদা ভেরিয়েবল হিসাবে সাধারণকরণ করা উচিত। ট। 100 হিসাবে 1 বিলিয়ন হিসাবে ধ্রুবক, সুতরাং আপনি সংখ্যার বড় সংখ্যার আকারকে এন এর আকারের ভেরিয়েবল কেন দিচ্ছেন, এবং সংখ্যার ছোট সংখ্যার জন্য নয়? সত্যিই আপনার জটিলতা O (nlogk) হওয়া উচিত যা ও (এন) নয়।
টম হিয়ার্ড

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

1
@ টমহার্ড ঠিক আছে। O (nlogk) কেবলমাত্র একটি কারণ রয়েছে যা ফলাফলগুলিকে প্রভাবিত করবে। এর অর্থ, এন যদি আরও বড় এবং বড় হয়, তবে "ফলাফলের স্তর" রৈখিকভাবে বৃদ্ধি পাবে। অথবা আমরা বলতে পারি, এমনকি ট্রিলিয়ন সংখ্যা দেওয়া হলেও আমি এখনও 100 টি বড় সংখ্যা পেতে পারি। তবে, আপনি বলতে পারবেন না: ক্রমবর্ধমান এন দিয়ে, কে বাড়ছে যাতে কে ফলাফলকে প্রভাবিত করবে। এজন্য আমি ও (নলগক) ব্যবহার করি তবে ও (নলগন) না
ক্রিস সু

4

একটি খুব সহজ সমাধান অ্যারে মাধ্যমে 100 বার পুনরাবৃত্তি হবে। যা হয় O(n)

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


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

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

ও (এন) এন এর সমাধানের একটি উজ্জ্বল উদাহরণ যা ও (এন লগ এন) এর চেয়ে অনেক ধীর। লগ 2 (1 বিলিয়ন) কেবল 30 ...
gnasher729

@ gnasher729 O (n লগ এন) এ ধ্রুবকটি কতটা লুকানো থাকে?
অলৌকিক 1773

1

@ আয়রন টেলার এর উত্তরে অনুপ্রাণিত হয়ে আপনি যা চান তা করতে এখানে একটি খালি সি প্রোগ্রাম রয়েছে।

#include <stdlib.h>
#include <stdio.h>

#define TOTAL_NUMBERS 1000000000
#define N_TOP_NUMBERS 100

int 
compare_function(const void *first, const void *second)
{
    int a = *((int *) first);
    int b = *((int *) second);
    if (a > b){
        return 1;
    }
    if (a < b){
        return -1;
    }
    return 0;
}

int 
main(int argc, char ** argv)
{
    if(argc != 2){
        printf("please supply a path to a binary file containing 1000000000"
               "integers of this machine's wordlength and endianness\n");
        exit(1);
    }
    FILE * f = fopen(argv[1], "r");
    if(!f){
        exit(1);
    }
    int top100[N_TOP_NUMBERS] = {0};
    int sorts = 0;
    for (int i = 0; i < TOTAL_NUMBERS; i++){
        int number;
        int ok;
        ok = fread(&number, sizeof(int), 1, f);
        if(!ok){
            printf("not enough numbers!\n");
            break;
        }
        if(number > top100[0]){
            sorts++;
            top100[0] = number;
            qsort(top100, N_TOP_NUMBERS, sizeof(int), compare_function);
        }

    }
    printf("%d sorts made\n"
    "the top 100 integers in %s are:\n",
    sorts, argv[1] );
    for (int i = 0; i < N_TOP_NUMBERS; i++){
        printf("%d\n", top100[i]);
    }
    fclose(f);
    exit(0);
}

আমার মেশিনে (একটি দ্রুত এসএসডি সহ কোর i3) এটি 25 সেকেন্ড এবং 1724 ধরণের লাগে। আমি dd if=/dev/urandom/ count=1000000000 bs=1এই রানের সাথে একটি বাইনারি ফাইল তৈরি করেছি ।

স্পষ্টতই, ডিস্ক থেকে একবারে 4 বাইট পড়ার পারফরম্যান্সের সমস্যা রয়েছে তবে এটি উদাহরণস্বরূপ। প্লাস সাইডে খুব কম স্মৃতি দরকার।


1

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

10 ^ 9 এলিমেন্ট অ্যারেটি স্ক্যান করা হলে আমি ছোট 100 এলিমেন্ট অ্যারে বাফারে সন্নিবেশনের সংখ্যাটি অনুমান করতে চাই। প্রোগ্রামটি এই বড় অ্যারের প্রথম 1000 উপাদানগুলি স্ক্যান করে এবং বাফারে সর্বাধিক 1000 উপাদান সন্নিবেশ করতে হয়। বাফারে স্ক্যান করা 1000 উপাদানগুলির 100 টি উপাদান রয়েছে যা স্ক্যান হওয়া উপাদানগুলির 0.1 হয়। সুতরাং আমরা ধরে নিই যে বড় অ্যারে থেকে একটি মান বর্তমান বাফারের সর্বনিম্ন ন্যূনতম চেয়ে বড় যা এই জাতীয় উপাদানটি বাফারে sertedোকাতে হবে। এখন প্রোগ্রামটি বড় অ্যারে থেকে পরবর্তী 10 ^ 4 উপাদান স্ক্যান করে। কারণ প্রতিবার কোনও নতুন উপাদান isোকানোর সময় সর্বনিম্ন বাফারটি বাড়বে। আমরা অনুমান করেছি যে আমাদের বর্তমান সর্বনিম্নের চেয়ে বড় উপাদানের অনুপাত প্রায় 0.1 এবং তাই সন্নিবেশ করার জন্য 0.1 * 10 ^ 4 = 1000 উপাদান রয়েছে। আসলে বাফারে elementsোকানো উপাদানগুলির প্রত্যাশিত সংখ্যা আরও কম হবে। এই 10 ^ 4 উপাদানগুলির স্ক্যানের পরে বাফারে সংখ্যার ভগ্নাংশটি এখনও পর্যন্ত স্ক্যান হওয়া উপাদানগুলির প্রায় 0.01 হবে। সুতরাং পরবর্তী 10 ^ 5 নম্বরগুলি স্ক্যান করার সময় আমরা ধরে নিই যে বাফারে 0.01 * 10 ^ 5 = 1000 এর বেশি নয়। এই যুক্তি অব্যাহত রেখে আমরা 1000 + 10 ^ 4 + 10 ^ 5 + ... + 10 ^ 9 ~ 10 ^ 9 বড় অ্যারের উপাদানগুলি স্ক্যান করার পরে প্রায় 7000 মান সন্নিবেশ করিয়েছি। সুতরাং এলোমেলো আকারের 10 ^ 9 টি উপাদান সহ একটি অ্যারে স্ক্যান করার সময় আমরা বাফারে 10 ^ 4 (= 7000 টি বৃত্তাকার) সন্নিবেশের বেশি আশা করি না। বাফারে প্রতিটি সন্নিবেশের পরে নতুন সর্বনিম্ন সন্ধান করতে হবে। বাফার যদি একটি সাধারণ অ্যারে হয় তবে আমাদের নতুন সর্বনিম্ন সন্ধানের জন্য 100 টি তুলনা প্রয়োজন। বাফার যদি অন্য কোনও ডেটা স্ট্রাকচার (হিপের মতো) হয় তবে আমাদের সর্বনিম্ন সন্ধানের জন্য কমপক্ষে 1 টি তুলনা প্রয়োজন। বড় অ্যারের উপাদানগুলির তুলনা করতে আমাদের 10 ^ 9 তুলনা প্রয়োজন। সুতরাং সব মিলিয়ে আমাদের প্রায় 10 ^ 9 + 100 * 10 ^ 4 = 1.001 * 10 ^ 9 তুলনা প্রয়োজন যখন কোনও বাফার হিসাবে অ্যারে ব্যবহার করার সময় এবং অন্য ধরণের ডেটা স্ট্রাকচার ব্যবহার করার সময় কমপক্ষে 1.000 * 10 ^ 9 তুলনা করা (হিপের মতো) । সুতরাং গাদা ব্যবহার করা যদি কেবল তুলনা সংখ্যার দ্বারা নির্ধারিত হয় তবে 0.1% এর লাভ অর্জন করে। কিন্তু একটি 100 উপাদান মৌলগুলিতে একটি উপাদান সন্নিবেশ করা এবং 100 উপাদান অ্যারেতে কোনও উপাদান প্রতিস্থাপন এবং এর নতুন সর্বনিম্ন সন্ধানের মধ্যে মৃত্যুদন্ড কার্যকর করার সময়টির মধ্যে পার্থক্য কী? অন্য ধরণের ডেটা স্ট্রাকচার ব্যবহার করার সময় 000 * 10 ^ 9 টির তুলনা করুন (একটি স্তূপের মতো)। সুতরাং গাদা ব্যবহার করা যদি কেবল তুলনা সংখ্যার দ্বারা নির্ধারিত হয় তবে 0.1% এর লাভ অর্জন করে। কিন্তু একটি 100 উপাদান মৌলগুলিতে একটি উপাদান সন্নিবেশ করা এবং 100 উপাদান অ্যারেতে কোনও উপাদান প্রতিস্থাপন এবং এর নতুন সর্বনিম্ন সন্ধানের মধ্যে মৃত্যুদন্ড কার্যকর করার সময়টির মধ্যে পার্থক্য কী? অন্য ধরণের ডেটা স্ট্রাকচার ব্যবহার করার সময় 000 * 10 ^ 9 টির তুলনা করুন (একটি স্তূপের মতো)। সুতরাং গাদা ব্যবহার করা যদি কেবল তুলনা সংখ্যার দ্বারা নির্ধারিত হয় তবে 0.1% এর লাভ অর্জন করে। কিন্তু একটি 100 উপাদান মৌলগুলিতে একটি উপাদান সন্নিবেশ করা এবং 100 উপাদান অ্যারেতে কোনও উপাদান প্রতিস্থাপন এবং এর নতুন সর্বনিম্ন সন্ধানের মধ্যে মৃত্যুদন্ড কার্যকর করার সময়টির মধ্যে পার্থক্য কী?

  • তাত্ত্বিক স্তরে: একটি গাদা সন্নিবেশ করার জন্য কয়টি তুলনা প্রয়োজন। আমি জানি এটি ও (লগ (এন)) তবে ধ্রুবক ফ্যাক্টরটি কত বড়? আমি

  • মেশিন পর্যায়ে: একটি গাদা সন্নিবেশ কার্যকর করার সময় এবং একটি অ্যারেতে রৈখিক অনুসন্ধানের সময় ক্যাশেিং এবং শাখার পূর্বাভাসের প্রভাব কী।

  • বাস্তবায়নের স্তরে: একটি লাইব্রেরি বা সংকলক দ্বারা সরবরাহ করা হিপ ডেটা স্ট্রাকচারে কী অতিরিক্ত ব্যয় লুকানো আছে?

আমি মনে করি যে এগুলি এমন কয়েকটি প্রশ্নের উত্তর যা আমাদের আগে একটি 100 এলিমেন্ট হিপ বা 100 উপাদান অ্যারের পারফরম্যান্সের মধ্যে প্রকৃত পার্থক্যটি অনুমান করার চেষ্টা করতে পারে। সুতরাং একটি পরীক্ষা করা এবং আসল কর্মক্ষমতা পরিমাপ করা বুদ্ধিমানের কাজ হবে।


1
এটি একটি গাদা কি করে।
নিল জি

@ নীল জি: কি "যে"?
चमत्कार 173

1
স্তূপের শীর্ষটি হ'ল ন্যূনতম উপাদান এবং নতুন উপাদানগুলি একটি তুলনা দিয়ে প্রত্যাখ্যান করা হয়।
নীল জি

1
আপনি কী বলছেন তা আমি বুঝতে পেরেছি, তবে এ্যাসিম্পটোটিক সংখ্যার তুলনায় তুলনামূলক তুলনায় আপনি যদি নিরঙ্কুশ সংখ্যার তুলনায় যান তবে অ্যারে এখনও অনেক ধীর হয় কারণ "নতুন উপাদান সন্নিবেশ করানো, পুরাতন সর্বনিম্ন বাতিল এবং নতুন সর্বনিম্ন সন্ধানের" সময় প্রায় 7. এর চেয়ে 100 এর চেয়ে কম
নিল জি

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

1
 Although in this question we should search for top 100 numbers, I will 
 generalize things and write x. Still, I will treat x as constant value.

এন থেকে অ্যালগোরিদম বৃহত্তম x উপাদানসমূহ:

আমি রিটার্ন ভ্যালু LIST বলব । এটি এক্স উপাদানগুলির একটি সেট (আমার মতে এটি লিঙ্কযুক্ত তালিকার উচিত)

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

তাহলে, সবচেয়ে খারাপ পরিস্থিতি কী?

x লগ (এক্স) + (এনএক্স) (লগ (এক্স) +1) = এনলগ (এক্স) + এন - এক্স

সুতরাং সবচেয়ে খারাপ ক্ষেত্রে ও (এন) সময়। +1 হ'ল চেক করা হয় যে তালিকাটি তালিকার সবচেয়ে ছোটটির চেয়ে বেশি কিনা। গড় মামলার প্রত্যাশিত সময়টি সেই এন উপাদানগুলির গাণিতিক বিতরণের উপর নির্ভর করবে।

সম্ভাব্য উন্নতি

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

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

এক্স লগ (এক্স) + (এনএক্স) লগ (এক্স) = এনলগ (এক্স)

অপারেশন।

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


1

এই প্রশ্নের উত্তর দেওয়া হবে এন লগ (100) জটিলতায় (এন লগ এন এর পরিবর্তে) সি ++ কোডের এক লাইন দিয়ে।

 std::vector<int> myvector = ...; // Define your 1 billion numbers. 
                                 // Assumed integer just for concreteness 
 std::partial_sort (myvector.begin(), myvector.begin()+100, myvector.end());

চূড়ান্ত উত্তরটি একটি ভেক্টর হবে যেখানে প্রথম 100 উপাদানগুলি আপনার 100 টি সর্বাধিক সংখ্যক অ্যারে হিসাবে গ্যারান্টিযুক্ত রয়েছে যখন বাকী উপাদানগুলি বিন্যস্ত থাকে

এই ধরণের সমস্যার জন্য সি ++ এসটিএল (স্ট্যান্ডার্ড লাইব্রেরি) বেশ সহজ।

দ্রষ্টব্য: আমি বলছি না যে এটি সর্বোত্তম সমাধান, তবে এটি আপনার সাক্ষাত্কারটি সংরক্ষণ করতে পারে।


1

সহজ সমাধানটি একটি অগ্রাধিকারের সারিটি ব্যবহার করা হবে, কাতারে প্রথম 100 নম্বর যুক্ত করা এবং সারিতে থাকা সর্বাধিক সংখ্যার সন্ধান করা, তারপরে অন্যান্য বিলিয়ন সংখ্যার মাধ্যমে পুনরাবৃত্তি করা এবং প্রতিবারের মতো আমরা একটি সংখ্যার চেয়ে বড় সংখ্যার চেয়ে বড় অগ্রাধিকারের কাতারে, আমরা ক্ষুদ্রতম সংখ্যাটি সরিয়ে ফেলি, নতুন সংখ্যা যুক্ত করি এবং আবার সারিতে থাকা ক্ষুদ্রতম সংখ্যার সন্ধান করি।

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

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


1

এক বিলিয়ন সংখ্যার মধ্যে শীর্ষস্থানীয় ১০০ সন্ধান করা 100 টি উপাদানগুলির ন্যূনতম হিপ ব্যবহার করে ভাল করা হয় ।

প্রথম 100 টি সংখ্যার সাথে প্রথম মিনি-হ্যাপের মুখোমুখি। মিনিট-হিপ প্রথম 100 টির সংখ্যার মধ্যে সবচেয়ে ছোটটিকে মূল (শীর্ষে) সঞ্চয় করবে।

আপনি যখন বাকী সংখ্যাটি বরাবর যান তখন কেবল তাদের মূলের সাথে তুলনা করুন (100 এর মধ্যে সবচেয়ে ছোট)।

যদি নতুন সংখ্যক মুখোমুখি হয় তবে মিনিট-হ্যাপের মূলের চেয়ে বড়টি সেই সংখ্যার সাথে মূলটিকে প্রতিস্থাপন করুন অন্যথায় এটিকে উপেক্ষা করুন।

মিনি-হিপে নতুন নম্বর সন্নিবেশের অংশ হিসাবে গাদাটির মধ্যে ক্ষুদ্রতম সংখ্যা শীর্ষে (মূল) আসবে।

একবার আমরা সমস্ত সংখ্যার মধ্য দিয়ে গেলে আমাদের ন্যূনতম গাদাতে বৃহত্তম 100 নম্বর থাকবে numbers


0

কেউ আগ্রহী হলে পাইথনে আমি একটি সহজ সমাধান লিখেছি। এটি bisectমডিউল এবং একটি অস্থায়ী রিটার্নের তালিকা ব্যবহার করে যা এটি বাছাই করে। এটি একটি অগ্রাধিকার সারি বাস্তবায়নের অনুরূপ।

import bisect

def kLargest(A, k):
    '''returns list of k largest integers in A'''
    ret = []
    for i, a in enumerate(A):
        # For first k elements, simply construct sorted temp list
        # It is treated similarly to a priority queue
        if i < k:
            bisect.insort(ret, a) # properly inserts a into sorted list ret
        # Iterate over rest of array
        # Replace and update return array when more optimal element is found
        else:
            if a > ret[0]:
                del ret[0] # pop min element off queue
                bisect.insort(ret, a) # properly inserts a into sorted list ret
    return ret

100,000,000 উপাদান এবং সবচেয়ে খারাপ ক্ষেত্রে ইনপুট যা ব্যবহার করা হয় তা অনুসারে বাছাই করা তালিকা:

>>> from so import kLargest
>>> kLargest(range(100000000), 100)
[99999900, 99999901, 99999902, 99999903, 99999904, 99999905, 99999906, 99999907,
 99999908, 99999909, 99999910, 99999911, 99999912, 99999913, 99999914, 99999915,
 99999916, 99999917, 99999918, 99999919, 99999920, 99999921, 99999922, 99999923,
 99999924, 99999925, 99999926, 99999927, 99999928, 99999929, 99999930, 99999931,
 99999932, 99999933, 99999934, 99999935, 99999936, 99999937, 99999938, 99999939,
 99999940, 99999941, 99999942, 99999943, 99999944, 99999945, 99999946, 99999947,
 99999948, 99999949, 99999950, 99999951, 99999952, 99999953, 99999954, 99999955,
 99999956, 99999957, 99999958, 99999959, 99999960, 99999961, 99999962, 99999963,
 99999964, 99999965, 99999966, 99999967, 99999968, 99999969, 99999970, 99999971,
 99999972, 99999973, 99999974, 99999975, 99999976, 99999977, 99999978, 99999979,
 99999980, 99999981, 99999982, 99999983, 99999984, 99999985, 99999986, 99999987,
 99999988, 99999989, 99999990, 99999991, 99999992, 99999993, 99999994, 99999995,
 99999996, 99999997, 99999998, 99999999]

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


0

আমি প্রচুর ও (এন) আলোচনা দেখতে পাচ্ছি, তাই আমি কেবল চিন্তার অনুশীলনের জন্য আলাদা কিছু প্রস্তাব করছি।

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

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

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


0
Time ~ O(100 * N)
Space ~ O(100 + N)
  1. 100 খালি স্লটের একটি খালি তালিকা তৈরি করুন

  2. ইনপুট-তালিকার প্রতিটি সংখ্যার জন্য:

    • সংখ্যাটি যদি প্রথমটির চেয়ে ছোট হয় তবে এড়িয়ে যান

    • অন্যথায় এই নম্বরটি দিয়ে এটি প্রতিস্থাপন করুন

    • তারপরে, সংলগ্ন অদলবদলের মাধ্যমে নম্বরটি চাপুন; যতক্ষণ না এটি পরেরটির চেয়ে ছোট

  3. তালিকাটি ফিরিয়ে দিন


দ্রষ্টব্য: যদি log(input-list.size) + c < 100, তবে সর্বোত্তম উপায়টি ইনপুট-তালিকাটিকে বাছাই করে প্রথমে 100 টি আইটেম বিভক্ত করুন split


0

আপনার জটিলতা হ'ল (এন)

প্রথমে ১০০ ইন্টের অ্যারে তৈরি করুন এই অ্যারের প্রথম উপাদানটিকে এন মানগুলির প্রথম উপাদান হিসাবে প্রাথমিককরণ করুন, বর্তমান উপাদানটির সূচকে অন্য ভেরিয়েবলের সাহায্যে রাখুন, এটিকে কারেন্টবিগ কল করুন

এন মান যদিও Iterate

if N[i] > M[CurrentBig] {

M[CurrentBig]=N[i]; ( overwrite the current value with the newly found larger number)

CurrentBig++;      ( go to the next position in the M array)

CurrentBig %= 100; ( modulo arithmetic saves you from using lists/hashes etc.)

M[CurrentBig]=N[i];    ( pick up the current value again to use it for the next Iteration of the N array)

} 

হয়ে গেলে, বর্তমানের 100 বার মডিউল 100 :-) থেকে এম অ্যারে মুদ্রণ করুন শিক্ষার্থীর জন্য: কোডটি শেষ হওয়ার আগে কোডের শেষ লাইনটি বৈধ ডেটা ট্রাম্প না করে তা নিশ্চিত করুন


0

অন্য একটি (এন) অ্যালগরিদম -

অ্যালগরিদম নির্মূলের মাধ্যমে বৃহত্তম 100 খুঁজে পায়

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

বড় বুলিয়ান অপারেশন সমান্তরালভাবে জিপিইউতে করা যেতে পারে


0

আমি খুঁজে বের করবো যে বিলিয়নের সংখ্যাগুলিকে একটি অ্যারেতে রেখে তাকে গুলি করার সময় কে পেয়েছিল? সরকারের পক্ষে কাজ করতে হবে। কমপক্ষে যদি আপনার একটি লিঙ্কযুক্ত তালিকা থাকে তবে আপনি জায়গা তৈরিতে অর্ধ বিলিয়ন না সরানোতে মাঝখানে একটি সংখ্যা সন্নিবেশ করতে পারেন। আরও ভাল একটি Btree একটি বাইনারি অনুসন্ধানের জন্য অনুমতি দেয়। প্রতিটি তুলনা আপনার মোট অর্ধেক অপসারণ করে। একটি হ্যাশ অ্যালগরিদম আপনাকে একটি চেকারবোর্ডের মতো ডেটা স্ট্রাকচারটি বসানোর অনুমতি দেয় তবে স্পার্স ডেটার জন্য এত ভাল নয়। যেহেতু এটি আপনার সেরা বাজি হ'ল 100 ইন্টিজারের দ্রষ্টব্য অ্যারে রাখা এবং আপনার সলিউশন অ্যারেতে সর্বনিম্ন সংখ্যার সন্ধান করা যাতে আপনি মূল অ্যারেতে কোনও উচ্চতর সংখ্যাটি নিয়ে আসেন তখন আপনি এটিকে প্রতিস্থাপন করতে পারেন। আপনাকে মূল অ্যারেতে প্রতিটি উপাদান দেখতে হবে এটি ধরে নিয়ে যে এটি শুরু করার জন্য সাজানো হয়নি।


0

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


1
এই পদ্ধতির এই প্রশ্নের সবচেয়ে সর্বাধিক এবং দ্বিতীয়-সবচেয়ে উত্তরের উত্তরগুলির সাথে প্রায় একই is
বার্নহার্ড বার্কার 16 ই

0

পৃথক তালিকা পরিচালনা করা অতিরিক্ত কাজ এবং প্রতিবার আপনি অন্য প্রতিস্থাপনের সময় আপনাকে পুরো তালিকার চারপাশে জিনিসগুলি সরিয়ে নিতে হবে। কেবল এটি কিউসোর্ট করুন এবং শীর্ষ 100 নিন take


-1 কুইকোর্টটি হ'ল ও (এন লগ এন) যা ওপি ঠিক ঠিক তাই করেছে এবং উন্নতি করতে বলেছে। আপনাকে পৃথক তালিকা পরিচালনা করতে হবে না, কেবলমাত্র 100 সংখ্যার একটি তালিকা। আপনার পরামর্শটিতে মূল তালিকাটি পরিবর্তন করা বা এটি অনুলিপি করার অপ্রয়োজনীয় পার্শ্ব প্রতিক্রিয়াও রয়েছে। 4GiB বা স্মৃতি তাই চলে গেছে।

0
  1. 100' তম উপাদান ও (এন) পেতে নবম-উপাদানটি ব্যবহার করুন
  2. দ্বিতীয় বারটি ইট্রেট করুন তবে কেবল একবার এবং প্রতিটি নির্দিষ্ট উপাদানটি যা এই নির্দিষ্ট উপাদানের চেয়ে বড় তার আউটপুট দেয়।

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


0

এটি গুগল বা অন্য কোনও শিল্প জায়ান্টদের একটি প্রশ্ন the নীচের কোডটি আপনার সাক্ষাত্কারকারীর দ্বারা প্রত্যাশিত সঠিক উত্তর। সময় ব্যয় এবং স্থান ব্যয় ইনপুট অ্যারে সর্বাধিক সংখ্যার উপর নির্ভর করে 32 32-বিট ইন্ট অ্যারে ইনপুট জন্য, সর্বাধিক স্থানের ব্যয় 4 * 125 এম বাইট, সময় ব্যয় 5 * বিলিয়ন।

public class TopNumber {
    public static void main(String[] args) {
        final int input[] = {2389,8922,3382,6982,5231,8934
                            ,4322,7922,6892,5224,4829,3829
                            ,6892,6872,4682,6723,8923,3492};
        //One int(4 bytes) hold 32 = 2^5 value,
        //About 4 * 125M Bytes
        //int sort[] = new int[1 << (32 - 5)];
        //Allocate small array for local test
        int sort[] = new int[1000];
        //Set all bit to 0
        for(int index = 0; index < sort.length; index++){
            sort[index] = 0;
        }
        for(int number : input){
            sort[number >>> 5] |= (1 << (number % 32));
        }
        int topNum = 0;
        outer:
        for(int index = sort.length - 1; index >= 0; index--){
            if(0 != sort[index]){
                for(int bit = 31; bit >= 0; bit--){
                    if(0 != (sort[index] & (1 << bit))){
                        System.out.println((index << 5) + bit);
                        topNum++;
                        if(topNum >= 3){
                            break outer;
                        }
                    }
                }
            }
        }
    }
}

0

আমি আমার নিজস্ব কোডটি করেছি, নিশ্চিত নয় যে এটি "সাক্ষাত্কারকারীর" দ্বারা এটি কী দেখছে if

private static final int MAX=100;
 PriorityQueue<Integer> queue = new PriorityQueue<>(MAX);
        queue.add(array[0]);
        for (int i=1;i<array.length;i++)
        {

            if(queue.peek()<array[i])
            {
                if(queue.size() >=MAX)
                {
                    queue.poll();
                }
                queue.add(array[i]);

            }

        }

0

সম্ভাব্য উন্নতি।

যদি ফাইলটিতে 1 বিলিয়ন সংখ্যা থাকে তবে এটি পড়া সত্যিই দীর্ঘ হতে পারে ...

এই কাজের উন্নতি করতে আপনি করতে পারেন:

  • ফাইলটিকে এন অংশে বিভক্ত করুন, এন থ্রেড তৈরি করুন, এন থ্রেডগুলি ফাইলের তাদের অংশের 100 টি শীর্ষ সংখ্যার জন্য সন্ধান করুন (অগ্রাধিকারের সারিটি ব্যবহার করে) এবং অবশেষে সমস্ত থ্রেড আউটপুটের 100 বৃহত্তম সংখ্যা পাবেন।
  • হ্যাডুপের মতো সমাধান সহ এ জাতীয় কোনও কাজ করতে একটি ক্লাস্টার ব্যবহার করুন। এখানে আপনি ফাইলটিকে আরও বিভক্ত করতে পারেন এবং 1 বিলিয়ন (বা 10 ^ 12) সংখ্যার ফাইলের জন্য আউটপুট দ্রুততর করতে পারেন।

0

প্রথমে 1000 টি উপাদান নিন এবং তাদের একটি সর্বোচ্চ গাদাতে যুক্ত করুন। এখন প্রথম সর্বোচ্চ 100 টি উপাদান বের করে এটিকে কোথাও সঞ্চয় করুন। এখন ফাইলটি থেকে পরবর্তী 900 টি উপাদান বেছে নিন এবং সর্বশেষ 100 টি সর্বোচ্চ উপাদানের সাথে সেগুলি স্তূপে যুক্ত করুন।

গাদা থেকে 100 টি উপাদান বাছাই এবং ফাইলটি থেকে 900 টি উপাদান যুক্ত করার এই প্রক্রিয়াটি পুনরাবৃত্তি করুন।

100 টি উপাদানের চূড়ান্ত বাছাই আমাদের বিলিয়ন সংখ্যা থেকে সর্বোচ্চ 100 উপাদান দেবে।


-1

সমস্যা: এন আইটেমগুলির বড় আকারের উপাদানগুলি সন্ধান করুন যেখানে এন >>> মি

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

তারপরে অ্যারের শেষ এন উপাদানগুলি মুদ্রণ করুন।

এর জন্য কোনও বাহ্যিক ডেটা স্ট্রাকচারের প্রয়োজন নেই এবং এটি একটি অ্যালগরিদম ব্যবহার করে যা সবাই জানে।

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

আমি বলছি না এটির উন্নতি করা যায় না, তবে এটি এখন পর্যন্ত সহজ সমাধান।


1
বাহ্যিক ডেটা স্ট্রাকচার নেই? বাছাই করতে বিলিয়ন সংখ্যা অ্যারে সম্পর্কে কি? এই আকারের একটি অ্যারে ভরাট করার জন্য এবং সঞ্চয় করার জন্য উভয় জায়গাতেই একটি বিশাল ওভারহেড। যদি সমস্ত "বড়" নম্বর অ্যারের ভুল প্রান্তে থাকে? এগুলিকে "বুদবুদ" করার জন্য আপনাকে 100 বিলিয়ন অদলবদলের ক্রমের প্রয়োজন হবে - অন্য বড় ওভারহেড ... অবশেষে, এম এন = 100 বিলিয়ন বনাম এম লগ 2 (এন) = .6..6৪ বিলিয়ন যা দ্বিগুণের মাত্রার প্রায় দুটি আদেশ। এটি আবার চিন্তা করুন। বৃহত্তম সংখ্যার একটি ডেটা কাঠামো বজায় রেখে একটি পাস স্ক্যান উল্লেখযোগ্যভাবে এই পদ্ধতির সম্পাদন করতে চলেছে।
নিলবি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.