একটি আশাবাদী দ্রুত দ্বিদ্বিতীয় indexOf
/ lastIndexOf
বিকল্প
2015
যদিও নতুন পদ্ধতিটি অন্তর্ভুক্ত রয়েছে এটি খুব দুর্দান্ত, সমর্থনটি বর্তমানে আপাতত শূন্য।
এটি অনেক দিন যে আমি স্লো ইন্ডেক্সঅফ / লাস্ট ইন্ডেক্সঅফ ফাংশনগুলি প্রতিস্থাপনের উপায় নিয়ে ভাবছিলাম।
শীর্ষস্থানীয় উত্তরগুলির দিকে তাকিয়ে ইতিমধ্যে একটি পারফর্মেন্ট উপায় খুঁজে পাওয়া গেছে। তাদের কাছ থেকে আমি contains
@ দামির জেকিক দ্বারা পোস্ট করা ফাংশনটি বেছে নিয়েছি যা দ্রুত হওয়া উচিত। তবে এটি আরও বলেছে যে মানদণ্ডগুলি ২০০৮ সালের এবং তাই পুরানো।
আমিও while
বেশি পছন্দ করি for
, তবে একটি নির্দিষ্ট কারণে নয়, আমি ফাংশনটি লুপ দিয়ে লিখে শেষ করেছি। এটি একটি দিয়েও করা যেতে পারেwhile --
।
আমি কৌতূহল ছিলাম যদি পুনরাবৃত্তিটি যদি খুব ধীর হয় তবে এটি করার সময় যদি আমি অ্যারের উভয় দিকটি পরীক্ষা করি। স্পষ্টত না, এবং তাই এই ফাংশনটি শীর্ষ ভোটদানকারীদের চেয়ে প্রায় দ্বিগুণ দ্রুত। স্পষ্টতই এটি দেশীয়ের চেয়েও দ্রুত। এটি আসল বিশ্বের পরিবেশে, যেখানে আপনি কখনই জানেন না যে আপনি যে মানটি অনুসন্ধান করছেন তা শুরুতে বা অ্যারের শেষে রয়েছে কিনা you
যখন আপনি জানেন যে আপনি কেবলমাত্র একটি মান দিয়ে একটি অ্যারে ঠেলাঠেলি করেছেন, সর্বশেষ সমাধানটি রয়ে গেছে সর্বশেষতম সমাধান, তবে যদি আপনাকে বড় অ্যারে দিয়ে ভ্রমণ করতে হয় এবং ফলাফল সর্বত্রই হতে পারে তবে জিনিসগুলি দ্রুততর করার জন্য এটি একটি কঠিন সমাধান হতে পারে।
দ্বি নির্দেশমূলক সূচকআফ / সর্বশেষতম সূচক
function bidirectionalIndexOf(a, b, c, d, e){
for(c=a.length,d=c*1; c--; ){
if(a[c]==b) return c; //or this[c]===b
if(a[e=d-1-c]==b) return e; //or a[e=d-1-c]===b
}
return -1
}
//Usage
bidirectionalIndexOf(array,'value');
কর্মক্ষমতা পরীক্ষা
http://jsperf.com/bidirectionalindexof
পরীক্ষা হিসাবে আমি 100k এন্ট্রি সহ একটি অ্যারে তৈরি করেছি।
তিনটি প্রশ্ন: শুরুতে, মাঝখানে এবং অ্যারের শেষে।
আমি আশা করি আপনিও এই আকর্ষণীয় খুঁজে পেতে এবং পারফরম্যান্স পরীক্ষা।
নোট: আপনি দেখতে পারেন আমি সামান্য পরিবর্তিত contains
(তাই মূলত ফাংশন indexOf মধ্যে & lastIndexOf আউটপুট প্রতিফলিত করার true
সঙ্গে index
এবং false
সঙ্গে -1
)। এটির ক্ষতি করা উচিত নয়।
অ্যারের প্রোটোটাইপ বৈকল্পিক
Object.defineProperty(Array.prototype,'bidirectionalIndexOf',{value:function(b,c,d,e){
for(c=this.length,d=c*1; c--; ){
if(this[c]==b) return c; //or this[c]===b
if(this[e=d-1-c] == b) return e; //or this[e=d-1-c]===b
}
return -1
},writable:false, enumerable:false});
// Usage
array.bidirectionalIndexOf('value');
ফাংশনটি সহজেই সত্য বা মিথ্যা বা এমনকি বস্তু, স্ট্রিং বা যা কিছু হোক না কেন ফিরে আসতে পারে।
এবং এখানে while
রূপটি:
function bidirectionalIndexOf(a, b, c, d){
c=a.length; d=c-1;
while(c--){
if(b===a[c]) return c;
if(b===a[d-c]) return d-c;
}
return c
}
// Usage
bidirectionalIndexOf(array,'value');
এটা কিভাবে সম্ভব?
আমি মনে করি যে অ্যারেতে প্রতিফলিত সূচকটি পাওয়া সহজ গণনা এত সহজ যে এটি আসল লুপ পুনরাবৃত্তির চেয়ে দ্বিগুণ দ্রুত faster
এখানে পুনরাবৃত্তি প্রতি তিনটি চেক করা একটি জটিল উদাহরণ রয়েছে, তবে এটি কেবলমাত্র দীর্ঘতর গণনা দ্বারা সম্ভব যা কোডের মন্দার কারণ হয়।
http://jsperf.com/bidirectionalindexof/2