Javascript.RU

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

Как добавить элемент в отсортированный массив?
// есть отсортированный большой массив
let arr = ['ABC','BCD','CAE','CBA'];


Как добавить элемент 'BAS' сразу в нужное место, т.е. после 'ABC'?

// методы arr.push() и arr.unshift() подразумевают использование дальнейшей сортировки массива


Как добавить упорядоченно без сортировки?

Ответить с цитированием
  #2 (permalink)  
Старый 02.01.2023, 09:33
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,134

webgraph,
let arr = ['ABC', 'BCD', 'CAE', 'CBA'],
            el = 'BAS';
            len = arr.length;
            i = 0;
        for (; i < len; i++) if (el < arr[i]) break;
        arr.splice(i, 0, el);
        alert(arr)

Последний раз редактировалось рони, 02.01.2023 в 09:37.
Ответить с цитированием
  #3 (permalink)  
Старый 02.01.2023, 09:36
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,590

arr.splice()


Если же нужно прям оптимально и супер быстро, ту тут уж придётся бинароное дерево городить вместо массива или типа того.
__________________
29375, 35
Ответить с цитированием
  #4 (permalink)  
Старый 02.01.2023, 11:06
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,754

Сообщение от Aetae
ту тут уж придётся бинароное дерево городить вместо массива
Зачем дерево?
Бинарный поиск по отсортированному массиву.

Как то так
// ищет в отсортированном массиве arr 
// индекс первого элемента >= val 
// выдает arr.length, если все элементы < val
const findBinIndex =(arr, val) => {
	let nb=0, ne=arr.length-1;
	if (val<=arr[0]) return 0;
	if (val >= arr[ne]) return ne+1;
	let index;
	while (true) {
		index = ((ne + nb) / 2) | 0;
		if (arr[index] <= val)
			nb = index;
		else 
			ne = index;
			
		if (ne - nb == 1) {
			if (val<=arr[nb]) return nb;
			if (val >= arr[ne]) return ne+1;
			return ne;
		}
	}
}

const arr =  ['ABC', 'BCD','BCD', 'CAE', 'CBA']
let k, el;
el = 'BAS';
k= findBinIndex(arr, el);
arr.splice(k,0,el); 

el = 'AAS';
k= findBinIndex(arr, el);
arr.splice(k,0,el); 

el = 'CCS';
k= findBinIndex(arr, el);
arr.splice(k,0,el); 

el = 'BCD';
k= findBinIndex(arr, el);
arr.splice(k,0,el); 

el = 'CAF';
k= findBinIndex(arr, el);
arr.splice(k,0,el); 

console.log(arr)

Последний раз редактировалось voraa, 02.01.2023 в 12:31.
Ответить с цитированием
  #5 (permalink)  
Старый 02.01.2023, 19:46
Аватар для webgraph
Профессор
Отправить личное сообщение для webgraph Посмотреть профиль Найти все сообщения от webgraph
 
Регистрация: 14.11.2014
Сообщений: 186

Сообщение от Aetae Посмотреть сообщение
arr.splice()


Если же нужно прям оптимально и супер быстро, ту тут уж придётся бинароное дерево городить вместо массива или типа того.
Да, именно оптимально и супер быстро нужно) Можете подробнее рассказать/показать об этом бинарном древе?)
Ответить с цитированием
  #6 (permalink)  
Старый 02.01.2023, 19:52
Аватар для webgraph
Профессор
Отправить личное сообщение для webgraph Посмотреть профиль Найти все сообщения от webgraph
 
Регистрация: 14.11.2014
Сообщений: 186

Сообщение от voraa
Зачем дерево?
Бинарный поиск по отсортированному массиву.
А если интерполирующий?) И в чем принципиальное отличие бинарного дерева от бинарного поиска (что лучше/быстрее)?

Последний раз редактировалось webgraph, 02.01.2023 в 19:59.
Ответить с цитированием
  #7 (permalink)  
Старый 02.01.2023, 20:03
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,590

webgraph, да вон вариант от voraa оптимальный для поставленных условий.

voraa, дерево будет нужно если таких операций много - всё-таки splice сам по себе "тяжёлый".
__________________
29375, 35
Ответить с цитированием
  #8 (permalink)  
Старый 02.01.2023, 20:15
Аватар для webgraph
Профессор
Отправить личное сообщение для webgraph Посмотреть профиль Найти все сообщения от webgraph
 
Регистрация: 14.11.2014
Сообщений: 186

Сообщение от Aetae
дерево будет нужно если таких операций много - всё-таки splice сам по себе "тяжёлый".
Aetae, да, операций будет много. Поэтому необходима высокая пропускная способность. Исходя из этого следует, что ваш вариант с деревом может быть более оптимальным и более быстрым. Aetae, расскажите как вы это представляете?)
Ответить с цитированием
  #9 (permalink)  
Старый 02.01.2023, 20:23
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,590

webgraph, массив в дерево - проводим добавления - дерево растёт - собираем в конце дерево в массив.
Конкретную реализацию писать лень, поугули.)
__________________
29375, 35
Ответить с цитированием
  #10 (permalink)  
Старый 02.01.2023, 20:30
Аватар для webgraph
Профессор
Отправить личное сообщение для webgraph Посмотреть профиль Найти все сообщения от webgraph
 
Регистрация: 14.11.2014
Сообщений: 186

Сообщение от Aetae
всё-таки splice сам по себе "тяжёлый".
Если он такой "тяжёлый", то чем его заменить?
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
При нажатии на тег <pre> добавить элемент в массив и вывести его vanyabb Angular.js 4 03.04.2017 15:46
Как в шаблоне диррективы узнать массив это или строка? delias Angular.js 1 18.03.2014 07:33
Как вы относитесь к наркоманам? Maxmaxmaximus7 Оффтопик 7 05.02.2014 13:29
Как узнать родительский элемент? alex_han Events/DOM/Window 6 06.12.2013 23:01
Как добавить тег в каждый элемент списка? elias jQuery 4 15.08.2010 15:19