Ответы пользователя по тегу Алгоритмы
  • Для чего внутри связного списка нужен массив?

    bingo347
    @bingo347
    Crazy on performance...
    К ответам выше я бы еще добавил, что массивы более дружелюбны к процессорному кэшу чем связные списки. Варьируя размер массивов в нодах списка можно подобрать такой размер ноды, чтоб она соответствовала размеру кэш-линии.
    Ответ написан
    Комментировать
  • Как отсортировать массив массивов строк в js?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Данная задача в принципе не решается сортировкой, так как сортировка это про отношение больше/меньше/равно, которого в данном случае нет.
    Самое простое здесь, это построить из этих элементов двусвязный список, а затем преобразовать его в результирующий массив:
    function orderArray(arr) {
      // для начала построим ноды списка и соберем их в 2 HashMap по обоим строкам
      const maps = arr.reduce((acc, item) => {
        const node = {item, next: null, prev: null};
        acc[0][item[0]] = node;
        acc[1][item[1]] = node;
        return acc;
      }, [{}, {}]);
    
      // после пройдемся по обоим HashMap и соединим связи
      for(const key of Object.keys(maps[0])) {
        maps[0][key].next = maps[0][maps[0][key].item[1]] || null;
      }
      for(const key of Object.keys(maps[1])) {
        maps[1][key].prev = maps[1][maps[1][key].item[0]] || null;
      }
    
      // найдем начальную ноду списка (ноду без предыдущей ноды)
      let cur = Object.values(maps[0]).find(({prev}) => prev === null);
    
      // и начиная с нее соберем список в массив
      const result = [];
      while(cur) {
        result.push(cur.item);
        cur = cur.next;
      }
    
      return result;
    }
    
    console.log(orderArray([['butter', 'jelly'], ['bananas', 'apples'], ['peanuts', 'butter'], ['jelly', 'bananas']]));
    Ответ написан
    1 комментарий
  • Возможна ли прокачка алгоритмов без хорошего знания синтаксиса?

    bingo347
    @bingo347
    Crazy on performance...
    Подскажите возможна ли прокачка алгоритмов без хорошего знания синтаксиса, насколько вообще важны алгоритмы, где они точно могут пригодиться а где нет и где их можно прокачать?

    Подскажите, возможно ли строить предложения без хорошего знания, что после обращений в русском языке ставится запятая, насколько вообще важно уметь говорить, где это точно может пригодится и как можно научится говорить?

    Интересно тут несколько вещей:
    1. ребенок не задает таких вопросов, он просто начинает говорить, и говорит еще и еще, пока это не начнет получаться хорошо.
    2. хотя мой внутренний ru-lint зацепился за отсутствующую запятую, это не помешало понять мне заложенный Вами в текст смысл. Компьютеры в большинстве случаев так не могут, будет ошибка компиляции.
    3. я здесь привожу в аналогию русский язык и делаю это так же используя русский язык, но мои знания в нем не совершенны, вполне возможно, что в данном тексте и я где-то неосознанно допустил ошибку, но смысл от этого сохранился

    Ну и как заметили выше, алгоритмы это не только про программирование и они никак не привязаны к конкретному ЯП.
    Ответ написан
    Комментировать
  • Почему JS решил задачу на рекурсию гораздо быстрее Python/Lua?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Синтетические бенчмарки врут практически всегда, потому что те кто их пишет редко знает досконально все сравниваемые технологии и вряд ли сможет свести задачу к схожим условиям. Как правило, схожие условия выходят только при отключении всех возможных оптимизаций, ибо оптимизации у разных технологий работают по разному.
    Как уже написали выше, Вы зря не превели код на Python, возможно специалисты по этому ЯП предложили бы более оптимальное решение.
    По js варианту могу сказать, что v8 очень хорошо умеет оптимизировать хвостовую рекурсию. И в данном примере вместо дорогой рекурсии у Вас будет работать более дешевый цикл. Я могу Вас удивить, перепишите свое решение на C вот прямо как есть и скомпилируйте без оптимизаций - js + v8 окажется быстрее
    Ответ написан
    Комментировать
  • Зачем нужен фильтр Блума?

    bingo347
    @bingo347
    Crazy on performance...
    преимущество в размерах, фильтр Блума может иметь массив бит произвольного размера, предложенное же Вами решение будет иметь массив бит напрямую зависящий от размерности хэша, например для crc32 понадобится 512МБ
    Это очень много для структуры, которая не говорит ни о чем кроме наличия
    1 отсутвие неопределенности, но коллизии также остаются
    раз коллизии остаются, то неопределенность все же есть
    2 более высокая битовая плотность 1 к 1
    это вообще как относится к решаемой задаче?
    3 расчет только одной хэш функции
    расчет 10-15 хэшей будет быстрее чем расчет одного + чтение с диска с произвольным доступом. И да, читать битмап придется с диска, ибо столько оперативы под решаемую задачу не даст ни один админ
    Ответ написан
    1 комментарий
  • Как запатентовать уникальный программный алгоритм?

    bingo347
    @bingo347
    Crazy on performance...
    Патентное право не распростроняется на объекты интелектуальнной собственности, то есть на алгоритмы, программы, решения математических задач и тд.
    Зато распространяется авторское право, для которого достаточно заявить публично, что алгоритм создан Вами (например выложить на гитхаб)
    Ответ написан
    1 комментарий
  • Как заставить объект плавно догонять мышь?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    По событию mousemove складываете координаты мыши в очередь
    По requestAnimationFrame выдергиваете из очереди несколько элементов, при том чем больше очередь - тем больше дергаем (надо подбирать), по полученному набору координат корректируете вектор скорости и отрисовываете движение
    Ответ написан
    Комментировать
  • Алгоритм поиска последовательности выпадения числа. Возможно ли такое реализовать?

    bingo347
    @bingo347
    Crazy on performance...
    Создайте нейронную сеть типа перцептрон, обучайте пока результаты не станут удовлетворительными
    Ответ написан
    Комментировать
  • Поиск по значению (Node.js + Redis)?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    redis - key-value хранилище, какой нафиг поиск?
    В Вашем случае лучше использовать документарку (mongodb, rethinkdb, etc.)
    Ответ написан
    Комментировать
  • Как bash terminal парсит комманду и какие параметры ей передать?

    bingo347
    @bingo347
    Crazy on performance...
    Полноценный bash Вы не сделаете, даже не пытайтесь, bash - полноценный скриптовый язык, когда Вы дойдете до уровня разработать простейший скриптовый язык, у Вас таких вопрос уже не будет возникать, да и потребность в этом отпадет.
    Насчет разбора аргументов отдельной команды, тут все на совести приложения, которое эта команда запускает, bash передает все аргументы просто строкой
    Ответ написан
    1 комментарий
  • Правда ли UUID так надёжен?

    bingo347
    @bingo347
    Crazy on performance...
    алгоритм вычисления uuid использует timestamp и несколько псевдослучайных значений, вероятность того, что кто-то в мире сгенерирует такой же uuid в ближайшие 300 лет стремится к нулю
    Ответ написан
    1 комментарий
  • Как реализовать сортировку объектов?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    У Вас не массив, а объект, а у объектов произвольный доступ к элементам по их ключу.
    Ключи как таковые можно получить в виде массива либо функцией Object.keys, которая получает все нумеруемые ключи объекта включая ключи из цепочки прототипов (к не нумеруемым относятся свойства объявленые через Object.defineProperty за исключением явного указания enumerable: true, а также символы (Symbol) и методы ( { method() { ... } } ) из ES2015), либо функцией Object.getOwnPropertyNames, которая получает все собственные ключи объекта, кроме символов (прототип исключен, enumerable не учитывается)
    Случайное перемешивание массива делается элементарно: arr.sort(() => Math.random() - 0.5);

    Как итог, можно получить массив ключей Вашего объекта в случайном порядке:
    var keys = Object.keys(a).sort(() => Math.random() - 0.5);
    Ответ написан