Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 17.04.2015, 23:15
Аватар для Momon
Аспирант
Отправить личное сообщение для Momon Посмотреть профиль Найти все сообщения от Momon
 
Регистрация: 02.12.2014
Сообщений: 72

Поиск подстроки в большом массиве строк javascript
Есть большой массив строк состоящий из 100000 элементов, каждый элемент представляет собой строку длиной около 20 символов. Как реализовать наиболее быстрый поиск подстроки в таком большом массиве? Необходимо найти все подходящие элементы. Сейчас использую простой цикл for и поочередно сравниваю каждый элемент. Подтормаживает. Может быть есть какое нибудь хитрое решение?

for (var i = 0; i < arr.length; i++) {
     var str = arr[i];
     if (reg.test(str)) {
         // добавляю в массив с результатами ...
     }
}

Последний раз редактировалось Momon, 17.04.2015 в 23:20.
Ответить с цитированием
  #2 (permalink)  
Старый 17.04.2015, 23:30
Кандидат Javascript-наук
Посмотреть профиль Найти все сообщения от theKingOfJava
 
Регистрация: 31.03.2015
Сообщений: 113

Momon,
первое что приходит в голову - убери присваивание
for (var i = 0; i < arr.length; i++) {  
     if (reg.test(arr[i])) {
         // добавляю в массив с результатами ...
     }
}

что еще -- хз, вроде for достаточно шустрый. Попробуй переписать на while. Тормозить может также и регулярка, выложи регулярку сюда.
Ответить с цитированием
  #3 (permalink)  
Старый 17.04.2015, 23:38
Аватар для MallSerg
Профессор
Отправить личное сообщение для MallSerg Посмотреть профиль Найти все сообщения от MallSerg
 
Регистрация: 07.03.2011
Сообщений: 1,127

1. Сортировка
2. Нечеткий поиск
3. Индексирование
4. Хеширование
+
Гугл

Задача мутно описана но думаю что в твоем случае хватит не четкого поиска
Ответить с цитированием
  #4 (permalink)  
Старый 17.04.2015, 23:43
Кандидат Javascript-наук
Посмотреть профиль Найти все сообщения от theKingOfJava
 
Регистрация: 31.03.2015
Сообщений: 113

Сообщение от MallSerg
Сортировка
А сортировка тут причем?
Сообщение от MallSerg
Нечеткий поиск
Это че такое?
Ответить с цитированием
  #5 (permalink)  
Старый 18.04.2015, 00:55
Кандидат Javascript-наук
Посмотреть профиль Найти все сообщения от theKingOfJava
 
Регистрация: 31.03.2015
Сообщений: 113

Кстати, провел небольшой эксперимент, возможно, вариант решения твоей проблемы
str=fs.readFileSync("tmp", "ascii")
arr=str.split(" ")
console.log("length of string: "+str.length, "length of array: "+arr.length )

re=/\bfoo[^ ]+/g
results1=[]
results2=[]

console.time("cycle")
 for(var i=0; i<arr.length; i++) if(re.test(arr[i])) results1.push(arr[i])
console.timeEnd("cycle")


console.time("match")
 results2=str.match(re)
console.timeEnd("match")


//>>>> length of string: 7598519 length of array: 1396503
//>>>> cycle: 184ms
//>>>> match: 11ms
Ответить с цитированием
  #6 (permalink)  
Старый 18.04.2015, 01:15
Кандидат Javascript-наук
Посмотреть профиль Найти все сообщения от theKingOfJava
 
Регистрация: 31.03.2015
Сообщений: 113

Сообщение от MallSerg
Нечеткий поиск
посмотрел щас про него, и напрашивается вопрос: зачем ты употребляешь слова, значение которых не знаешь ит не понимаешь? У нечеткого поиска совершенно другие задачи. Основное его назначение -- поиск похожих слов. Это не может положительно повлиять на производительность обычного поиска, естественно. Про сортировку -- тоже не совсем понятно. Насчет кэширования и индексации, я бы сказал, спасибо кэп, конечно, но никто не говорил, что поиск происходит многократно на одних и тех же данных. Ну, насчет гугла, пожалуй, спорить не буду.
Ответить с цитированием
  #7 (permalink)  
Старый 18.04.2015, 05:18
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

В цикле с большим количеством элементов

var i = 0, k = arr.length; i < k; i++

так как при i < arr.length;, arr.length будет просчитываться каждый раз заново при каждой итерации.
Ответить с цитированием
  #8 (permalink)  
Старый 18.04.2015, 05:31
Кандидат Javascript-наук
Посмотреть профиль Найти все сообщения от theKingOfJava
 
Регистрация: 31.03.2015
Сообщений: 113

laimas,
тогда уж, по вашей логике вот так
k = arr.length
var i = 0,  i < k; i++

за цикл выносим. Но вряд ли это может дать прирост существенный, оптимизатор компилятора сам это делает обычно.
Сообщение от laimas
просчитываться каждый раз
Там все "просчитывание" заключается в проверке, не изменилось ли свойство length массива. Или ты думаешь, что каждый раз все элементы заново пересчитываются? Поэтому
Сообщение от laimas
с большим количеством элементов
Без разницы. К началу исполнения цикла длина массива уже известна.
Ответить с цитированием
  #9 (permalink)  
Старый 18.04.2015, 05:57
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Ну да, это с чего она вдруг известна?

Или ты думаешь, что каждый раз все элементы заново пересчитываются?

Я не думаю, это выражение i < arr.length обязывает получать количество элементов массива.

Выполните такое же на РНР, используя тики, сравните.
Ответить с цитированием
  #10 (permalink)  
Старый 18.04.2015, 06:15
Кандидат Javascript-наук
Посмотреть профиль Найти все сообщения от theKingOfJava
 
Регистрация: 31.03.2015
Сообщений: 113

Сообщение от laimas
Ну да, это с чего она вдруг известна?
потому что при любой деструктивной операции над массивом, св-во length автоматически обновляется.
Сообщение от laimas
обязывает получать количество элементов массива.
см выше
Сообщение от laimas
Выполните такое же на РНР, используя тики, сравните.
я выполнил на V8 и сравнил время. Практически, идентично.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск в массиве, частичное совпадение фонарик Общие вопросы Javascript 25 04.04.2013 07:43
Поиск вхождения подстроки в массиве строк. FINoM Общие вопросы Javascript 8 27.02.2011 11:53
Последние книги по JavaScript! monolithed Учебные материалы 7 26.10.2010 19:40
Выдвет ошибку JavaScript Ромио Opera, Safari и др. 4 21.10.2010 20:34
Поиск в массиве через JavaScript Noran Общие вопросы Javascript 0 10.08.2008 17:31