ঠিক আছে, তাই আমি কোন নির্বোধের মতো শব্দ করি না আমি আরও স্পষ্টভাবে সমস্যা / প্রয়োজনীয়তাগুলি বর্ণনা করতে যাচ্ছি:
- সুই (প্যাটার্ন) এবং খড়খড়ি (অনুসন্ধানে পাঠ্য) উভয়ই সি-স্টাইলের নাল-টার্মিনেটেড স্ট্রিং। কোনও দৈর্ঘ্যের তথ্য সরবরাহ করা হয় না; যদি প্রয়োজন হয়, এটি গণনা করা আবশ্যক।
- প্রথম ম্যাচে ফাংশনটির একটি পয়েন্টার ফিরিয়ে দেওয়া উচিত, বা
NULL
কোনও মিল না পাওয়া গেলে। - ব্যর্থতার ক্ষেত্রে অনুমোদিত নয়। এর অর্থ অ-ধ্রুবক (বা বৃহত ধ্রুবক) স্টোরেজ প্রয়োজনীয়তার সাথে যে কোনও অ্যালগরিদম বরাদ্দ ব্যর্থতার জন্য একটি ফ্যালব্যাক কেস (এবং ফলব্যাক কেয়ারে পারফরম্যান্স যার ফলে সবচেয়ে খারাপ ক্ষেত্রে পারফরম্যান্সে অবদান রাখে) থাকতে হবে।
- সি প্রয়োগ করা হবে, যদিও কোড ব্যতীত অ্যালগরিদম (বা এর লিঙ্ক) এর একটি ভাল বিবরণ খুব ভাল।
... পাশাপাশি আমি "দ্রুততম" বলতে কী বোঝায়:
- নির্ধারিত
O(n)
যেখানেn
= খড়ের দৈর্ঘ্য। (তবে সাধারণত অ্যালগরিদম থেকে ধারণাগুলি ব্যবহার করা সম্ভব হতে পারে যা সাধারণতO(nm)
(উদাহরণস্বরূপ রোলিং হ্যাশ) যদি তারা আরও শক্তিশালী অ্যালগরিদমের সাথে একত্রিত হয় তবে ডিস্ট্রিমেন্টিকO(n)
ফলাফল দিতে পারে )। - কখনও পরিশ্রম করেন না (পরিমাপযোগ্য; একটি দম্পতি ঘড়ি
if (!needle[1])
ইত্যাদির জন্য ঠিক আছে) মজাদার ব্রুট ফোর্স অ্যালগরিদমের চেয়েও খারাপ, বিশেষত খুব ছোট সূঁচে যা সম্ভবত সবচেয়ে সাধারণ ক্ষেত্রে। (শর্তহীন ভারী প্রিপ্রোসেসিং ওভারহেড খারাপ, কারণ সম্ভবত সূঁচ ব্যয় করে প্যাথলজিকাল সূঁচগুলির জন্য রৈখিক সহগকে উন্নত করার চেষ্টা করা হচ্ছে)) - একটি নির্বিচারে সুই এবং খড়ের কাঁটা, তুলনাযোগ্য বা আরও ভাল পারফরম্যান্স দেওয়া হয়েছে (50% এর চেয়ে বেশি দীর্ঘতর অনুসন্ধানের সময় নয়) বনাম অন্য যে কোনও কার্যকরভাবে প্রয়োগ করা অ্যালগরিদম।
- এই শর্তগুলি বাদ দিয়ে আমি "দ্রুততম" ওপেন-এন্ডের সংজ্ঞা রেখে চলেছি। একটি উত্তরের উত্তরে ব্যাখ্যা করা উচিত যে আপনি যে পদ্ধতির জন্য "দ্রুততম" পরামর্শ দিচ্ছেন কেন তা বিবেচনা করছেন।
আমার বর্তমান বাস্তবায়ন গ্লোবিকের দ্বিমুখী প্রয়োগের চেয়ে প্রায় 10% ধীর এবং 8 গুণ দ্রুত (ইনপুটটির উপর নির্ভরশীল) এর মধ্যে চলে।
আপডেট: আমার বর্তমান অনুকূল অ্যালগরিদম নিম্নরূপ:
- দৈর্ঘ্য 1 সূঁচ জন্য, ব্যবহার করুন
strchr
। - দৈর্ঘ্যের সূঁচগুলির জন্য, একবারে 2-4 বাইটের তুলনা করার জন্য মেশিনের শব্দগুলি ব্যবহার করুন: একটি 16- বা 32-বিট পূর্ণসংখ্যায় বিটশিফ্ট এবং চক্রের পুরানো বাইট আউট / নতুন বাইটগুলি প্রতিটি পুনরুক্তিতে খড়ের কাঁটা থেকে । খড়ের কাঁটার প্রতিটি বাইট হুবহু একবার পড়তে হয় এবং 0 (স্ট্রিংয়ের শেষ) এবং একটি 16- বা 32-বিটের তুলনা সহ একটি চেক দেয়।
- দৈর্ঘ্যের সূঁচের জন্য> 4, একটি খারাপ শিফট টেবিল (বোয়ের-মুরের মতো) সহ দ্বি-ওয়ে অ্যালগরিদম ব্যবহার করুন যা কেবল উইন্ডোর শেষ বাইটে প্রয়োগ করা হয়। 1kb টেবিলটি আরম্ভ করার ওভারহেড এড়াতে, যা অনেক মাঝারি দৈর্ঘ্যের সূঁচের জন্য নেট ক্ষতি হতে পারে, আমি শিফট টেবিলের প্রবেশদ্বারগুলি আরম্ভ করা হয় যা চিহ্নিত করে কিছুটা অ্যারে (32 বাইট) রাখি। বিটগুলি যেগুলি সেট না করে সেগুলি বাইট মানগুলির সাথে সামঞ্জস্য হয় যা কখনই সুইতে উপস্থিত হয় না, যার জন্য একটি পূর্ণ সুই-দৈর্ঘ্যের শিফট সম্ভব।
আমার মস্ত বড় প্রশ্নগুলি হ'ল:
- খারাপ শিফট টেবিলটির আরও ভাল ব্যবহার করার কোনও উপায় আছে? বায়ার-মুর পিছনের দিকে (ডান থেকে বাম) স্ক্যান করে এটির সর্বোত্তম ব্যবহার করে তবে দ্বি-ওয়েতে বাম থেকে ডান স্ক্যানের প্রয়োজন।
- সাধারণ ক্ষেত্রে আমি কেবলমাত্র দুটি কার্যক্ষম প্রার্থী অ্যালগরিদম খুঁজে পেয়েছি ( অর্ডার অফ মেমোরি বা চতুষ্পদ পারফরম্যান্সের কোনও শর্ত নয়) হ'ল অর্ডারযুক্ত বর্ণমালায় দ্বি-উপায় এবং স্ট্রিং ম্যাচিং । তবে এমন কি সহজেই সনাক্তযোগ্য কেস পাওয়া যায় যেখানে বিভিন্ন অ্যালগোরিদম অনুকূল হয়? অবশ্যই স্পেস অ্যালগরিদমের অনেকগুলি
O(m)
(যেখানেm
সূচির দৈর্ঘ্য রয়েছে) এর জন্যm<100
বা তার জন্য ব্যবহার করা যেতে পারে । সূঁচের জন্য যদি একটি সহজ পরীক্ষা থাকে যার জন্য সম্ভবত কেবল রৈখিক সময়ের প্রয়োজন হয় তবে অ্যালগরিদমগুলি ব্যবহার করা সম্ভব হবে যা সবচেয়ে খারাপ ক্ষেত্রে চতুর্ভুজ are
এর জন্য বোনাস পয়েন্ট:
- সুই এবং খড়ের ছাঁচ উভয়ই সুসংহত ইউটিএফ -8 ধরে ধরে আপনি কর্মক্ষমতা উন্নত করতে পারেন? (বিভিন্ন বাইট দৈর্ঘ্যের চরিত্রগুলির সাথে, সুগঠিত-নেসটি সুই এবং খড়ের ছিদ্রের মধ্যে কিছু স্ট্রিং প্রান্তিককরণের চাপিয়ে দেয় এবং যখন কোনও অমিল হেড বাইটের মুখোমুখি হয় তখন স্বয়ংক্রিয় 2-4 বাইট শিফটকে অনুমতি দেয় But তবে এই সীমাবদ্ধতাগুলি আপনাকে আরও কিছুর চেয়ে বেশি কিছু কিনে দেয়) সর্বাধিক প্রত্যয় গণনা, ভাল প্রত্যয় শিফট, ইত্যাদি ইতিমধ্যে আপনাকে বিভিন্ন অ্যালগোরিদম দিয়ে দিয়েছে?)
দ্রষ্টব্য: আমি বেশিরভাগ অ্যালগরিদম সম্পর্কে ভালভাবে জানি, তারা অনুশীলনে কতটা ভাল পারফর্ম করে তা নয়। এখানে একটি ভাল রেফারেন্স যাতে লোকেরা মন্তব্য / উত্তর হিসাবে আমাকে অ্যালগরিদমগুলিতে রেফারেন্স দেয় না: http://www-igm.univ-MLv.fr/~lecroq/string/index.html
strstr
এবং পরবর্তীকালে কিছু হিসাবে আরও উন্নতি রেখেছি, সুতরাং আপনি যে কাগজটি সংযুক্ত করেছেন সেগুলি সঠিকভাবে পড়তে আমি আসলে পাইনি, তবে এটি খুব আশাব্যঞ্জক মনে হচ্ছে। আপনাকে ফিরে না পেয়ে ধন্যবাদ এবং দুঃখিত।