मेरे पास एक क्रमबद्ध जावास्क्रिप्ट सरणी है, और एक और आइटम को सरणी में सम्मिलित करना चाहते हैं, जिसके परिणामस्वरूप सरणी क्रमबद्ध रहती है। मैं निश्चित रूप से एक सरल क्विक-स्टाइल प्रविष्टि फ़ंक्शन लागू कर सकता हूं:
var array = [1,2,3,4,5,6,7,8,9];
var element = 3.5;
function insert(element, array) {
array.splice(locationOf(element, array) + 1, 0, element);
return array;
}
function locationOf(element, array, start, end) {
start = start || 0;
end = end || array.length;
var pivot = parseInt(start + (end - start) / 2, 10);
if (end-start <= 1 || array[pivot] === element) return pivot;
if (array[pivot] < element) {
return locationOf(element, array, pivot, end);
} else {
return locationOf(element, array, start, pivot);
}
}
console.log(insert(element, array));
[चेतावनी] इस कोड में एक बग है, जब सरणी की शुरुआत में सम्मिलित करने की कोशिश कर रहा है, जैसे insert(2, [3, 7 ,9]
) गलत [३, २,], ९] पैदा करता है।
हालाँकि, मैंने देखा कि Array.sort फ़ंक्शन के कार्यान्वयन संभवतः मेरे लिए और मूल रूप से ऐसा कर सकते हैं:
var array = [1,2,3,4,5,6,7,8,9];
var element = 3.5;
function insert(element, array) {
array.push(element);
array.sort(function(a, b) {
return a - b;
});
return array;
}
console.log(insert(element, array));
क्या दूसरे पर पहला कार्यान्वयन चुनने का एक अच्छा कारण है?
संपादित करें : ध्यान दें कि सामान्य मामले के लिए, एक O (लॉग (n)) सम्मिलन (जैसा कि पहले उदाहरण में लागू किया गया है) एक सामान्य छँटाई एल्गोरिथ्म से तेज़ होगा; हालांकि यह विशेष रूप से जावास्क्रिप्ट के लिए जरूरी नहीं है। ध्यान दें कि:
- कई सम्मिलन एल्गोरिदम के लिए सर्वश्रेष्ठ मामला ओ (एन) है, जो अभी भी ओ (लॉग (एन)) से काफी अलग है, लेकिन नीचे दिए गए अनुसार ओ (एन लॉग (एन)) के रूप में काफी बुरा नहीं है। यह इस्तेमाल किए जाने वाले विशेष छँटाई एल्गोरिथ्म के लिए नीचे आता है ( जावास्क्रिप्ट Array.sort कार्यान्वयन देखें ? )
- जावास्क्रिप्ट में सॉर्ट विधि एक मूल कार्य है, इसलिए संभावित रूप से विशाल लाभ का एहसास - ओ (लॉग (एन)) एक विशाल गुणांक के साथ यथोचित आकार के डेटा सेट के लिए ओ (एन) की तुलना में बहुत खराब हो सकता है।
splice()
(जैसे आपका पहला उदाहरण) पहले से ही ओ (एन) है। यहां तक कि अगर यह आंतरिक रूप से पूरे सरणी की एक नई प्रतिलिपि नहीं बनाता है, तो संभावित रूप से सभी n आइटम को 1 स्थिति में वापस करना होगा यदि तत्व को स्थिति में डाला जाना है 0. शायद यह तेज़ है क्योंकि यह एक मूल कार्य और स्थिर है कम है, लेकिन फिर भी यह ओ (एन) है।
parseInt
उपयोग Math.floor
के बजाय। Math.floor
इससे बहुत तेज़ है parseInt
: jsperf.com/test-parseint-and-math-floor