আমি একটি বিভাজন এবং বিজয়ী পদ্ধতির কথা ভেবেছিলাম যা কার্যকর হতে পারে।
প্রথমত, preprocessing আপনি অর্ধেক আপনার ইনপুট আকার (কম সমস্ত নম্বর সন্নিবেশ করতে প্রয়োজন এন / 3) একটি তালিকায়।
একটি স্ট্রিং দেওয়া হয়েছে: 0000010101000100
(এই বিশেষ উদাহরণটি বৈধ কিনা তা নোট করুন)
1 থেকে (16/2) থেকে সমস্ত প্রাইম (এবং 1) একটি তালিকায় sertোকান: {1, 2, 3, 4, 5, 6, 7}
তারপরে এটি অর্ধেক ভাগ করুন:
100000101 01000100
আপনি আকারের স্ট্রিং 1 না হওয়া পর্যন্ত এটি চালিয়ে যান; সমস্ত আকার-ওয়ান স্ট্রিংগুলির মধ্যে একটি 1 এর সাথে, স্ট্রিংটির সূচকে সম্ভাবনার তালিকায় যুক্ত করুন; অন্যথায়, ব্যর্থতার জন্য -1 ফিরুন।
প্রতিটি প্রারম্ভিক সূচকের সাথে যুক্ত, আপনাকে এখনও সম্ভাব্য ব্যবধানের দূরত্বের একটি তালিকা ফেরত দিতে হবে। (আপনি উপরে তৈরি তালিকাটি দিয়ে শুরু করুন এবং নামার সাথে সাথে নামগুলি সরিয়ে ফেলুন) এখানে, খালি তালিকার অর্থ আপনি কেবলমাত্র একটি 1 এর সাথে কাজ করছেন এবং সুতরাং এই মুহুর্তে কোনও ফাঁকানো সম্ভব; অন্যথায় তালিকার মধ্যে এমন স্পেসিং রয়েছে যা বাতিল হতে হবে।
সুতরাং উপরের উদাহরণটি দিয়ে চালিয়ে যাচ্ছি:
1000 0101 0100 0100
10 00 01 01 01 00 01 00
1 0 0 0 0 1 0 1 0 1 0 0 0 1 0 0
প্রথম সম্মিলন পদক্ষেপে, এখন আমাদের দুটি সেট আট আছে। প্রথমটিতে, আমাদের কাছে একটি সেট হওয়ার সম্ভাবনা রয়েছে তবে আমরা শিখেছি যে অন্য শূন্যটি সেখানে থাকার কারণে 1 দ্বারা ব্যবধান করা অসম্ভব। সুতরাং আমরা 0 অনুসারে (সূচকের জন্য) এবং by 2,3,4,5,7 return এই সত্যের জন্য যে 1 দ্বারা ব্যবধান করা অসম্ভব বলে ফিরে আসি। দ্বিতীয়টিতে, আমাদের কাছে কিছুই নেই এবং তাই ফিরুন -1। তৃতীয়টিতে আমাদের একটি ম্যাচ আছে যেখানে সূচি 5 এ কোনও ফাঁক ছাড়েনি, সুতরাং 5, {1,2,3,4,5,7 return ফিরিয়ে দিন} চতুর্থ জুটিতে আমরা 7, {1,2,3,4,5,7} ফিরে আসি} পঞ্চম, 9 ফিরে, {1,2,3,4,5,7}। ষষ্ঠিতে, রিটার্ন -1। সপ্তমীতে, 13 এ ফিরে আসুন, {1,2,3,4,5,7}} অষ্টমীতে, ফিরুন -1।
চারটি চারটি সেটটিতে আবার সংমিশ্রণ করা:
1000
: রিটার্ন (0, {4,5,6,7})
0101
: রিটার্ন (5, {2,3,4,5,6,7}), (7, {1,2,3,4,5,6) , 7})
0100
: ফিরে (9, {3,4,5,6,7})
0100
: ফিরে (13, {3,4,5,6,7})
আটটি সেট মিশ্রন:
10000101
: রিটার্ন (0, {5,7}), (5, {2,3,4,5,6,7}), (7, {1,2,3,4,5,6,7})
01000100
: রিটার্ন (9, {4,7}), (13, {3,4,5,6,7})
ষোল একটি সেট মিশ্রণ:
10000101 01000100
আমরা যেভাবে অগ্রগতি করেছি, আমরা এখন পর্যন্ত সমস্ত সম্ভাবনা যাচাই করে চলছি। এই পদক্ষেপ অবধি আমরা স্ট্রিংয়ের শেষ ছাড়িয়ে গেছে এমন স্টাফ রেখেছি, তবে এখন আমরা সমস্ত সম্ভাবনা পরীক্ষা করতে পারি।
মূলত, আমরা প্রথম 1 টি 5 এবং 7 এর ফাঁক দিয়ে চেক করি এবং দেখতে পাই যে সেগুলি 1 এর মধ্যে নেই। (নোট করুন যে প্রতিটি চেকটি কনট্যান্ট, লিনিয়ার সময় নয়) তারপরে আমরা দ্বিতীয় (সূচক 5) 2, 3, 4, 5, 6, এবং 7 এর ফাঁক দিয়ে চেক করি - বা আমরা চাইব, তবে আমরা 2 এ থামতে পারি যে আসলে মেলে।
রাম রাম! এটি বরং দীর্ঘ দীর্ঘ অ্যালগরিদম।
আমি সর্বশেষ পদক্ষেপের কারণে এটি ও (এন লগ এন) হয় কিনা 100% জানি না , তবে যতদূর আমি বলতে পারি সেখানে সমস্ত কিছু অবশ্যই O (n লগ এন) রয়েছে । আমি পরে এটিতে ফিরে আসব এবং শেষ পদক্ষেপটি পরিমার্জন করার চেষ্টা করব।
সম্পাদনা: ওয়েলবোগের মন্তব্য প্রতিফলিত করতে আমার উত্তর পরিবর্তন করেছে। ত্রুটির জন্য দুঃখিত। আমি পরে আরও কিছু সিউডোকোড লিখব, যখন আমি আবার কী লিখেছি তা বোঝার জন্য যখন আমি আরও কিছুটা সময় পাই। ;-)