Быстрый поиск объектов
Есть такая задача:
Множество объектов. Каждый объект имеет числовой ключ (вещественный). Нужна функция, которая позволяет определить по заданному числовому значению список объектов, ключ которых больше/меньше заданного числа. Самое простое, что приходит в голову, это, конечно, взять массив объектов и отсортировать по ключу. Тогда очень просто найти нужные объекты. Но дело в том, что объекты добавляются не все сразу, а по одному. Т.е. при вставке нового объекта нужно изменять массив. А это операция вроде не самая быстрая (по крайней мере для того же С++). Ещё есть идея с бинарными деревьями. Но прежде чем копать, рушеил поинтересоваться у спецов javascript: может есть какие-то библиотеки для решения такой задачи? Или может вставка нового элемента в середину массива на javascript операция быстрая? P.S. Количество объектов теоретически от 0 до много. :) Это решение буду прикручивать к google и яндекс map. И каждый объект - это метка на карте. К примеру пользователь может добавить на карту ВСЕ дома города Москвы. С учетом наличия около 4500 улиц количество домов может быть весьма приличным. |
Цитата:
|
Цитата:
Хотя, на таких объемах при добавлении по одному объекту наверное всё-равно будет тормозить. Так то по-любому нужно будет делать пакетное добавление. |
Как показали тесты никаких хитрых алгоритмов не требуется, так как скорость прогонки проверки в цикле достаточно большая. Такой код:
//------------------------------------ id = "init"; console.time(id); var arr = new Array(100000); for(var i=0;i<arr.length;i++) arr[i] = Math.random()*100; console.timeEnd(id); //------------------------------------ id = "if/else"; console.time(id); for(var i=0;i<arr.length;i++) if(arr[i]>0) // for(var j=0;j<10;j++) arr[i] += 1; console.timeEnd(id); Время выполнения: Код:
init: 80ms |
Цитата:
|
Решение найдено. Никакой вставки вообще делать не буду, так как простой перебор дает приличную скорость. При этом скорость добавления вообще супер-пупер-быстрая (просто push в конец массива)
Хотя, был удивлен тем, что конструкция вида for(var i=0;i<arr.length;i++) работает быстрее for(var i in arr) Почему-то всегда считал, что in быстрее цикла работает. Но при тесте в FF получил 50ms против 125ms |
Это в принципе объяснимо, for-in перебирает все свойства объекта (у массивов много других свойств, в том числе методы) и проверяет у них свойство enumerable, в то время как for сразу берет только нужные. Ну это чисто интуитивно.
|
...
|
Часовой пояс GMT +3, время: 02:08. |