Ответы пользователя по тегу Массивы
  • Как сравнить группу элементов в одномерном массиве в с++ и заменить определенные элементы в нем на нули?

    Alexandroppolus
    @Alexandroppolus
    кодир
    https://qna.habr.com/q/1252656

    если итоговое расположение элементов не важно, то самым оптимальным решением будет отсортировать массив, а потом профильтровать на месте вот так:
    int i, pos = 0;
    for (i = 1; i < y; i++) {
        if (a[i] != a[pos]) {
            a[++pos] = a[i];
        }
    }
    for (i = pos + 1; i < y; i++) {
        a[i] = 0;
    }


    так ты получишь асимптотику O(n * ln(n))
    Ответ написан
  • Как построить древовидный массив неограниченной вложенности?

    Alexandroppolus
    @Alexandroppolus
    кодир
    вложенность мотет быть неограниченной

    выглядит так, будто у тебя бесконечно оперативы и ты хочешь куда-то её применить )))

    Вот вариант за линейное время работы (из предположения, что хэш-таблица работает в среднем за О(1))
    без рекурсии
    на js, переведи в ПХП сам

    код

    const array1 = [
        {page: '1.ru', title: 'title 1'},
        {page: '3.ru', title: 'title 3'},
        {page: '6.ru', title: 'title 6'},
    ];
    
    const array2 = [
        {page: '666.ru', title: 'title 666', referer: '66.ru'},
        {page: '33.ru', title: 'title 33', referer: '3.ru'},
        {page: '66.ru', title: 'title 66', referer: '6.ru'},
    ];
    
    function createTree(roots, notRoots) {
        if (!roots || !roots.length) { return []; }
    
        const childsMap = new Map();
    
        // строим карту (page => список_чилдов), создавая узлы дерева для чилдов
        notRoots.forEach((child) => {
            let childs = childsMap.get(child.referer);
    
            if (!childs) {
                childs = [];
                childsMap.set(child.referer, childs);
            }
    
            childs.push({
                page: child.page,
                title: child.title,
            });
        });
    
        // всем чилдам (вновь созданным узлам), которые попали в карту, проставляем чилдов
        childsMap.forEach((childs) => {
            childs.forEach((child) => {
                child.childs = childsMap.get(child.page) || [];
            })
        });
    
        // обходим корневые элементы, создаем для них узлы дерева, подставляем чилды по карте
        return roots.map((root) => {
            return {
                page: root.page,
                title: root.title,
                childs: childsMap.get(root.page) || []
            };
        })
    }
    
    console.log(createTree(array1, array2));

    Ответ написан
    2 комментария
  • Как найти второе по величине значение в массиве?

    Alexandroppolus
    @Alexandroppolus
    кодир
    С помощью метода find нельзя найти второе по величине значение.
    Если попытаться всё сделать только одним вызовом find, то мы в любом случае должны дойти до конца массива. А там мы можем вернуть только последний элемент.
    Если же кроме find использовать ещё что-то, то сам по себе find после этого не понадобится.
    В общем, странная задача какая-то.
    Ответ написан
  • Как лучше укорачивать массив с начала: shift, splice или delete?

    Alexandroppolus
    @Alexandroppolus
    кодир
    И shift, и splice будут реально смещать все элементы. Нет, массив не реализован как список. delete тоже неоптимальный вариант. А вот вышеупомянутый (в комментариях к вопросу) кольцевой буфер на массиве длиной N - идеально для твоего кейса.
    Ответ написан
    Комментировать