Nie brakuje niczego. To trochę zaskakujące, prawda?
Google Closure biblioteka ma funkcje pomocnicze wewnątrz binarySearch (jestem pewien, że są inne):
http://docs.closure-library.googlecode.com/git/namespace_goog_array.html
będzie go używać tak jak chcesz sobie wyobrazić:
var myArray = getPetArray();
goog.array.binarySearch(myArray, 'fido', function(pet) { return pet.name; });
Jeśli nie chcesz przeciągać kolejnej biblioteki, źródło jest krótkie i dostępne:
http://docs.closure-library.googlecode.com/git/local_closure_goog_array_array.js.source.html#line989
wyciąć i wkleić tutaj ważną rolę w przypadku linki zmiany - Wystarczy pamiętać, aby dać kredyt Google:
goog.array.binarySearch = function(arr, target, opt_compareFn) {
return goog.array.binarySearch_(arr,
opt_compareFn || goog.array.defaultCompare, false /* isEvaluator */,
target);
};
goog.array.binarySearch_ = function(arr, compareFn, isEvaluator, opt_target,
opt_selfObj) {
var left = 0; // inclusive
var right = arr.length; // exclusive
var found;
while (left < right) {
var middle = (left + right) >> 1;
var compareResult;
if (isEvaluator) {
compareResult = compareFn.call(opt_selfObj, arr[middle], middle, arr);
} else {
compareResult = compareFn(opt_target, arr[middle]);
}
if (compareResult > 0) {
left = middle + 1;
} else {
right = middle;
// We are looking for the lowest index so we can't return immediately.
found = !compareResult;
}
}
// left is the index if found, or the insertion point otherwise.
// ~left is a shorthand for -left - 1.
return found ? left : ~left;
};
goog.array.defaultCompare = function(a, b) {
return a > b ? 1 : a < b ? -1 : 0;
};
ciekawy: co robisz, że wyszukiwanie binarne odróżnia tractable i nie do przyjęcia? Jak duża jest twoja tablica i co robisz? –
Wyszukiwanie binarne musi zostać wykonane na posortowanej tablicy. Ponieważ masz wiele obiektów, najprawdopodobniej będziesz potrzebować niestandardowego rozwiązania. –
Sama tablica ma około 1000 elementów, ale muszę znaleźć w niej wiele elementów. Zatem liniowe przeszukiwanie tej tablicy w pętli może nie być bardzo wydajne. – Naresh