দ্রুত ট্যাগ অনুসন্ধানের জন্য অ্যালগরিদম


16

সমস্যাটি নিম্নরূপ।

  • সাধারণ সত্ত্বা ইয়ের একটি সেট রয়েছে, প্রতিটি টিতে ট্যাগ সংযুক্ত একটি সেট রয়েছে। প্রতিটি সত্তা একটি স্বতন্ত্র ট্যাগ থাকতে পারে। সংস্থার মোট সংখ্যা 100 মিলিয়ন এর কাছাকাছি, এবং ট্যাগগুলির মোট সংখ্যা প্রায় 5000।

সুতরাং প্রাথমিক তথ্যটি এরকম কিছু:

E1 - T1, T2, T3, ... Tn
E2 - T1, T5, T100, ... Tk
..
Ez - T10, T12, ... Tl

এই প্রাথমিক তথ্যটি খুব কমই আপডেট হয়।

  • আমার অ্যাপ্লিকেশনটি এই জাতীয় ট্যাগগুলিতে লজিক্যাল এক্সপ্রেশন তৈরি করে:

    টি 1 এবং টি 2 এবং টি 3 | (T5 ও &! T6)

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

আমি এখন যা পেয়েছি তা হ'ল একটি সাধারণ ইন-মেমরি টেবিল লুক, যা আমাকে একক থ্রেডে 5-10 সেকেন্ডের কার্যকর করার সময় দেয়।

আমি কৌতূহলী, এই জিনিসগুলি হ্যান্ডেল করার কোনও কার্যকর উপায় আছে? আপনি কোন পদ্ধতির সুপারিশ করবেন? এর জন্য কি কিছু সাধারণ অ্যালগরিদম বা ডেটা স্ট্রাকচার রয়েছে?

হালনাগাদ

অনুরোধ হিসাবে কিছুটা স্পষ্টতা।

  1. Tবস্তুগুলি আসলে তুলনামূলকভাবে সংক্ষিপ্ত স্ট্রিং থাকে। তবে এটি আসলে গুরুত্বপূর্ণ নয় - আমরা সর্বদা কিছু আইডি নির্ধারণ করতে এবং পূর্ণসংখ্যার উপর কাজ করতে পারি।
  2. আমরা অবশ্যই তাদের বাছাই করতে পারি।

1
হয় T1জন্য একই অবজেক্ট রেফারেন্স E1, E2, ইত্যাদি?
16:54

ট্যাগগুলি কীভাবে তুলনাযোগ্য? ট্যাগগুলি বাছাই করা যায় তাই T2 < T3সবসময় সত্য?
সংঘবদ্ধ

ট্যাগ বাইনারি হয়? অর্থাৎ T1হয় trueবা falseদেওয়া জন্য E, এবং ইনপুট উপর ভিত্তি করে পরিবর্তনশীল না? (অর্থাত্ Model = "V5") বা T1একটি পরিবর্তনশীল ভাব মত হয় Model = <input>?
ববসন

উত্তর:


4

আমি এটি বর্গক্ষেত্রে রেফারেন্সিং সত্তা এবং স্ব-যোগদানের মাধ্যমে রেফারেন্সিং বিভাগের EntityCategoryমধ্যে একটি লিঙ্ক টেবিলযুক্ত করবো :eidcid

    select count(ec1.eid)
    from EntityCategory ec1 
    left join EntityCategory ec2 on ec1.eid=ec2.eid 
    left join EntityCategory ec3 on ec1.eid=ec3.eid 
    ...
    where 
      ec1.cid={categoryId1} and 
      ec2.cid={categoryId2} and
      ec3.cid={categoryId3} ...

1
+1, এটি ক্লাসিক ডিবি অঞ্চল। অন্য উত্তরে ম্যানুয়ালি কোডিং কীভাবে করা যায় তার যুক্তিসঙ্গত ধারণা থাকতে পারে তবে এটি একটি শেষ অবলম্বন হওয়া উচিত।
এমসাল্টাররা

আমি এটিকে সমাধান করার কৌশল হিসাবেও স্কয়ারকে বেছে নেব। বেশিরভাগ ডাটাবেসগুলি এই অ্যালগোরিদমগুলির জন্য বেশ অনুকূল করা হয়েছে :)
উইঙ্কব্র্যাস

3

এই উত্তরটি লেখার পরে, আমার সম্ভবত প্রশ্নটি "খুব বিস্তৃত" হিসাবে পতাকাঙ্কিত করা উচিত - আমরা বিভিন্ন কৌশল সম্পর্কে বয়সের জন্য কথা বলতে পারি, শেষ পর্যন্ত আপনার ডেটা দিয়ে একটি মানদণ্ড চালাতে হবে।

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

আমরা এখন ও (n · লগ টি · পি) ক্রিয়াকলাপে সমস্ত সত্তার মাধ্যমে ফিল্টার করতে পারি , যেখানে p হ'ল সিদ্ধান্ত গাছের গড় পথ দৈর্ঘ্য। এই সিদ্ধান্ত গাছটি যাতে অর্ডার করা যায় যাতে কোনও সিদ্ধান্তে দ্রুত পৌঁছানো যায়। পরিসংখ্যান সংক্রান্ত ডেটা ব্যতীত, কেবলমাত্র সাধারণ স্বেচ্ছাকর্ষণটিই কার্যকর করা সম্ভব।

সত্তা সন্ধান করা হয় ক্রম আসলে গুরুত্বপূর্ণ নয়। অন্যদিকে তা বাছাই করতে এটা যেমন সূচকের এ সত্ত্বা যে সুবিধাজনক হতে পারে 0জন্য iসমস্ত একটি নির্দিষ্ট ট্যাগ আছে, বাকিরা না। এই নির্দিষ্ট ট্যাগটি অনুসন্ধান করার সময় এটি এন হ্রাস করে (সিদ্ধান্ত গাছে, এটি প্রথম পরীক্ষা হওয়া উচিত)। এই একাধিক মাত্রা প্রসারিত করা যেতে পারে, কিন্তু এই জটিল জিনিস এবং সময় লাগে হে (2 ) সঙ্গে মেমরি মাত্রা। একাধিক স্তরের সাথে, সর্বাধিক লাভের সাথে ট্যাগগুলি প্রথমে সিদ্ধান্ত নেওয়া উচিত, যেখানে লাভটি এমন সংস্থাগুলির সংখ্যা যেগুলি তাদের ত্যাগ করার সম্ভাবনার চেয়ে বহুবার তাকাতে হবে না। লাভটি 50:50 সম্ভাবনার জন্য সর্বাধিক হয়ে যায় বা যখন 50% সত্তাগুলির কাছে এই নির্দিষ্ট ট্যাগ থাকে। অ্যাক্সেস প্যাটার্নগুলি জানা না থাকলেও এটি আপনাকে অনুকূল করতে দেয়।

আপনি প্রতিটি সেট দ্বারা সত্তাকে সারণি তৈরি করতে পারে এমন সেটগুলিও তৈরি করতে পারেন - এর জন্য T1পরের জন্য সমস্ত সত্তার সাথে একটি সেট T2। একটি স্পষ্ট (স্থান এবং সময়) অপ্টিমাইজেশান হ'ল যখন কোনও সেটটিতে সমস্ত উপাদানগুলির অর্ধেকেরও বেশি থাকে এবং এই ট্যাগ নেই এমন উপাদানগুলিকে সংরক্ষণ করতে - এইভাবে, সমস্ত ট্যাগের জন্য সূচকগুলি বিল্ডিংয়ের চেয়ে কম ½ · n · tস্থান গ্রহণ করবে (সহ) টি মোট ট্যাগ)। নোট করুন পরিপূরক সেটগুলি সংরক্ষণ অন্যান্য অপ্টিমাইজেশানকে আরও কঠিন করে তুলতে পারে। আবার, আমি সেটগুলির জন্য (সাজানো) অ্যারে করতাম।

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

যদি এখন আমাদের সূচক সেট থাকে (এবং ট্যাগগুলিতে এইভাবে পরিসংখ্যান থাকে) তবে আমরা আমাদের পূর্বাভাসগুলি অনুকূল করতে পারি যাতে অসম্ভব বৈশিষ্ট্যগুলি প্রথম পরীক্ষা করা হয় (ব্যর্থ-দ্রুত কৌশল)। এর অর্থ হ'ল যদি T1সাধারণ হয় এবং T2বিরল হয়, তবে T1 & T2সমস্ত T2সূচক সেট এন্ট্রিগুলির মাধ্যমে পুনরাবৃত্তি করে এবং প্রতিটি উপাদানটির পরীক্ষার মাধ্যমে প্রিডিকেটটি মূল্যায়ন করা উচিত T1

যদি আমরা সূচক সেটগুলি প্রয়োগ করতে বাছাই করা অ্যারেগুলি ব্যবহার করি তবে বহু মূল্যায়ন পদক্ষেপগুলি মার্জিং ক্রিয়াকলাপ হিসাবে প্রয়োগ করা যেতে পারে। T1 & T2এর অর্থ হ'ল আমরা এগুলি T1এবং T2তালিকাগুলি গ্রহণ করি , বৃহত ইনপুটগুলির আকারের জন্য একটি লক্ষ্য অ্যারে বরাদ্দ করি এবং উভয় ইনপুট ফাঁকা না হওয়া পর্যন্ত নিম্নলিখিত অ্যালগরিদম সম্পাদন করি: যদি T1[0] < T2[0], তবে T1++(মাথা বাদ দিন)। তাহলে T1[0] > T2[0]তারপর T2++। উভয় মাথা সমান, তাহলে লক্ষ্য অ্যারে উপর যে সংখ্যা অনুলিপি করুন, এবং তিনটি পয়েন্টার (বাড়ায় T1, T2, লক্ষ্য)। যদি ভবিষ্যদ্বাণীটি হয় T1 | T2, তবে কোনও উপাদান বাতিল করা হবে না তবে ছোটটি অনুলিপি করা হবে। ফর্মের T1 & ¬T2একটি শিকারীও মার্জ করার কৌশলটি ব্যবহার করে প্রয়োগ করা যেতে পারে, তবে ¬T1বা T1 | ¬T2করতে পারে না।

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

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

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

একদিকে যেমন আঞ্চলিক ফলাফলগুলি ক্যাশে করা উপকারী হতে পারে যদি এটি আশা করা হয় যে ভবিষ্যতে একই ধরণের প্রশ্নগুলি চালানো হবে, যদিও তারা ইনিটাল রানকে ত্বরান্বিত করে না।

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