দ্রুততম স্ট্রিং অনুসন্ধানের অ্যালগরিদম কী?


165

ঠিক আছে, তাই আমি কোন নির্বোধের মতো শব্দ করি না আমি আরও স্পষ্টভাবে সমস্যা / প্রয়োজনীয়তাগুলি বর্ণনা করতে যাচ্ছি:

  • সুই (প্যাটার্ন) এবং খড়খড়ি (অনুসন্ধানে পাঠ্য) উভয়ই সি-স্টাইলের নাল-টার্মিনেটেড স্ট্রিং। কোনও দৈর্ঘ্যের তথ্য সরবরাহ করা হয় না; যদি প্রয়োজন হয়, এটি গণনা করা আবশ্যক।
  • প্রথম ম্যাচে ফাংশনটির একটি পয়েন্টার ফিরিয়ে দেওয়া উচিত, বা 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


বেশ তালিকাভুক্ত স্ট্রিং সার্চ আলগোরিদিম একটি নম্বর আছে স্ট্রিং আলগোরিদিম । আপনি এই তালিকা থেকে কোন অ্যালগরিদম বিবেচনা করেছেন তা বর্ণনা করতে চাইতে পারেন।
গ্রেগ হিউগিল

61
সেই লিঙ্কটি শেষে সোনার!
কার্লোস

4
আমি বিশ্বাস করতে পারি না আপনি এখনও কোনও উত্তর গ্রহণ করেন নি।
user541686

1
@ মেহরদাদ: আমি বলছিলাম এমন কোনও উত্তর নেই যা জিজ্ঞাসা করা প্রশ্নটির সত্যই উত্তর দেয় না, তবে আপনার মনে হয়। আপনি উত্তর দিয়েছিলেন যে আমি এগিয়ে চলেছি strstrএবং পরবর্তীকালে কিছু হিসাবে আরও উন্নতি রেখেছি, সুতরাং আপনি যে কাগজটি সংযুক্ত করেছেন সেগুলি সঠিকভাবে পড়তে আমি আসলে পাইনি, তবে এটি খুব আশাব্যঞ্জক মনে হচ্ছে। আপনাকে ফিরে না পেয়ে ধন্যবাদ এবং দুঃখিত।
আর .. গিথহাব বন্ধ হেল্পিং আইসিসি

উত্তর:


37

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

বায়ার-মুর একটি ভাল প্রত্যয় টেবিল সহ একটি খারাপ চরিত্রের টেবিল ব্যবহার করে।

বায়ার-মুর-হর্সপুল একটি খারাপ চরিত্রের ছক ব্যবহার করে।

নুথ-মরিস-প্র্যাট একটি আংশিক মিলের টেবিল ব্যবহার করে।

রবিন-কার্প চলমান হ্যাশ ব্যবহার করে।

তারা সকলেই আলাদা ডিগ্রীর তুলনায় হ্রাসের তুলনায় ওভারহেড বাণিজ্য করে, তাই আসল বিশ্বের পারফরম্যান্সটি সুই এবং খড়ের দু'জনের গড় দৈর্ঘ্যের উপর নির্ভর করবে। আরও প্রাথমিক ওভারহেড, দীর্ঘ ইনপুটগুলির সাথে ভাল। খুব সংক্ষিপ্ত সূঁচ দিয়ে, নিষ্ঠুর শক্তি জিততে পারে।

সম্পাদনা:

বেস জোড়া, ইংরেজি বাক্যাংশ বা একক শব্দের সন্ধানের জন্য একটি আলাদা অ্যালগরিদম সেরা হতে পারে। সমস্ত ইনপুটগুলির জন্য যদি একটি সেরা অ্যালগরিদম থাকে তবে এটি প্রচারিত হত।

নিম্নলিখিত ছোট টেবিল সম্পর্কে চিন্তা করুন। প্রতিটি প্রশ্ন চিহ্নের জন্য আলাদা আলাদা অনুসন্ধানের অ্যালগরিদম থাকতে পারে।

                 short needle     long needle
short haystack         ?               ?
long haystack          ?               ?

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

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

আমি ছোট এবং দীর্ঘ অস্পষ্ট রেখেছি সূঁচের জন্য, আমি 8 টি অক্ষরের নীচে, ,৪ টি অক্ষরের নীচে মাঝারি এবং লম্বা 1 কে হিসাবে বিবেচনা করব। খড়খড়ির জন্য, আমি ছোট হিসাবে মনে করি 2 as 10 এর নীচে, 2 ^ 20 এর মতো মাঝারি এবং 2 ^ 30 অক্ষর পর্যন্ত দীর্ঘ।


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

3
এটি সংক্ষিপ্ত / দীর্ঘের চেয়ে কিছুটা জটিল। সূঁচের জন্য, বেশিরভাগ অ্যালগরিদমের কার্যকারিতা সম্পর্কিত বড় প্রশ্নগুলি: দৈর্ঘ্য? কোন পর্যায় আছে? সুইতে কি সমস্ত অনন্য অক্ষর রয়েছে (পুনরাবৃত্তি হয় না)? নাকি সব একই চরিত্র? খড়ের ছিটে এমন একটি বিশাল সংখ্যক চরিত্র রয়েছে যা কখনও সূচিতে প্রদর্শিত হয় না? কোনও আক্রমণকারী যিনি আপনার সিস্টেমকে পঙ্গু করার জন্য সবচেয়ে খারাপ ক্ষেত্রে পারফরম্যান্স কাজে লাগাতে চান সেই সূঁচগুলি মোকাবেলা করার কি সুযোগ আছে? ইত্যাদি ..
আর .. গিটহাব বন্ধ করুন ICE

31

২০১১ সালে প্রকাশিত, আমি বিশ্বাস করি এটি ড্যানি ব্রেস্লুয়ার, রবার্তো গ্রোসি এবং ফিলিপো ম্যাগনোসির "সাধারণ রিয়েল-টাইম কনস্ট্যান্ট-স্পেস স্ট্রিং ম্যাচিং" অ্যালগরিদম হতে পারে may

হালনাগাদ:

২০১৪ সালে লেখকরা এই উন্নতি প্রকাশ করেছেন: অনুকূল প্যাকড স্ট্রিং ম্যাচের দিকে


1
ওহ ধন্যবাদ. আমি কাগজ পড়ছি। আমার কাছে যা আছে তার থেকে যদি এটির থেকে ভাল হয়ে যায় তবে আমি অবশ্যই আপনার উত্তরটি গ্রহণ করব।
আর .. গীটহাব বন্ধ করুন ICE

1
@ আর ..: অবশ্যই! :) যার কথা বলতে গিয়ে, আপনি যদি অ্যালগরিদম বাস্তবায়ন করতে পরিচালনা করেন তবে দয়া করে এটি স্ট্যাকওভারফ্লোতে পোস্ট করার বিষয়টি বিবেচনা করুন যাতে প্রত্যেকে এটি থেকে উপকৃত হতে পারে! আমি এর কোথাও এর কোনও বাস্তবায়ন খুঁজে পাইনি এবং আমি গবেষণামূলক কাগজগুলিতে পাওয়া আলগোরিদিমগুলি প্রয়োগ করতে ভাল নই ha
ব্যবহারকারী541686

2
এটি ইতিমধ্যে আমি ব্যবহার করছি "দ্বিমুখী" অ্যালগরিদমের একটি বৈকল্পিক, সুতরাং আমার কোডটি এটি ব্যবহার করার জন্য অভিযোজিত করা সহজতর হতে পারে। নিশ্চিত হওয়ার জন্য আমাকে আরও বিশদ সহ কাগজটি পড়তে হবে এবং যদিও আমার পরিবর্তনগুলি আমার একটি "খারাপ চরিত্রের টেবিল" ব্যবহারের সাথে সামঞ্জস্যপূর্ণ কিনা যা সাধারণ ক্ষেত্রে ব্যাপকভাবে গতি দেয় তা মূল্যায়ন করতে হবে to
আর .. গীটহাব বন্ধ করুন ICE

11
এবং আপনি এখনও @ মেহেরদাদের উত্তর গ্রহণ করেন নি! :-)
লাইফব্লেন্স 3'15

3
@ ডেভিডওয়ালেস: কি? এটি কাগজের শিরোনাম এবং লেখক আছে। লিঙ্কটি মারা গেলেও আপনি কাগজপত্রগুলি খুঁজে পেতে পারেন। আপনি আমার কাছে কী প্রত্যাশা করছেন, অ্যালগরিদমের জন্য সিউডোকোড লিখুন? আপনি কী ভাবছেন যে আমি অ্যালগরিদম বুঝতে পারি?
ব্যবহারকারী541686

23

আপনি যে http://www-igm.univ-mlv.fr/~lecroq/string/index.html লিঙ্কটি দেখিয়েছেন সেটি হ'ল কয়েকটি বিখ্যাত এবং গবেষণামূলক স্ট্রিং মেলানো অ্যালগরিদমের একটি দুর্দান্ত উত্স এবং সংক্ষিপ্তসার।

বেশিরভাগ অনুসন্ধান সমস্যার সমাধানগুলি প্রাক-প্রসেসিং ওভারহেড, সময় এবং স্থানের প্রয়োজনীয়তার সাথে সম্পর্কিত বাণিজ্য বন্ধকে জড়িত। কোনও একক অ্যালগরিদম সর্বক্ষেত্রে অনুকূল বা ব্যবহারিক হবে না।

যদি আপনি উদ্দেশ্যটি স্ট্রিং অনুসন্ধানের জন্য একটি নির্দিষ্ট অ্যালগরিদম ডিজাইন করতে চান তবে আমার যা বলার আছে তা অবহেলা করুন, আপনি যদি সাধারণ স্ট্রিং অনুসন্ধানের পরিষেবা রুটিন বিকাশ করতে চান তবে নিম্নলিখিতগুলি চেষ্টা করুন:

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

একাধিক অ্যালগরিদম কোনও নতুন ধারণা নয়। আমি বিশ্বাস করি এটি কয়েকটি বাণিজ্যিক সাজান / অনুসন্ধান প্যাকেজগুলি দ্বারা নিযুক্ত করা হয়েছে (যেমন মেইনফ্রেমগুলিতে সাধারণত ব্যবহৃত সিওয়াইএনসিএসআরটি বিভিন্ন ধরণের অ্যালগরিদম প্রয়োগ করে এবং প্রদত্ত ইনপুটগুলির জন্য "সেরা" বেছে নিতে হিউরিস্টিক্স ব্যবহার করে)

প্রতিটি অনুসন্ধান অ্যালগরিদম বিভিন্ন রূপে আসে যা এর কার্য সম্পাদনে উল্লেখযোগ্য পার্থক্য করতে পারে, উদাহরণস্বরূপ, এই কাগজটি চিত্রিত করে।

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


1
প্রতিক্রিয়াটির জন্য ধন্যবাদ, বিশেষত সুস্টিক-মুরের লিঙ্কটি যা আমি আগে দেখিনি। একাধিক অ্যালগরিদম পদ্ধতির অবশ্যই ব্যাপকভাবে ব্যবহার in গ্লিবিসি মূলত স্ট্রেচআর করে, খারাপ চরিত্রের শিফ্ট টেবিল ছাড়াই দ্বি-উপায়ে বা খারাপ চরিত্রের শিফট টেবিলের সাথে দ্বি-ওয়ে, সুই_লেন 1, <32 বা> 32 এর উপর নির্ভর করে। আমি সর্বদা শিফট টেবিল ব্যবহার করি তা ছাড়া আমার বর্তমান পদ্ধতির মত একই; আমি টেবিলের কোন উপাদানগুলি শুরু করা হয়েছে তা চিহ্নিত করতে ব্যবহৃত একটি বিটসেটে 32 বাইট মেমসেটের সাহায্যে প্রয়োজনীয় 1 কেবি মেমসেটটি প্রতিস্থাপন করেছি এবং ক্ষুদ্র সূঁচের জন্যও আমি সুবিধাটি পেয়েছি (তবে ওভারহেড নয়)।
আর .. গীটহাব বন্ধ করুন ICE

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

দুর্দান্ত প্রতিক্রিয়া - যদি আমি এই নির্দিষ্ট উত্তরটি তারকাতে পারতাম।
জেসন এস

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

1
হুঁ, আমি অনুমান করি যে আমি বায়ার-মুর থেকে খারাপ চরিত্রের শিফ্টের অর্থে শিফটগুলি নিয়ে ভাবছিলাম stuck যদিও বিএম ভাল প্রত্যয় শিফট উন্নতি করে, সুস্টিক-মুর সম্ভবত ডিএনএ অনুসন্ধানে ডিএফএ পদ্ধতির চেয়ে বেশি পারফরম্যান্স করতে পারে। ঝরঝরে স্টাফ
আর .. গীটহাব বন্ধ হেল্পিং আইসিসি

21

আমাদের প্রযুক্তি প্রতিবেদনে এই আলোচনায় উদ্ধৃত দেখে আমি অবাক হয়েছি; আমি উপরের সুস্টিক-মুর নাম দেওয়া অ্যালগরিদমের অন্যতম লেখক। (আমরা আমাদের কাগজে সেই শব্দটি ব্যবহার করি নি))

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

কাগজে আমরা তাত্ত্বিক গ্যারান্টি শিথিল করার সময় দক্ষতার দিকে তত্পর হয়ে ওঠার আরও প্রকরণগুলিও বর্ণনা করি। এটি একটি সংক্ষিপ্ত কাগজ এবং উপাদানটি আমার মতে একটি গড় উচ্চ বিদ্যালয়ের স্নাতকের কাছে বোধগম্য হওয়া উচিত।

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


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

4
কোনও উপলব্ধ উপলভ্য বাস্তবায়ন না থাকায়, সুস্টিক-মুর / ২ ব্লক অ্যালগরিদম অনুশীলনে ব্যবহৃত হবে এবং "দ্য
সত্যিকারের

18

দ্রুততম স্ট্রারিং অনুসন্ধানের অ্যালগরিদম প্রসঙ্গে নির্ভর করতে চলেছে:

  1. বর্ণমালার আকার (যেমন ডিএনএ বনাম ইংরাজী)
  2. সুই দৈর্ঘ্য

২০১০ এর কাগজ "দ্য স্ট্যাকিং স্ট্রিং ম্যাচিং প্রবলেম: একটি বিস্তৃত পরীক্ষামূলক মূল্যায়ন" ৫১ টি অ্যালগরিদমের জন্য রানটাইম সহ টেবিল দেয় (বিভিন্ন বর্ণমালার আকার এবং সূঁচের দৈর্ঘ্যের সাথে), যাতে আপনি আপনার প্রেক্ষাপটের জন্য সেরা অ্যালগরিদম চয়ন করতে পারেন।

এই সমস্ত অ্যালগরিদমের সি বাস্তবায়ন রয়েছে পাশাপাশি টেস্ট স্যুটটি এখানে রয়েছে:

http://www.dmi.unict.it/~faro/smart/algorithms.php


4

সত্যিই একটি ভাল প্রশ্ন। কিছু ছোট বিট যোগ করুন ...

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

  2. সত্যিই দুর্দান্ত হবে যদি কেউ বিভিন্ন অ্যালগরিদমকে মাপদণ্ড করতে চান। সংক্ষিপ্তকরণ এবং প্রত্যয় অ্যারেগুলি নির্মাণের জন্য খুব ভাল মানদণ্ড রয়েছে তবে স্ট্রিং ম্যাচিংয়ের জন্য আমি কোনও মানদণ্ড দেখিনি। সম্ভাব্য খড়খড়ি প্রার্থীরা স্যাকা বেঞ্চমার্ক থেকে হতে পারে ।

  3. কিছু দিন আগে আমি আপনার প্রস্তাবিত পৃষ্ঠাটি থেকে বায়ার-মুর প্রয়োগের পরীক্ষা করছিলাম (EDIT: আমার মেমেমের মতো ফাংশন কল প্রয়োজন) () তবে এটি একটি স্ট্যান্ডার্ড ফাংশন নয়, তাই আমি এটি বাস্তবায়নের সিদ্ধান্ত নিয়েছি)। আমার বেঞ্চমার্কিং প্রোগ্রামটি এলোমেলো খড়ের ব্যবহার করে। দেখে মনে হচ্ছে যে পৃষ্ঠায় বয়ির-মুর বাস্তবায়ন গ্লিবসি'র মেমেম () এবং ম্যাকের স্ট্রেনস্টার () এর চেয়ে বহুগুণ দ্রুত। আপনি যদি আগ্রহী হন তবে বাস্তবায়নটি এখানে এবং বেঞ্চমার্কিং কোডটি এখানে । এটি অবশ্যই বাস্তবসম্মত মানদণ্ড নয়, তবে এটি একটি সূচনা।


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

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

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

4

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


3

Stdlib ব্যবহার করুন strstr:

char *foundit = strstr(haystack, needle);

এটি খুব দ্রুত ছিল, টাইপ করতে আমাকে প্রায় 5 সেকেন্ড সময় নিয়েছিল।


26
এবং আপনি যদি আমার প্রশ্নটি পড়েন তবে আপনি দেখতে পাচ্ছেন যে আমি এটির চেয়ে ভাল সময় কাটিয়েছি। আমি আপনার ব্যঙ্গাত্মকটি পছন্দ করি আমি -1 এড়িয়ে যাব।
আর .. গীটহাব বন্ধ করুন ICE

3

এখানে পাইথন এর অনুসন্ধান বাস্তবায়ন , মূল সর্বত্র থেকে ব্যবহার করা। মন্তব্যগুলি ইঙ্গিত করে যে এটি সংকীর্ণ বায়ার-মুর ডেল্টা 1 টেবিল ব্যবহার করে

আমি নিজেই স্ট্রিং অনুসন্ধানের জন্য বেশ বিস্তৃত পরীক্ষা-নিরীক্ষা করেছি, তবে এটি ছিল একাধিক অনুসন্ধানের স্ট্রিংয়ের জন্য। হর্সপুল এবং বিটাপের বিধানসভা বাস্তবায়নগুলি কম প্যাটার্ন গণনার জন্য আহো-করাসিকের মতো অ্যালগোরিদমের বিরুদ্ধে প্রায়শই তাদের নিজস্ব ধারণ করতে পারে ।


3

একটি দ্রুত "একটি একক মিলের চরিত্রের জন্য অনুসন্ধান করুন" (আলা strchr) অ্যালগরিদম।

গুরুত্বপূর্ণ নোট:

  • এই ফাংশনগুলিতে একটি "সংখ্যার / গণনা (অগ্রগামী | জেরো" জিরো) " gccসংকলক অভ্যন্তরীণ- ব্যবহার করা হয় __builtin_ctz। এই ফাংশনগুলি কেবলমাত্র এমন মেশিনগুলিতে দ্রুত হতে পারে যার একটি নির্দেশ (গুলি) রয়েছে যা এই ক্রিয়াকলাপটি সম্পাদন করে (যেমন, x86, পিপিসি, আর্ম)।

  • এই ফাংশনগুলি ধরে নেয় টার্গেট আর্কিটেকচার 32 এবং 64 বিট আন-সাইনড লোড সম্পাদন করতে পারে। যদি আপনার টার্গেট আর্কিটেকচার এটি সমর্থন না করে তবে আপনাকে পাঠগুলি সঠিকভাবে সারিবদ্ধ করার জন্য কিছু স্টার্ট আপ যুক্তি যুক্ত করতে হবে।

  • এই ফাংশনগুলি প্রসেসর নিরপেক্ষ হয়। যদি লক্ষ্য সিপিইউতে ভেক্টর নির্দেশাবলী থাকে তবে আপনি আরও ভাল (আরও) করতে সক্ষম হবেন। উদাহরণস্বরূপ, strlenনীচের ফাংশনটি এসএসই 3 ব্যবহার করে এবং ব্যতীত অন্য কোনও বাইট সন্ধান করার জন্য স্ক্যান করা বাইটগুলি এক্সওআর থেকে তুচ্ছভাবে সংশোধন করা যেতে পারে 0। বেঞ্চমার্কগুলি ম্যাক ওএস এক্স 10.6 (x86_64) চলমান একটি 2.66GHz কোর 2 ল্যাপটপে সঞ্চালিত:

    • 843.433 এমবি / সেকেন্ডের জন্য strchr
    • 2656.742 এমবি / সেকেন্ডের জন্য findFirstByte64
    • 13094.479 এমবি / সেকেন্ডের জন্য strlen

... একটি 32-বিট সংস্করণ:

#ifdef __BIG_ENDIAN__
#define findFirstZeroByte32(x) ({ uint32_t _x = (x); _x = ~(((_x & 0x7F7F7F7Fu) + 0x7F7F7F7Fu) | _x | 0x7F7F7F7Fu); (_x == 0u)   ? 0 : (__builtin_clz(_x) >> 3) + 1; })
#else
#define findFirstZeroByte32(x) ({ uint32_t _x = (x); _x = ~(((_x & 0x7F7F7F7Fu) + 0x7F7F7F7Fu) | _x | 0x7F7F7F7Fu);                    (__builtin_ctz(_x) + 1) >> 3; })
#endif

unsigned char *findFirstByte32(unsigned char *ptr, unsigned char byte) {
  uint32_t *ptr32 = (uint32_t *)ptr, firstByte32 = 0u, byteMask32 = (byte) | (byte << 8);
  byteMask32 |= byteMask32 << 16;
  while((firstByte32 = findFirstZeroByte32((*ptr32) ^ byteMask32)) == 0) { ptr32++; }
  return(ptr + ((((unsigned char *)ptr32) - ptr) + firstByte32 - 1));
}

... এবং একটি 64-বিট সংস্করণ:

#ifdef __BIG_ENDIAN__
#define findFirstZeroByte64(x) ({ uint64_t _x = (x); _x = ~(((_x & 0x7F7F7F7F7f7f7f7full) + 0x7F7F7F7F7f7f7f7full) | _x | 0x7F7F7F7F7f7f7f7full); (_x == 0ull) ? 0 : (__builtin_clzll(_x) >> 3) + 1; })
#else
#define findFirstZeroByte64(x) ({ uint64_t _x = (x); _x = ~(((_x & 0x7F7F7F7F7f7f7f7full) + 0x7F7F7F7F7f7f7f7full) | _x | 0x7F7F7F7F7f7f7f7full);                    (__builtin_ctzll(_x) + 1) >> 3; })
#endif

unsigned char *findFirstByte64(unsigned char *ptr, unsigned char byte) {
  uint64_t *ptr64 = (uint64_t *)ptr, firstByte64 = 0u, byteMask64 = (byte) | (byte << 8);
  byteMask64 |= byteMask64 << 16;
  byteMask64 |= byteMask64 << 32;
  while((firstByte64 = findFirstZeroByte64((*ptr64) ^ byteMask64)) == 0) { ptr64++; }
  return(ptr + ((((unsigned char *)ptr64) - ptr) + firstByte64 - 1));
}

২০১১/০6/২০১৪ সম্পাদনা করুন ওপি মন্তব্যগুলিতে উল্লেখ করেছে যে এই সমাধানটির একটি "দুর্গম বাগ" রয়েছে:

এটি চাওয়া বাইট বা নাল টার্মিনেটরটি অতীতে পড়তে পারে, যা পড়ার অনুমতি ছাড়াই একটি আনম্যাপড পৃষ্ঠা বা পৃষ্ঠা অ্যাক্সেস করতে পারে। স্ট্রিং ফাংশনগুলিতে বড় পঠনগুলি সরানো না থাকলে আপনি সেগুলি সহজেই ব্যবহার করতে পারবেন না unless

এটি প্রযুক্তিগতভাবে সত্য, তবে কার্যত কোনও অ্যালগরিদম যা প্রবন্ধগুলিতে অপার দ্বারা প্রস্তাবিত পদ্ধতি সহ একক বাইটের চেয়েও বেশি বড় অংশগুলিতে পরিচালিত হয় :

একটি সাধারণ strchrবাস্তবায়ন নিষ্পাপ নয়, তবে আপনি যা দিয়েছেন তার চেয়ে কিছুটা দক্ষ। সর্বাধিক ব্যবহৃত অ্যালগরিদমের জন্য এর শেষটি দেখুন : http://ographicics.stanford.edu/~seender/bithacks.html#ZeroInWord

এটি প্রতি-সে-এ সারিবদ্ধকরণের সাথে আসলেই কিছু করার নেই। সত্য, এটি ব্যবহারে প্রচলিত সাধারণ আর্কিটেকচারের উপর আলোচিত আচরণের কারণ হতে পারে, তবে মাইক্রোআরকিটেকচারের বাস্তবায়নের বিশদটির সাথে এর আরও বেশি সম্পর্ক রয়েছে- যদি স্বাক্ষরবিহীন পাঠ্য 4K বাউন্ডারি (আবার, সাধারণ) স্ট্র্যাডলেস করে, তবে সেই পাঠ্য কোনও প্রোগ্রামের কারণ হতে পারে পরের 4K পৃষ্ঠার সীমানাটি ম্যাপ করা না থাকলে সমাপ্তি ত্রুটি।

তবে উত্তরে প্রদত্ত অ্যালগরিদমে এটি কোনও "বাগ" নয় - আচরণটি কারণ অনুসন্ধানের আকারকে আবদ্ধ করার জন্য কোনও যুক্তি পছন্দ করে না strchrএবং strlenগ্রহণ করে না length। অনুসন্ধান char bytes[1] = {0x55};, যা কেবলমাত্র আমাদের আলোচনার উদ্দেশ্যে 4K ভিএম পৃষ্ঠার সীমানার একেবারে শেষ প্রান্তে স্থাপন করা হবে এবং পরের পৃষ্ঠাটি আনম্যাপ করা হবে, strchr(bytes, 0xAA)যেখানে ( strchrএকটি বাইট-এ-এ-টাইম বাস্তবায়ন) ঠিক ঠিক ক্র্যাশ হবে will একই ভাবে. strchrসম্পর্কিত চাচাত ভাইয়ের জন্য দিতো strlen

কোনও lengthযুক্তি ছাড়াই , আপনাকে কখন উচ্চ গতির অ্যালগরিদম থেকে সরিয়ে আনা উচিত এবং বাই বাই বাই বাইট অ্যালগরিদমে ফিরে যেতে হবে তা বলার উপায় নেই। আরও বেশি সম্ভবত "বাগ" পড়তে হবে "বরাদ্দের আকারের অতীত" পড়া, যা প্রযুক্তিগতভাবে undefined behaviorবিভিন্ন সি ভাষার মান অনুসারে ফলাফল দেয় এবং এর মতো কোনও কিছু দ্বারা ত্রুটি হিসাবে চিহ্নিত করা হবে valgrind

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

এই উত্তরের কোডটি হ'ল একটি সিপিইউ শব্দের আকার আকারের প্রথম বাইটটি যদি দ্রুত সিপিইউর ctzমতো দ্রুত নির্দেশের মতো দ্রুত হয় তবে এটি প্রথম বাইটটি সন্ধান করতে সক্ষম হওয়ার জন্য একটি কার্নেল । এটি কেবল সঠিকভাবে প্রান্তিকৃত প্রাকৃতিক সীমানা বা কিছু কিছু আবদ্ধের উপর নির্ভর করে কিনা তা নিশ্চিত করার মতো বিষয় যুক্ত করা তুচ্ছ বিষয় lengthযা আপনাকে উচ্চ গতির কার্নেল থেকে স্লো আউট করার এবং ধীর বাই বাই বাই পরীক্ষা করতে দেয় to

ওপি মন্তব্যগুলিতে আরও বলেছে:

আপনার সিটিজেড অপ্টিমাইজেশনের ক্ষেত্রে এটি কেবল ও (1) লেজ অপারেশনের জন্য একটি পার্থক্য করে। এটি ছোট স্ট্রিংগুলির সাথে কর্মক্ষমতা উন্নত করতে পারে (উদাহরণস্বরূপ strchr("abc", 'a');তবে অবশ্যই কোনও বড় আকারের স্ট্রিং সহ নয়)।

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


"দৈর্ঘ্যের 1 সূঁচের জন্য, ব্যবহার করুন strchr" "- আপনি দ্রুততম স্ট্রিংয়ের অনুসন্ধান অ্যালগরিদম (গুলি) চেয়েছিলেন। দৈর্ঘ্যের 1 টির একটি স্ট্রিং সন্ধান করা কেবল একটি বিশেষ ক্ষেত্রে, এটি অনুকূলিতও করা যেতে পারে। আপনি যদি strchrউপরের মতো কিছু দিয়ে 1 ( ) দৈর্ঘ্যের সাবস্ট্রিংগুলির জন্য আপনার বর্তমান বিশেষ কেস কোডটি অদলবদল করেন তবে জিনিসগুলি (সম্ভবত, কীভাবে strchrপ্রয়োগ করা হয় তার উপর নির্ভর করে ) আরও দ্রুত এগিয়ে যাবে। উপরের অ্যালগরিদম একটি সাধারন নিষ্পাপ strchrবাস্তবায়নের চেয়ে প্রায় 3x গতিযুক্ত ।
জন

2
ওপি বলেছিল যে স্ট্রিংটি সঠিকভাবে বাতিল হয়ে গেছে, সুতরাং আপনার আলোচনাটি char bytes[1] = {0x55};অপ্রাসঙ্গিক। খুব প্রাসঙ্গিক এটি সম্পর্কিত কোনও শব্দের পাঠ্য অ্যালগরিদম যা আপনার আগে দৈর্ঘ্য জানেন না তার ক্ষেত্রে এটি সত্য।
শেঠ রবার্টসন

1
সমস্যাটি আমি উদ্ধৃত সংস্করণে প্রযোজ্য না কারণ আপনি এটি কেবল প্রান্তিক পয়েন্টারগুলিতে ব্যবহার করেন - কমপক্ষে সঠিক প্রয়োগগুলি এটিই করে।
আর .. গিটিহাব বন্ধ করুন ICE

2
@ আর, এর "সংযুক্ত পয়েন্টার" এর সাথে কোনও সম্পর্ক নেই। হাইপোথিটিক্যালি, যদি আপনার কাছে এমন কোনও স্থাপত্য থাকে যা বাইট লেভেল গ্রানুলারিটির সাহায্যে ভিএম সুরক্ষাকে সমর্থন করে এবং প্রতিটি mallocবরাদ্দ দু'পাশে "পর্যাপ্ত প্যাডড" হয়ে থাকে এবং ভিএম সিস্টেম সেই বরাদ্দের জন্য বাইট দানাদার সুরক্ষা প্রয়োগ করে .... পয়েন্টারটি সারিবদ্ধ হয় কিনা ( তুচ্ছ 32-বিট intপ্রাকৃতিক সারিবদ্ধতা ধরে নেওয়া) মোটামুটি- এখনও যে এটি সারিবদ্ধ পড়ার জন্য বরাদ্দের আকারটি পড়তে পারা সম্ভব। কোন বরাদ্দ আকার গত পঠিত undefined behavior
জন

5
@ জোহনে: মন্তব্য করতে +1। ধারণাগতভাবে আপনি ঠিক বলেছেন, তবে বাস্তবতাটি হ'ল বাইট-গ্রানুলারিটি সুরক্ষাগুলি সংরক্ষণ করতে এবং প্রয়োগ করতে উভয়ই এত ব্যয়বহুল যে এগুলি কখনও নেই এবং কখনও থাকবে না। যদি আপনি জানেন যে অন্তর্নিহিত স্টোরেজটি পৃষ্ঠা-গ্রানুলারিটি ম্যাপিংগুলির সমতুল্য থেকে প্রাপ্ত হয় mmapতবে প্রান্তিককরণ যথেষ্ট।
আর .. গীটহাব বন্ধ করুন ICE

3

কেবলমাত্র "দ্রুততম স্টারস্টার" অনুসন্ধান করুন এবং যদি আপনি আগ্রহের কিছু দেখেন তবে আমাকে জিজ্ঞাসা করুন।

আমার দৃষ্টিতে আপনি নিজের উপর অনেকগুলি বিধিনিষেধ আরোপ করেন (হ্যাঁ আমরা সকলেই সর্বোচ্চ সন্ধানকারীতে সাব-লিনিয়ার লিনিয়ার চাই) তবে এটি পদক্ষেপ নিতে সত্যিকারের প্রোগ্রামার লাগবে, ততক্ষণ পর্যন্ত আমি মনে করি যে হ্যাশ পদ্ধতির কেবল একটি নিফটি-লিম্বো সমাধান ( সংক্ষিপ্ত ২.১6 প্যাটার্নের জন্য বিএনডিএম দ্বারা ভালভাবে জোরদার করা হয়েছে)।

শুধু একটি দ্রুত উদাহরণ:

যেমন এক-লাইন STRING (206908949bytes) মধ্যে প্যাটার্ন (32bytes) জন্য অনুসন্ধান করার সময় ... এড়িয়ে ক্ষমতা সম্পন্ন (বড়-ভালো): 3041%, 6801754 ছেড়ে যাওয়া / পুনরাবৃত্তিও Railgun_Quadruplet_7Hasherezade_hits / Railgun_Quadruplet_7Hasherezade_clocks: 0/58 Railgun_Quadruplet_7Hasherezade পারফরমেন্স: 3483KB / ঘড়ি

1554%, 13307181 ছেড়ে যাওয়া / পুনরাবৃত্তিও Boyer_Moore_Flensburg_hits / Boyer_Moore_Flensburg_clocks: 0/83 যেমন এক-লাইন ... এড়িয়ে ক্ষমতা সম্পন্ন (বড়-ভালো) STRING (206908949bytes) মধ্যে প্যাটার্ন (32bytes) জন্য অনুসন্ধান করার সময় Boyer_Moore_Flensburg পারফরমেন্স: 2434KB / ঘড়ি

স্ট্রিং (206908949bytes) হিসাবে প্যাটার্ন (32 বাইটস) জন্য এক-লাইন হিসাবে অনুসন্ধান করা হচ্ছে ... পারফরম্যান্স (আরও উন্নততর) এড়িয়ে যান: 129%, 160239051 স্কিপ / পুনরাবৃত্তি দ্বি-ওয়ে_হিট / দ্বি-দ্বি_ক্লকস: 0/816 দুই -Way পারফরমেন্স: 247KB / ঘড়ি

Sanmayce,
শুভেচ্ছা সহ


3

আপনার প্রশ্নে আপনি যে দ্বি-ওয়ে অ্যালগরিদম উল্লেখ করেছেন (যা উপায় দ্বারা অবিশ্বাস্য!) একযোগে মাল্টিবাইট শব্দগুলিতে দক্ষতার সাথে কাজ করার জন্য সম্প্রতি উন্নত করা হয়েছে: অনুকূল প্যাকযুক্ত স্ট্রিং ম্যাচিং

আমি পুরো কাগজটি পড়িনি, তবে দেখে মনে হচ্ছে তারা তাদের সময় জটিলতার দাবিতে ও (1) উদাহরণস্বরূপ কয়েকটি নতুন, বিশেষ সিপিইউ নির্দেশিকায় (যেমন এসএসই ৪.২ অন্তর্ভুক্ত রয়েছে) উপর নির্ভর করে, যদিও যদি তারা উপলব্ধ না হয় তবে তারা পারে ও (লগ লগ ডাব্লু) সময়কে ডাব্লু-বিট শব্দের জন্য অনুকরণ করুন যা খুব খারাপ শোনাচ্ছে না।


3

আপনি প্রয়োগ করতে পারেন, বলুন, 4 টি বিভিন্ন অ্যালগোরিদম। প্রতি এম মিনিটে (অভিজ্ঞতা দ্বারা নির্ধারিত হওয়ার জন্য) বর্তমান আসল ডেটাগুলিতে সমস্ত 4 চালান। এন রান (এছাড়াও টিবিডি) উপর পরিসংখ্যান একত্রিত করুন। তারপরে পরবর্তী এম মিনিটের জন্য কেবল বিজয়ী ব্যবহার করুন।

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


3

আমি সম্প্রতি উপলভ্য বিভিন্ন এলগোসের কর্মক্ষমতা পরিমাপ করার জন্য একটি দুর্দান্ত সরঞ্জাম আবিষ্কার করেছি: http://www.dmi.unict.it/~faro/smart/index.php

আপনি এটি দরকারী মনে হতে পারে। এছাড়াও, যদি আমাকে সাবস্ট্রিং অনুসন্ধান অ্যালগরিদমের তাত্ক্ষণিক কল নিতে হয় তবে আমি নুথ-মরিস-প্র্যাটের সাথে যেতে পারি go


লিঙ্কের জন্য ধন্যবাদ। পরীক্ষাগুলি সাধারণ-ক্ষেত্রে সময়সাপেক্ষে আকর্ষণীয় দেখায় তবে সবচেয়ে খারাপ সময় ধরা যায় না।
আর .. গিটহাব বন্ধ করুন আইসিসি

2

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

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


0

এটি পরম সেরা কিনা তা আমি জানি না, তবে বয়ের-মুরের সাথে আমার ভাল অভিজ্ঞতা হয়েছে ।


আপনি কি বায়ার-মুরের খারাপ শিফট টেবিলটিকে দ্বি-ওয়েয়ের সাথে একত্রিত করার কোনও উপায় জানেন? লম্বা সুই (> 32 বাইট) এর জন্য গ্লিব্যাক এর বৈকল্পিক করে তবে কেবল শেষ বাইটটি পরীক্ষা করে। সমস্যাটি হ'ল টু-ওয়েয়ের সূচির বাম থেকে ডানদিকে ডান অংশটি অনুসন্ধান করা দরকার, অন্যদিকে ডান থেকে বামে অনুসন্ধানের সময় বয়ের-মুরের খারাপ স্থানান্তর সবচেয়ে কার্যকর। আমি এটি টু-ওয়েতে বাম-থেকে-ডান দিয়ে ব্যবহার করার চেষ্টা করেছি (শিফ্ট টেবিল বা স্বাভাবিক দ্বি-মুখের ডান অর্ধে মিল যাই না, যাহা লম্বা হয়) তবে আমি বেশিরভাগ ক্ষেত্রে সাধারণ দ্বিপথের তুলনায় 5-10% ধীর গতি পেয়েছি এবং এটির কার্যক্ষমতা উন্নত হওয়ার কোনও ক্ষেত্রে খুঁজে পাওয়া যায়নি।
আর .. গীটহাব বন্ধ করুন ICE

0

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


0

এস ই ফারো এবং ওএম কুলেকি-র দ্রুততম বর্তমানে ইপিএসএম। Http://www.dmi.unict.it/~faro/smart/algorithms.php?algorithm=EPSM&code=epsm দেখুন

"এক্স্যাক্ট প্যাকড স্ট্রিং ম্যাচিং" সিমড এসএসই 4.2 (x86_64 এবং আড়াল 64) এর জন্য অনুকূলিত। এটি স্থিতিশীল এবং সমস্ত আকারের সেরা সম্পাদন করে।

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

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