এখানে একটি সমস্যা যা আমাকে কিছুক্ষণের জন্য বগল করে চলেছে। ধরা যাক একটি স্ট্রিং 1s এবং 0 এর ক্রম এবং একটি ওয়াইল্ডকার্ড স্ট্রিং 1, 0 এবং? এর একটি অনুক্রম। সমস্ত স্ট্রিং এবং ওয়াইল্ডকার্ড স্ট্রিংগুলির দৈর্ঘ্য একই। এগুলি মানক ইউনিক্স ওয়াইল্ডকার্ড; 10 ?? 1 ম্যাচ 10011, 10111, ইত্যাদি - ক? সেই অবস্থানে একটি 1 বা 0 এর সাথে মেলে। যদি এবং ওয়াইল্ডকার্ড স্ট্রিং হয়, তারপরে আমরা লিখি যদি প্রতিটি স্ট্রিং মিলে যায় এছাড়াও মিলেছে ।
সমস্যাগুলি : একটি সেট দেওয়া হয়েছে ওয়াইল্ডকার্ড স্ট্রিং এবং একটি ক্যোয়ারী (এছাড়াও একটি ওয়াইল্ডকার্ড স্ট্রিং), সেখানে কি আছে? যেমন যে ? এবং যদি না হয় তবে আমরা যুক্ত করতে পারি প্রতি দক্ষতার?
এখানে সুস্পষ্ট সমাধান (যেখানে স্ট্রিংয়ের আকার, র্যামের শব্দের আকার (সাধারণত 32 বা )৪): তালিকার প্রতিটি উপাদান দিয়ে the এছাড়াও পরীক্ষা যদি যে কোনও আইটেম রাখে যখন আমরা স্ক্যান করছি। যদি আমাদের পরীক্ষা ব্যর্থ, তারপর যোগ করুন সেট করতে, এবং অপসারণ আমরা চিহ্নিত করেছি।
তবে তা যথেষ্ট দ্রুত নয়। এটি থাকলে খুব ভাল লাগত সমাধান, বা, একটি নিখুঁত বিশ্বে, মূলা গাছের মতো জটিলতা ()। ক্যোয়ারীগুলি প্রায় সঠিক হওয়াও ঠিক আছে : এটি যদি হয়, তারপর হ্যাঁ বা না ফিরে; তবে শর্তটি যদি না ধরে থাকে তবে অবশ্যই ফিরে আসবে।
যদিও এটি সবচেয়ে খারাপ ক্ষেত্রে জটিলতায় সহায়তা করে না, আপনি ধরে নিতে পারেন যে সমস্ত উপাদান এতে রয়েছে একটি ওয়াইল্ডকার্ড স্ট্রিং দ্বারা আবদ্ধ হয়; যে কিছু আছে যেমন সবার জন্য , ।
আমি চেষ্টা করেছি
- ওয়াইল্ডকার্ড স্ট্রিংগুলি একটি জয়েন্ট-সেলিমিটাইস গঠন করে। আমাদের কাছে এন-আরি গাছ থাকতে পারে যা ওয়াইল্ডকার্ডের স্ট্রিংগুলি ধারণ করে; পাতাগুলি ওয়াইল্ডকার্ডের স্ট্রিং হবে এবং ডালগুলি বাচ্চাদের সমস্তের যোগদানের প্রতিনিধিত্ব করবে। যদি কোয়েরি এবং যোগদানটি অতুলনীয় হয়, তবে সেই শাখার সমস্ত সন্তানের সাথে তুলনা করার চেষ্টা করতে আমাদের সময় নষ্ট করতে হবে না। তদুপরি, যদি আমরা একটি আপডেট করি এবং আপডেটটি কোনও যোগদানের চেয়ে বড় হয় তবে আমরা কেবল পুরো শাখাটি মুছতে পারি। দুর্ভাগ্যক্রমে, এটি এখনও আছে সবচেয়ে খারাপ ক্ষেত্রে এবং উপাদান যুক্ত করার জন্য গাছের মাধ্যমে স্ক্যান করার সময় আমরা সর্বদা "সেরা" যোগ দিতে পাই না।
- যে কোনও একটি এর মূলাঙ্ক ট্রাই গঠন করতে পারে । আমরা জানি যেকিছু ওয়াইল্ডকার্ড স্ট্রিং দ্বারা আবদ্ধ; ধরুন এটি 0? 0? তারপরে ট্রাইয়ের সমস্ত শাখা কেবল স্ট্রিংয়ের প্রথম এবং তৃতীয় বিটগুলিতে থাকতে হবে। বর্তমান বিটটি আমরা কোয়েরিতে শাখা করছি যদি 1 1 হয় তবে আমাদের পরীক্ষা করতে হবে? এবং 1 শাখা; যদি এটি 0 হয়, আমরা কি পরীক্ষা করব? এবং 0 টি শাখা; যদি এটি হয়?, আমরা কেবল পরীক্ষা করব? শাখা। যেহেতু আমাদের সম্ভাব্য একাধিক শাখা নিতে হবে, এটি খুব ভাল বলে মনে হচ্ছে না (একই কারণে ট্রাই আপডেট করা শক্ত)। যেহেতু মিলে যাওয়া খুব তাত্ক্ষণিক ক্রিয়াকলাপ, তাই গাছটিতে প্রচুর ট্র্যাভারিংয়ের চালক কৌশলটির তুলনায় এটি ব্যথিত হয় (কিছু ওআরএড এবং এ্যান্ডএস করার চেয়ে পয়েন্টারগুলির একগুচ্ছ অনুসরণ করা আরও ব্যয়বহুল)।
সম্পর্কিত কাজ
নেটওয়ার্কিং সম্প্রদায়ের মধ্যে, এই সমস্যাটি "প্যাকেটের শ্রেণিবদ্ধকরণ" হিসাবে উদ্ভাসিত হয়, এখানে অ্যালগোরিদম এবং ডেটা স্ট্রাকচারের পরিচিত একটি ভাল জরিপ রয়েছে । দুর্ভাগ্যক্রমে, ধারণাটি প্রায়শই তৈরি করা হয় যে ওয়াইল্ডকার্ড স্ট্রিংগুলি কেবল উপসর্গের সাথে মেলে এবং কোয়েরিটি এই জাতীয় স্ট্রিংগুলির একটি অংশ up অবশ্যই, আমরা সবসময় এই মানদণ্ডগুলি পূরণ করতে একটি সাধারণ ওয়াইল্ডকার্ড স্ট্রিং রূপান্তর করতে পারি: 1? 00? 1 ?? (1,?, 0, 0,?, 1,?,?) হয়। যদিও এটি দক্ষ হবে না। অন্যান্য অনুমানটি হ'ল এই টিপলগুলি একটি "রঙ" এর সাথে যুক্ত, এবং অনুসন্ধান করার সময় রঙটি ফিরিয়ে দেওয়া উচিত (এটি কেবল এটির সাথে মেলে না)। এটি সমস্যাটিকে আরও শক্ত করে তোলে, কারণ আমাদের টিউপলগুলি অর্ডার করতে হবে (অন্যথায় এটি কোনটি (0,?) এবং (?, 1) ম্যাচ (0, 1)) দ্ব্যর্থক।
অ্যালগরিদম সম্প্রদায়টিতে আমি সাবস্ক্রাইটিংগুলি খুঁজে পাওয়া সম্পর্কিত অনেকগুলি ফলাফল পেয়েছি যা "পরোয়া করে না" এর সাথে মেলে। এটি যথেষ্ট কঠিন সমস্যা এবং আমি সত্যিই কোনও কৌশল ব্যবহার করতে পারি না।
উপসংহারে
কোন সাহায্যের জন্য ধন্যবাদ!