02.01.2023, 09:23
|
|
Профессор
|
|
Регистрация: 14.11.2014
Сообщений: 186
|
|
Как добавить элемент в отсортированный массив?
// есть отсортированный большой массив
let arr = ['ABC','BCD','CAE','CBA'];
Как добавить элемент 'BAS' сразу в нужное место, т.е. после 'ABC'?
// методы arr.push() и arr.unshift() подразумевают использование дальнейшей сортировки массива
Как добавить упорядоченно без сортировки?
|
|
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.
|
|
02.01.2023, 09:36
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,590
|
|
arr.splice()
Если же нужно прям оптимально и супер быстро, ту тут уж придётся бинароное дерево городить вместо массива или типа того.
__________________
29375, 35
|
|
02.01.2023, 11:06
|
|
Профессор
|
|
Регистрация: 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.
|
|
02.01.2023, 19:46
|
|
Профессор
|
|
Регистрация: 14.11.2014
Сообщений: 186
|
|
Сообщение от Aetae
|
arr.splice()
Если же нужно прям оптимально и супер быстро, ту тут уж придётся бинароное дерево городить вместо массива или типа того.
|
Да, именно оптимально и супер быстро нужно) Можете подробнее рассказать/показать об этом бинарном древе?)
|
|
02.01.2023, 19:52
|
|
Профессор
|
|
Регистрация: 14.11.2014
Сообщений: 186
|
|
Сообщение от voraa
|
Зачем дерево?
Бинарный поиск по отсортированному массиву.
|
А если интерполирующий?) И в чем принципиальное отличие бинарного дерева от бинарного поиска (что лучше/быстрее)?
Последний раз редактировалось webgraph, 02.01.2023 в 19:59.
|
|
02.01.2023, 20:03
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,590
|
|
webgraph, да вон вариант от voraa оптимальный для поставленных условий.
voraa, дерево будет нужно если таких операций много - всё-таки splice сам по себе "тяжёлый".
__________________
29375, 35
|
|
02.01.2023, 20:15
|
|
Профессор
|
|
Регистрация: 14.11.2014
Сообщений: 186
|
|
Сообщение от Aetae
|
дерево будет нужно если таких операций много - всё-таки splice сам по себе "тяжёлый".
|
Aetae, да, операций будет много. Поэтому необходима высокая пропускная способность. Исходя из этого следует, что ваш вариант с деревом может быть более оптимальным и более быстрым. Aetae, расскажите как вы это представляете?)
|
|
02.01.2023, 20:23
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,590
|
|
webgraph, массив в дерево - проводим добавления - дерево растёт - собираем в конце дерево в массив.
Конкретную реализацию писать лень, поугули.)
__________________
29375, 35
|
|
02.01.2023, 20:30
|
|
Профессор
|
|
Регистрация: 14.11.2014
Сообщений: 186
|
|
Сообщение от Aetae
|
всё-таки splice сам по себе "тяжёлый".
|
Если он такой "тяжёлый", то чем его заменить?
|
|
|
|