Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 30.10.2020, 09:54
Аспирант
Отправить личное сообщение для Himmelin Посмотреть профиль Найти все сообщения от Himmelin
 
Регистрация: 14.01.2019
Сообщений: 31

Раздельный перебор массива
Недавно столкнулся с задачей выборки одинаковых значений из массива с большим количеством элементов (больше тысячи). Задача была перебрать массив (например, ["green", "yellow", "blue", "green", "purple", "green"]) с помощью map и достать из него все green. Но через map довольно медленно. Есть какие-то более быстрые способы? Я слышал про какой-то метод располовинивания массива с большим количеством элементов, но гугл про это ничего толком не выдал
Ответить с цитированием
  #2 (permalink)  
Старый 30.10.2020, 10:22
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,750

Сообщение от Himmelin
с помощью map
С помощью функции map? А при чем тут она при поиске? Есть функция .filter

Сообщение от Himmelin
с большим количеством элементов (больше тысячи).
Задачи конечно разные бывают, но на мой взгляд десятки тысяч это фигня.
Сообщение от Himmelin
Я слышал про какой-то метод располовинивания массива
Ну есть метод поиска делением пополам, но он применяется к отсортированным массивам.
Ответить с цитированием
  #3 (permalink)  
Старый 30.10.2020, 10:31
Аспирант
Отправить личное сообщение для Himmelin Посмотреть профиль Найти все сообщения от Himmelin
 
Регистрация: 14.01.2019
Сообщений: 31

Есть какая-нибудь ссылка на статью про метод деления пополам?
Ответить с цитированием
  #4 (permalink)  
Старый 31.10.2020, 01:07
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,794

Бенчмарк производительности методов перебора: https://jsben.ch/6S3sP (у меня всегда разный результат).

Сообщение от voraa
Ну есть метод поиска делением пополам, но он применяется к отсортированным массивам.
Вы про бинарный поиск? Он разве не неприменим в описанной выше задаче?
Ответить с цитированием
  #5 (permalink)  
Старый 31.10.2020, 10:38
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

Сообщение от Nexus
Вы про бинарный поиск? Он разве не неприменим в описанной выше задаче?
Вполне себе применим.
Найти бинарным поиском первое попавшееся значение, потом от него пробежаться вправо и влево, пособирать все такие же.

Если данная операция будет выполняться многократно, то имеет смысл на старте создать карту (значение -> массив) для всех значений.
Ответить с цитированием
  #6 (permalink)  
Старый 31.10.2020, 10:45
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,750

Сообщение от Nexus
Вы про бинарный поиск? Он разве не неприменим в описанной выше задаче?
Сообщение от Alexandroppolus
Вполне себе применим.
Найти бинарным поиском первое попавшееся значение, потом от него пробежаться вправо и влево, пособирать все такие же.
Я не вижу тут отсортированного массива.
Ответить с цитированием
  #7 (permalink)  
Старый 31.10.2020, 13:12
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,794

Сообщение от Alexandroppolus
Найти бинарным поиском первое попавшееся значение, потом от него пробежаться вправо и влево, пособирать все такие же.
И в чем его преимущество над обычным перебором?

Я возможно неправильно выразился. Применить то его можно, вот только смысл в этом какой?
У автора, насколько я понял, стоит задача максимально быстро найти в массиве все значения равные определенной строке. Разве бинарный поиск тут не будет медленнее, чем обычный перебор?
Ответить с цитированием
  #8 (permalink)  
Старый 31.10.2020, 13:32
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

Сообщение от Nexus
Разве бинарный поиск тут не будет медленнее, чем обычный перебор?
Если массив большой и отсортированный, а различных значений много, то да, будет быстрее. Если несортированный, и нужно выполнить один раз, то разумеется обычный поиск. А если многократно потребуется искать, то лучше сделать карту.

Автор не уточнил эти моменты, к сожалению.
Ответить с цитированием
  #9 (permalink)  
Старый 31.10.2020, 13:52
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,750

Сообщение от Nexus
Разве бинарный поиск тут не будет медленнее, чем обычный перебор?
Если массив отсортирован, то конечно бинарный быстрее.
log2 (N) сравнений.
На 1000 элементов 10 сравнений.
А если неотсортирован, то ничего, кроме перебора не поможет.
Сообщение от Alexandroppolus
А если многократно потребуется искать, то лучше сделать карту.
Отсортировать по возможности.
Ответить с цитированием
  #10 (permalink)  
Старый 31.10.2020, 14:15
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,794

Сообщение от Alexandroppolus
Если массив большой и отсортированный
Сообщение от voraa
Если массив отсортирован
ТС привел пример массива. Он, судя по примеру, несортированный.
К тому же имеет, скорее всего, до двух тысяч элементов.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перебор элементов массива Всемогущий Общие вопросы Javascript 4 26.11.2019 17:28
Перебор элементов массива и сравнение со значением TheSanches Общие вопросы Javascript 7 26.02.2018 19:54
javascript перебор ассоциативного массива shoopik Общие вопросы Javascript 3 18.08.2017 09:43
Перебор массива объектов JSON Sokoljr Общие вопросы Javascript 13 24.04.2017 13:59
Перебор массива - вложенный цикл SWin Общие вопросы Javascript 35 27.12.2013 05:06