Sıralı bir JavaScript dizisi var ve ortaya çıkan dizi sıralanmış kalır diziye bir öğe daha eklemek istiyorum. Kesinlikle basit bir quicksort tarzı ekleme işlevi uygulayabilir:
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));
[UYARI] dizinin başına eklenmeye çalışılırken bu kodda bir hata vardır, örn. insert(2, [3, 7 ,9]
) Yanlış [3, 2, 7, 9] üretir.
Ancak, Array.sort işlevinin uygulamalarının bunu benim için ve yerel olarak yapabileceğini fark ettim:
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));
İkinci uygulamayı ikinci uygulamadan seçmek için iyi bir neden var mı?
Düzenleme : Genel durumda, bir O (log (n)) ekleme (ilk örnekte uygulandığı gibi) genel bir sıralama algoritmasından daha hızlı olacağını unutmayın; ancak bu özellikle JavaScript için geçerli değildir. Bunu not et:
- Birkaç ekleme algoritması için en iyi durum O (n) 'dir, bu hala O (log (n))' den hala önemli ölçüde farklıdır, ancak aşağıda belirtildiği gibi O (n log (n)) kadar kötü değildir. Kullanılan belirli sıralama algoritmasına gelir ( Javascript Array.sort uygulamasına bakın? )
- JavaScript'teki sıralama yöntemi yerel bir işlevdir, bu nedenle potansiyel olarak büyük faydalar - büyük bir katsayılı O (log (n)), makul boyutlardaki veri setleri için O (n) 'den çok daha kötü olabilir.
splice()
(örneğin 1. örneğiniz) zaten O (n) 'dir. Tüm dizinin dahili olarak yeni bir kopyasını oluşturmasa bile, öğe 0 konumuna eklenecekse, potansiyel olarak tüm n öğeyi 1 konuma geri çevirmek zorunda olabilir. Belki de hızlıdır çünkü yerel bir işlevdir ve sabit düşük, ama yine de O (n).
parseInt
kullanmayın Math.floor
. Math.floor
daha hızlıdır parseInt
: jsperf.com/test-parseint-and-math-floor