কিভাবে উপাদানের সর্বোচ্চ সেট এটি ধরনের প্রতিটি উপাদান যে একটি অ্যারের চেয়ে বড় বা cardinality সমান ?


14

আমার একটি অ্যালগরিদমিক সমস্যা আছে।

একটি অ্যারের (অথবা একটি সেট থাকে) প্রদত্ত এর নন-নেগেটিভ পূর্ণসংখ্যার। সর্বাধিক সেট খুঁজুন এর যেমন যে সব জন্য ,।TnSTaSa|S|

উদাহরণ স্বরূপ:

  1. যদি T = [1, 3, 4, 1, 3, 6], তবে S [3, 3, 6] বা [3, 4, 6] বা [4, 3, 6] হতে পারে।
  2. ইন T = [7, 5, 1, 1, 7, 4], তারপর S হল [7, 5, 7, 4]।

আমি এই পুনরাবৃত্ত ফাংশন চেষ্টা করেছি।

function(T):
    if minimum(T) >= length(T): 
        return T
    else: 
        return function(T\minimum(T))

কোন পুনরাবৃত্তি অ্যালগরিদম আছে? (আমি আমার পুনরাবৃত্তির অ্যালগরিদম চেক করিনি, যাতে এটিতে কিছু ত্রুটি থাকতে পারে))

উত্তর:


14

টি বাছাই করুন। এরপরে উপাদানগুলি নিন T[i] >= i+1

উদাহরণস্বরূপ sorted(T)=[6,4,3,3,1,1]। এর পরে, T[0] = 6 > 1, T[1] = 4 > 2, T[2] = 3 <= 3এবং অবশেষে, T[3] = 3 < 4তাই আমরা আছে S = [T[0], T[1], T[2]]


3
এটি অবশ্যই অন্য সমাধানটি মিস করে , তবে দেখা যায় যে ওপি সমস্ত সমাধানের চেয়ে কোনও সমাধান খুঁজছিল । {6,3,3}
রিক ডেকার

2
এটি সঠিক উপাদান সংখ্যা পায়। আমরা জানি যে আমাদের 3 টি উপাদান সহ সমাধান রয়েছে তবে 4 দিয়ে নয়; এই ক্ষেত্রে আমাদের 4 টি উপাদান রয়েছে ≥ 3, তাই আমরা জানি যে আমরা সমাধানের জন্য এর মধ্যে 3 টিও বেছে নিতে পারি।
gnasher729

3
আমি সঠিকতার একটি যুক্তি প্রশংসা করব।
রাফেল

আমি মনে করি আপনি সম্ভবত ও (এন) সময়ে ইন্ট্রোসलेक्टের বৈকল্পিকের সাহায্যে এটি করতে পারেন।
ব্যবহারকারী 2357112 মনিকা

8

মূলত আমার মন্তব্য থেকে: এটি একাডেমিক উত্পাদনশীলতা মূল্যায়নের সর্বব্যাপী পরিমাণের সাথে ঘনিষ্ঠভাবে জড়িত, হিরশ সূচক, ইনডেক্স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]

  1. x = 1, granted = [], greater = [3,4,1,3,6]। প্রথমদিকে, যখন পাইভট খুব ছোট (আসলে এত ছোট যে smallerখালি) তখন আমরা একটি রোগতাত্ত্বিক কেসটিকে আঘাত করি । ভাগ্যক্রমে আমাদের আলগো সেই জন্য প্রস্তুত। এটি ত্যাগ xকরে আবার greaterএকা চেষ্টা করে।

  2. x = 3, granted = [], greater = [4,3,6]। একসাথে, তারা 4 দৈর্ঘ্যের অ্যারে গঠন করে তবে আমাদের কেবল এটি নীচে থেকে 3 দ্বারা সীমাবদ্ধ থাকে যাতে এটি খুব বেশি। greaterএকা পুনরাবৃত্তি ।

  3. x = 4, granted = [], greater = [6]। এটি 2 টি উপাদানের একটি অ্যারে দেয় each 4 প্রতিটি, সম্ভবত আমরা তাদের কিছু ব্যবহার করতে পারি। এটি রাখুন এবং পুনরাবৃত্তি করুন smaller = [3]

  4. x = 3, granted = [4,6], greater = []। এটি একসাথে 3 টি উপাদানের অ্যারে দেয় - প্রতি 3, তাই আমাদের সমাধান রয়েছে [3,4,6]এবং আমরা ফিরে আসতে পারি। (মনে রাখবেন যে ইনপুটটির ক্রম অনুসারে পারমিটেশন পৃথক হতে পারে, তবে সর্বদা সর্বোচ্চ সম্ভাব্য শর্তাদি থাকবে, কখনই [3,3,6]বা [3,3,4]আপনার উদাহরণের জন্য for)

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

n1

O(logn)O(n)

nO(n2)

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


6

আপনার অ্যালগরিদমের সাথে কোনও ভুল নেই, এবং অবশ্যই বেশিরভাগ পুনরাবৃত্ত এলগরিদমগুলি লুপে রূপান্তর করা যায়, এখানে আপনার পুনরাবৃত্ত কোডের একটি লুপ সংস্করণ রয়েছে:

function(T):
    while minimum(T) <= lenght(T):
         remove minimum(T) from T
    loop

6
সমস্ত পুনরাবৃত্ত আলগোরিদিমগুলি লুপে রূপান্তর করা যায়। সর্বোপরি, একটি ট্যুরিং মেশিন পুনরাবৃত্তি সম্পর্কে কিছুই জানে না।
ডেভিড রিচার্বি

4

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


3

আংশিক হিপসোর্টটি করতে একটি মিনিট হিপ ব্যবহার করুন, যেহেতু আপনার পুরো অ্যারে বাছাই করার দরকার নেই।

যতক্ষণ না আপনি প্রদত্ত চৌম্বকটি অতিক্রম করবেন ততক্ষণ লোভের সাথে উপাদানগুলিকে লোপযুক্ত রাখুন।


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