উত্তর দেওয়ার জন্য অ্যালগরিদম / ডেটা স্ট্রাকচার "এই সেট উপাদানের সাহায্যে আমি কী রেসিপি তৈরি করতে পারি?"


11

সাধারণত, আসুন s ( U , Q ) = { V | ভিইউ এবং ভিকিউ } যেখানে ইউ , কিউ , এবং ভি সমস্ত সেট উপস্থাপন করে এবং ইউ আরও নির্দিষ্ট করে সেটগুলির একটি সেট উপস্থাপন করে। উদাহরণস্বরূপ অনুরোধে জন্য, ইউ সঙ্গে একটি পাকপ্রণালীর বিভিন্ন রেসিপি জন্য প্রয়োজন বোধ করা উপাদানগুলো (এর সেট) একটি সেট হতে পারে প্রশ্নঃ উপাদানগুলো সেট প্রতিনিধিত্বমূলক আমি ভী একটি রেসিপি আমি ঐ উপাদানের সঙ্গে বানাতে পারে উপস্থাপন করে। ক্যোয়ারী গুলি ( ইউ , প্রশ্ন) প্রশ্নের সাথে মিলে যায় "এই উপাদানগুলি দিয়ে আমি কীভাবে তৈরি করতে পারি?"

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

আমি সাহায্য করতে পারি না তবে ভাবতে পারি যে এই সমস্যাটি অবশ্যই ভালভাবে বুঝতে হবে তবে আমি এর জন্য কোনও নাম বা রেফারেন্স খুঁজে পাইনি able এটিকে কীভাবে দক্ষতার সাথে সমাধান করার কৌশল বা এমন জায়গা সম্পর্কে আমি আরও পড়তে পারি সে সম্পর্কে কি কেউ জানেন?

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

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

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


1
এসকিউএল ডাটাবেসের সাহায্যে সহজেই সমাধানযোগ্য হওয়া উচিত।
রবার্ট হার্ভে

1
আপনার অতিরিক্ত বিবরণের উপর ভিত্তি করে, এটি একটি অরবিটজ-স্কেল সমস্যার মতো শোনাচ্ছে। অরবিটজের অনুসন্ধান ইঞ্জিনটি একটি লিস্প ইঞ্জিন ব্যবহার করে যা আপনার নির্দিষ্ট ভ্রমণপথের জন্য উপযুক্ত হবে এমন ফ্লাইটগুলির একটি তালিকা পেতে এক বিলিয়ন বা ডেটা পয়েন্টের মধ্য দিয়ে যায়। এটি অ-কার্যকরী প্রয়োজন হ'ল এটি অবশ্যই 10 সেকেন্ড বা তারও কমের মধ্যে সমাধান ফিরিয়ে আনবে। এখানে paulgraham.com/carl.html দেখুন , যদিও তথ্যটি বেশ পুরানো note
রবার্ট হার্ভে

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

উত্তর:


4

আপনি যে সংখ্যা দিয়েছেন তার জন্য, এটি জোর করে চাপিয়ে দিন।

এখানে একটি জাভাস্ক্রিপ্ট প্রোগ্রাম রয়েছে যা ব্রুট এটি ডিবিতে 10 টি উপাদান, ডিবিতে 10 টি রেসিপি, প্রতিটি রেসিপিতে 2 টি উপাদান প্রয়োজন এবং আমার কাছে 5 টি উপাদান উপলব্ধ রয়েছে:

var i, j;
var numIngredients = 10;
var numRecipes = 10;
var numIngredientsPerRecipe = 2;
var numIngredientsInQuery = 5;

function containsAll(needles, haystack){ 
  var i, len;
  for(i = 0 , len = needles.length; i < len; i++){
      if(haystack.indexOf(needles[i]) == -1) {
          return false;
      }
  }
  return true;
}

// Set up a fake DB of recipes
var ingredients = [];
for (i = 0; i < numIngredients; i++) {
    ingredients.push(i);
}
console.log('Here are the ingredients:', ingredients);

var recipes = [];
for (i = 0; i < numRecipes; i++) {
    var neededIngredients = [];
    for (j = 0; j < numIngredientsPerRecipe; j++) {
        neededIngredients.push(Math.floor(Math.random() * numRecipes));
    }
    recipes.push({ recipeId: i, needed: neededIngredients});
}
console.log('Here are the recipes:', recipes);

// Set up a fake query
var ingredientsAvailable = [];
for (i = 0; i < numIngredientsInQuery; i++) {
    ingredientsAvailable.push(Math.floor(Math.random() * numRecipes));
}

console.log("Here's a query:", ingredientsAvailable);

//Time how long brute force takes
var start = Date.now();
var result = [];
for (i = 0; i < numRecipes; i++) {
    var candidateRecipe = recipes[i];
    if (containsAll(candidateRecipe.needed, ingredientsAvailable)) {
        result.push(candidateRecipe);
    }
}
var end = Date.now();
console.log('Found ' + result.length + ' recipes in ' + (end - start) + ' milliseconds.');
console.log(result);

এটি 0 মিলিসেকেন্ডে চালিত হয়। আমি এই ছোট সংখ্যাগুলি বেছে নিয়েছি যাতে আপনি এটি কয়েক বার নিজেকে চালাতে পারেন এবং নিজেকে বোঝাতে পারেন এটি আপনার যা চান তা করে এবং তুলনামূলকভাবে বাগগুলি থেকে মুক্ত।

এখন এটি পরিবর্তন করুন যাতে আমাদের ডিবিতে 1'000'000 উপাদান, ডিবিতে 1'000'000 রেসিপি, রেসিপি প্রতি 50 টি উপাদান এবং আমার কাছে 100 টি উপাদান উপলব্ধ থাকে। অর্থাত আপনার দেওয়া সবচেয়ে বড় ব্যবহারের ক্ষেত্রে মানগুলি সমান বা তার চেয়ে বড়।

এটি নোডেজের আওতায় 125 মিলি সেকেন্ডে চলে এবং এটি অনুকূলকরণের জন্য একেবারেই কোনও প্রচেষ্টা ছাড়াই অনর্থক বাস্তবায়নের সাথে।


1
ওপি'র প্রয়োজনীয়তাগুলি পরিবর্তন না হলে এই ধরণের পদ্ধতির না নেওয়ার কোনও কারণ নেই। চতুর ডেটা স্ট্রাকচার? না। যথেষ্ট দ্রুত? হ্যাঁ. বজায় রাখা যায় এবং বোঝা সহজ? সবচেয়ে স্পষ্টভাবে.
জে ট্রানা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.