| 
	| 
	
	| 
		
	| 
			
			 
			
				30.10.2020, 09:54
			
			
			
		 |  
	| 
		
			
			| Аспирант       |  | 
					Регистрация: 14.01.2019 
						Сообщений: 31
					 
		
 |  |  
	| 
				Раздельный перебор массива
			 Недавно столкнулся с задачей выборки одинаковых значений из массива с большим количеством элементов (больше тысячи). Задача была перебрать массив (например, ["green", "yellow", "blue", "green", "purple", "green"]) с помощью map и достать из него все green. Но через map довольно медленно. Есть какие-то более быстрые способы? Я слышал про какой-то метод располовинивания массива с большим количеством элементов, но гугл про это ничего толком не выдал   |  |  
	| 
		
	| 
			
			 
			
				30.10.2020, 10:22
			
			
			
		 |  
	| 
		
			|  | Профессор       |  | 
					Регистрация: 03.02.2020 
						Сообщений: 2,777
					 
		
 |  |  
	| 
	
 
	| Сообщение от Himmelin |  
	| с помощью map |  
	
 С помощью функции map? А при чем тут она при поиске? Есть функция .filter
 
	
 
	| Сообщение от Himmelin |  
	| с большим количеством элементов (больше тысячи). |  
	
 Задачи конечно разные бывают, но на мой взгляд десятки тысяч это фигня.
 
	
 
	| Сообщение от Himmelin |  
	| Я слышал про какой-то метод располовинивания массива |  
	
 Ну есть метод поиска делением пополам, но он применяется к отсортированным  массивам. |  |  
	| 
		
	| 
			
			 
			
				30.10.2020, 10:31
			
			
			
		 |  
	| 
		
			
			| Аспирант       |  | 
					Регистрация: 14.01.2019 
						Сообщений: 31
					 
		
 |  |  
	| Есть какая-нибудь ссылка на статью про метод деления пополам? |  |  
	| 
		
	| 
			
			 
			
				31.10.2020, 01:07
			
			
			
		 |  
	| 
		
			
			| Профессор       |  | 
					Регистрация: 04.12.2012 
						Сообщений: 3,841
					 
		
 |  |  
	| Бенчмарк производительности методов перебора: https://jsben.ch/6S3sP  (у меня всегда разный результат).
 
	
 
	| Сообщение от voraa |  
	| Ну есть метод поиска делением пополам, но он применяется к отсортированным массивам. |  
	
 Вы про бинарный поиск? Он разве не неприменим в описанной выше задаче? |  |  
	| 
		
	| 
			
			 
			
				31.10.2020, 10:38
			
			
			
		 |  
	| 
		
			|  | Профессор       |  | 
					Регистрация: 25.10.2016 
						Сообщений: 1,013
					 
		
 |  |  
	| 
	
 
	| Сообщение от Nexus |  
	| Вы про бинарный поиск? Он разве не неприменим в описанной выше задаче? |  
	
 Вполне себе применим. 
Найти бинарным поиском первое попавшееся значение, потом от него пробежаться вправо и влево, пособирать все такие же.
 
Если данная операция будет выполняться многократно, то имеет смысл на старте создать карту (значение -> массив) для всех значений. |  |  
	| 
		
	| 
			
			 
			
				31.10.2020, 10:45
			
			
			
		 |  
	| 
		
			|  | Профессор       |  | 
					Регистрация: 03.02.2020 
						Сообщений: 2,777
					 
		
 |  |  
	| 
	
 
	| Сообщение от Nexus |  
	| Вы про бинарный поиск? Он разве не неприменим в описанной выше задаче? |  
	
 
	
 
	| Сообщение от Alexandroppolus |  
	| Вполне себе применим. Найти бинарным поиском первое попавшееся значение, потом от него пробежаться вправо и влево, пособирать все такие же.
 |  
	
 Я не вижу тут отсортированного массива. |  |  
	| 
		
	| 
			
			 
			
				31.10.2020, 13:12
			
			
			
		 |  
	| 
		
			
			| Профессор       |  | 
					Регистрация: 04.12.2012 
						Сообщений: 3,841
					 
		
 |  |  
	| 
	
 
	| Сообщение от Alexandroppolus |  
	| Найти бинарным поиском первое попавшееся значение, потом от него пробежаться вправо и влево, пособирать все такие же. |  
	
 И в чем его преимущество над обычным перебором?
 
Я возможно неправильно выразился. Применить то его можно, вот только смысл в этом какой? 
У автора, насколько я понял, стоит задача максимально быстро найти в массиве все значения равные определенной строке. Разве бинарный поиск тут не будет медленнее, чем обычный перебор? |  |  
	| 
		
	| 
			
			 
			
				31.10.2020, 13:32
			
			
			
		 |  
	| 
		
			|  | Профессор       |  | 
					Регистрация: 25.10.2016 
						Сообщений: 1,013
					 
		
 |  |  
	| 
	
 
	| Сообщение от Nexus |  
	| Разве бинарный поиск тут не будет медленнее, чем обычный перебор? |  
	
 Если массив большой и отсортированный, а различных значений много, то да, будет быстрее. Если несортированный, и нужно выполнить один раз, то разумеется обычный поиск. А если многократно потребуется искать, то лучше сделать карту.
 
Автор не уточнил эти моменты, к сожалению. |  |  
	| 
		
	| 
			
			 
			
				31.10.2020, 13:52
			
			
			
		 |  
	| 
		
			|  | Профессор       |  | 
					Регистрация: 03.02.2020 
						Сообщений: 2,777
					 
		
 |  |  
	| 
	
 
	| Сообщение от Nexus |  
	| Разве бинарный поиск тут не будет медленнее, чем обычный перебор? |  
	
 Если массив отсортирован, то конечно бинарный быстрее. 
log2 (N) сравнений. 
На 1000 элементов 10 сравнений. 
А если неотсортирован, то ничего, кроме перебора не поможет.
 
	
 
	| Сообщение от Alexandroppolus |  
	| А если многократно потребуется искать, то лучше сделать карту. |  
	
 Отсортировать по возможности. |  |  
	| 
		
	| 
			
			 
			
				31.10.2020, 14:15
			
			
			
		 |  
	| 
		
			
			| Профессор       |  | 
					Регистрация: 04.12.2012 
						Сообщений: 3,841
					 
		
 |  |  
	| 
	
 
	| Сообщение от Alexandroppolus |  
	| Если массив большой и отсортированный |  
	
 
	
 
	| Сообщение от voraa |  
	| Если массив отсортирован |  
	
 ТС привел пример массива. Он, судя по примеру, несортированный.  
К тому же имеет, скорее всего, до двух тысяч элементов. |  |  |  |