মূলত আমার মন্তব্য থেকে: এটি একাডেমিক উত্পাদনশীলতা মূল্যায়নের সর্বব্যাপী পরিমাণের সাথে ঘনিষ্ঠভাবে জড়িত, হিরশ সূচক, ইনডেক্সh হিসাবে বেশি পরিচিত । সংক্ষেপে এটি সংযুক্ত করা হয়েছে যে একটির প্রকাশনা সংখ্যাটি তাদের প্রত্যেকের কমপক্ষে h উদ্ধৃতি (সবচেয়ে বড় এইচ ) রয়েছে।hhh
আপনার সমস্যার ভিন্নতার একমাত্র উপায় হ'ল আপনি কেবলমাত্র কতগুলি প্রকাশনা এই মানদণ্ডকে মেটান তা নয় তবে তাদের উদ্ধৃতি গণনাগুলি কী তা সম্পর্কেও আপনি আগ্রহী হবেন , তবে এটি একটি তুচ্ছ পরিবর্তন। ডেটা ইতিমধ্যে সেখানে আছে, মূল অ্যালগরিদম কেবল এটি ফেলে দেয়।
সাধারণভাবে প্রয়োগ করা গণনা বরং সোজাসাপ্টা এবং কারোলিস জুডেলির উত্তরের সাথে একমত হয় ।
আপডেট: আপনার ডেটার আকার এবং চরিত্রের উপর নির্ভর করে এটি এমন পদ্ধতিগুলি অন্বেষণ করার উপযুক্ত হতে পারে যা একটি অবিচ্ছিন্ন বিন্দুর উপরে এবং নীচে ডেটা ফিল্টার করে অ্যারের আংশিকভাবে সাজান (কুইকোর্টটি মনে আসে)। তারপরে খুব অল্প বা অনেক বেশি পিভট সামঞ্জস্য করে এবং এটিতে থাকা সাবসেটটিতে পুনরায় করুন কিনা তার উপর নির্ভর করে। চেয়ে বেশি উপাদানগুলির মধ্যে আপনার কোনও অর্ডার দরকার নেই এবং অবশ্যই এর চেয়ে কমের মধ্যে নয়। সুতরাং উদাহরণস্বরূপ, একবার আপনি সমস্ত উপাদানগুলি h 1 এর চেয়ে বড় বা সমান খুঁজে পেয়েছেন এবং এর মধ্যে h 1 এরও কম রয়েছে , আপনাকে আবার সেই উপসেটটি স্পর্শ করার দরকার নেই, কেবল এটিতে যুক্ত করুন। এটি পুনরূদ্ধারকে অন্তর্নিহিত পুনরাবৃত্তিকে একটি পুচ্ছ পুনরাবৃত্তিতে রূপান্তর করে এবং এইভাবে একটি লুপ হিসাবে পুনরায় লেখা যেতে পারে।hh1h1
আমার হাস্কেল খানিকটা মরিচা তবে এটি আমার করা উচিত যা আমি উপরে বর্ণিত এবং কাজ করে বলে মনে হচ্ছে। আশা করি এটি কিছুটা ডিগ্রী বোঝা যাবে, আরও ব্যাখ্যা দেওয়ার জন্য আমি খুশি।
-- just a utility function
merge :: [a] -> [a] -> [a]
merge [] ys = ys
merge (x:xs) ys = x : merge xs ys
-- the actual implementation
topImpl :: [Int] -> [Int] -> [Int]
topImpl [] granted = granted
topImpl (x:xs) granted
| x == (1 + lGreater + lGranted) = x : merge greater granted
| x > (1 + lGreater + lGranted) = topImpl smaller (x : merge greater granted)
| otherwise = topImpl greater granted
where smaller = [y | y <- xs, y < x]
greater = [y | y <- xs, y >= x]
lGreater = length greater
lGranted = length granted
-- starting point is: top of whole array, granted is empty
top :: [Int] -> [Int]
top arr = topImpl arr []
ধারণাটি হ'ল আপনি granted
যা জানেন তা সংগ্রহ করার জন্য ফলাফলটি অবশ্যই অংশ নেবে এবং এটিকে আর সাজিয়ে রাখবে না। যদি greater
একসঙ্গে সঙ্গে x
ফিট করে, আমরা ভাগ্যবান, অন্যথায় আমরা একটি ছোট উপসেট দিয়ে চেষ্টা করতে হবে। (পিভট x
যে বৃহত্তম উপাদান এক গ্রহণ একের পর বিরুদ্ধে উল্লেখযোগ্য সুবিধা আমরা গড় আকার ব্লক এই কাজ যে কেবল যাই হোক না কেন sublist যে বর্তমানে বিবেচিত সে সম্পর্কে প্রথম আইটেম হতে ঘটেছে।) নোট এবং তাদের আরও বাছাই করার দরকার নেই।remaining/2
উদাহরণ:
আসুন আপনার সেট নিতে [1,3,4,1,3,6]
।
x = 1
, granted = []
, greater = [3,4,1,3,6]
। প্রথমদিকে, যখন পাইভট খুব ছোট (আসলে এত ছোট যে smaller
খালি) তখন আমরা একটি রোগতাত্ত্বিক কেসটিকে আঘাত করি । ভাগ্যক্রমে আমাদের আলগো সেই জন্য প্রস্তুত। এটি ত্যাগ x
করে আবার greater
একা চেষ্টা করে।
x = 3
, granted = []
, greater = [4,3,6]
। একসাথে, তারা 4 দৈর্ঘ্যের অ্যারে গঠন করে তবে আমাদের কেবল এটি নীচে থেকে 3 দ্বারা সীমাবদ্ধ থাকে যাতে এটি খুব বেশি। greater
একা পুনরাবৃত্তি ।
x = 4
, granted = []
, greater = [6]
। এটি 2 টি উপাদানের একটি অ্যারে দেয় each 4 প্রতিটি, সম্ভবত আমরা তাদের কিছু ব্যবহার করতে পারি। এটি রাখুন এবং পুনরাবৃত্তি করুন smaller = [3]
।
x = 3
, granted = [4,6]
, greater = []
। এটি একসাথে 3 টি উপাদানের অ্যারে দেয় - প্রতি 3, তাই আমাদের সমাধান রয়েছে [3,4,6]
এবং আমরা ফিরে আসতে পারি। (মনে রাখবেন যে ইনপুটটির ক্রম অনুসারে পারমিটেশন পৃথক হতে পারে, তবে সর্বদা সর্বোচ্চ সম্ভাব্য শর্তাদি থাকবে, কখনই [3,3,6]
বা [3,3,4]
আপনার উদাহরণের জন্য for)
(বি। ড। দ্রষ্টব্য যে পুনরাবৃত্তিটি কেবল একটি চক্রের সাথে পতিত হয়েছিল)) অনেকগুলি সংরক্ষিত তুলনার কারণে জটিলতা কোকসোর্টের চেয়ে কিছুটা ভাল:
n−1
O(logn)O(n)
nO(n2)
উপরের কোডে কয়েকটি অযথা তুলনা রয়েছে যেমন smaller
আমাদের প্রয়োজন কিনা তা গণনা করার মতো , সেগুলি সহজেই সরানো যেতে পারে। (আমি মনে করি অলস মূল্যায়ন যদিও এটি যত্ন নেবে।)