Ответы пользователя по тегу Алгоритмы
  • Как правильно удалять элементы хэш таблицы?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Судя по всему метод открытой адресации - это проосто нехороший метод для решения проблем хеширования. Я не знаю, толи преподаватели пошли очень душные. Толи студенты любопытные, но всех
    тянет как магнитом к open addressing (OA), хотя многие продуктовые библиотеки коллекций C++/C#/Java
    просто не используют OA по дефолту. Они берут Separate Chaining и это работает всегда хорошо.

    Я-бы сделал следующую рекомендацию. Поскольку удаление элемента при OA - тяжелая операция,
    которая требует перепроверки всех элементов цепочки ключа
    , то лучше вообще не удалять а
    пере-создавать новую таблицу или отказаться от OA в пользу Separate Chaining.
    Ответ написан
  • Какая структура с лимитом памяти позволит ускорить поиск по огромному файлу с набором бинарных данных?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Коробочным решенеим задачи может быть префиксное дерево (Trie) с лимитом в 100Мб
    которое в листовых узлах должно хранить списки искомых записей.

    Учитывая объемы, списки не влезают. Поэтому можно хранить ссылки на файлы или
    на offsets внутри большого файла. Тут уже не теория а эксперимент больше покажут
    что подойдет.

    Мы также исходим из некого оптимистичного предположения что данные - это все таки
    не рандомный шум а какие-то тексты, что позволит делать дерево максимально компактным.
    (Чтоб каждый узел не содержал 1 байт а хотя-б цепочку букв).
    Ответ написан
    Комментировать
  • Как найти дубликаты новостей, полученных из разных источников?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Так-же как и в индексировании документов. Строится некое векторное представление документа.
    И потом похожие векторы - указывают на одинаковые (99.9%) документы. Методик векторизации
    много. В основном это токенизация слов и свертывание их к хешу.
    Ответ написан
  • В чем проблема в коде работы с графом?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Зачем делать безсмысленный makeStep? Пускай он возвращает булево значение.

    boolean makeStep(Graph &graph, ValuesTable &table) { .... }


    Не было отрицательных свойств среди вершин - значит пускай вернет true.
    Тогда будет стоп алгоритма. И не надо будет
    делать дополнительных пере-расчетов.
    Ответ написан
    7 комментариев
  • Через какой алгоритм решать эту задачу?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Стоя на 12 этаже можно за 1 ход попасть на 23 этах (Вверх) или на 6 этаж (Вниз).
    Стоя на 6 этаже можно за 1 ход попасть на 11 этаж (ВВ) или на 3 этах.
    (и так далее)

    Вот такой граф получается. Немного напоминает Гипотезу Коллатца. За счет минус единички
    адрес меняется четность и есть надежда что мы не зациклимся а все таки куда-то двигаемся.
    Значит можно упорным баловством с кнопками куда-то приехать.

    Вобщем нужен орграф с 70 вершинами и опционально с 2 ребрами для каждой вершины.
    Недостижимые вершины - это этажи куда нельзя будет попасть соотвественно.
    Ответ написан
    4 комментария
  • Как написать свой матричный фильтр (например размытие по Гауссу)?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Фильтр Гаусса ничего не знает о цвете. Он просто применяется к матрице вещесвтенных чисел.
    Поэтому обычно картинку в формате RGB переводят в трех-слойную вещественную матрицу { double, double, double }
    и фильтр Гаусса применяют трижды для каждого слоя. И результат потом снова сводят в RGB.

    Есть миллиард хитростей как делать это в целых или в вещественных числах или как использовать SIMD, Parallel
    computing e.t.c. но ты сделай сначала самый простой и работающий вариант а потом уже оптимизация.

    С оптимизацией неизбежно сталкиваются все новички на цифровых фильтрах. Потому-что без нее фильры
    работают на порядки медленнее чем в Photoshop например.
    Ответ написан
    Комментировать
  • Как найти в файле тхт нужную строку и добавить к ней другую переменную?

    mayton2019
    @mayton2019
    Bigdata Engineer
    На регулярной основе - я-бы загружал этот файл в базу данных. И там через update обновлял бы поле 90 на 100.
    А потом сохранял-бы обратно в CSV файл.

    Если задача одноразовая ... ну есть масса утилит типа sed/awk/perl они это делают за 2 минуты.
    Ответ написан
    Комментировать
  • Как решить задачку "ЛИРИК = 0,5*ФИЗИКА" на ЯП?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Таких задач было много в журналах Наука и жизнь. И кажется в книжках Мартина Гарднера.
    Типа ТУЗИК + ТУЗИК = КАРТУЗ. И нужно угадать какой букве какая десятичная цифра соотвествтует.

    Ну типично комбинаторная задача. Общего подхода тут нет. Но можно придумать правила которые
    отсекают точно неработающие решения. Например

    "ЛИРИК = 0,5*ФИЗИКА"

    Можно записать так

    ЛИРИК + ЛИРИК = ФИЗИКА

    Тогда мы знаем что буква "К" в этой системе счисления будучи умноженной на 2 дает "A" по модулю этой системы.
    Потом И встречается дважды. Но но дает разные величины по модулю. Видимо для одной сработал перенос
    из предыдущего разряда.

    Вот из таких рассуждений мы строим дерево решений. Элегантно (но медленно) такие задачи решались
    кажется на Prolog (из книжки Ивана Братко но я не уверен). Да и вообще Пролог не нагляден с точки
    зрения императивного программирования. Тоесть он что-то под капотом делает но как и насколько
    оптимально - непонятно.
    Ответ написан
    1 комментарий
  • Кормен или Кнут?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Кнут описывает много устаревшего материала. Большую часть из этого никогда не спросят на собеседованиях.
    Поэтому цена вопроса - к чему готовиться. Если с собеседованию то тут Кнут вообще не помошник.
    Он удивительно многословен и нуден. Кроме того если хотите читать код - то Кнут пишет его для своей
    виртуалки с очень "странной" системой регистров и с накопителями (!) ленточного типа.
    Трехтомник очень академичен и красиво смотрится на полке. Для меня Кнут будет чтивом для "долгих
    зимних вечеров". Когда некуда торопиться.

    Насчет Кормена - ничего не могу сказать. Купил но еще не читал. Судя по содержанию
    - очень солидная вешь. В качестве описателей алгоритмов там кажется используется алгоритмический
    язык на английском. Не всем такое заходит. Не всем понятно.

    Есть двухтомник Седжвика. Мне он кажется более практичным. У него есть издания для C/C++/Java
    с примерами. Там 1-й том - базовые алгоритмы на коллекциях и 2-й том - алгоритмы на графах.

    Есть Вирт - Алгоритмы. Достаточно сжато описан базис. Примеры - на Pascal.

    Есть Бхаргава - Грокаем Алгоримы. Все хвалят за практичность и примеры. Но я еще не читал.
    Ответ написан
    9 комментариев
  • Как нарисовать кривую Серпинского (см. ниже), не используя графические библиотеки, а '*' или слешы?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Самый простой путь - рисовать эту картинку внутри матрицы (растр).
    А потом перевести элементы этой матрицы в псевдографику https://en.wikipedia.org/wiki/Box-drawing_character

    Но я тебе это не советую, потому что выглядит как сильно грубое разрешение.

    Рисование слешами или зведочками возможно. Но это ASCII art. Иногда выглядит красиво
    а иногда вообще нечитабельно.
    Ответ написан
    4 комментария
  • Scratch задание Алгоритмика, как решить?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Насколько инфантилен стал программист. Чтоб заставить его думать - нужно показывать спецэффекты.
    Ответ написан
    Комментировать
  • Как найти минимальный ограничивающий параллелепипед?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Я не уверен что стоит вообще искать идеальное решение. Особенно для 800 точек. Задача
    пахнет комбинаторной со всеми вытекающими.

    Я-бы предложил дать программе время (секунд) или количество итераций через которые
    она должна выдать почти-минимальный параллелепипед. Но мы при этом понимаем что это не самый идеальный.

    Для малого числа точек (8) можно построить выпуклую оболочку. И попробовать прикладывать
    первую грань параллелепипеда к каждой грани выпуклой оболочки. А оставшиеся грани мы можем
    получить вращением параллелепипеда до тех пор пока bounding volume не будет минимален.
    Учитывая дискретность выпуклой оболочки, поворот тоже может быть дискретным. Например там
    проверить штук 20 углов. Вот как-то так.
    Ответ написан
    2 комментария
  • Разработка ИИ для настольной карточной игры. Обучение?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Мне кажется что дешевле игру запрограммировать чем обучать ей бота.

    Просто в случае обучения - ты должен показать все возможные сочетания "стритов", "флешей" и прочего.
    И не один а несколько раз. И обеспечить учителя или подкреплять удачные ходы.
    Ответ написан
    Комментировать
  • Какие книги можете посоветовать о алгоритмической и низкоуровневой разработки для уровня мидла?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Я пока студент, перешёл на второй курс.

    Тебя в любом случае градуируют как junior/trainee на первой работе.
    И дело даже не в том сколько олимпиад ты прошел и сколько ты книжек прочитал.
    Просто звездочки в погонах надо заслужить. Если ты талантлив - то наверное
    за год перепрыгнешь уровнеь junior но я советую вообще с этим не спешить.

    Нет ничего хуже самозванца. Согласен?
    Ответ написан
    Комментировать
  • Подходит ли книга "Алгоритмы. Построение и Анализ" для новичка?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Это - тяжелая книга для новичка. Начните с Вирта или Седжвика.
    Ответ написан
    Комментировать
  • В каком порядке учить темы по алгоритмам?

    mayton2019
    @mayton2019
    Bigdata Engineer
    В ВУЗах такой программы обычно нет. Мы учили лет 20 назад ОА и СД (оснонвы алгоритмов и структур данных).

    Ваш список - чудовищно длинный. Если по нему расписать все - то примерно хватит на 5 лет учебы.
    Я сомневаюсь что вы будете планировать с таким горизонотом. Я предложу выкинуть следующее.

    - Алгебра
    - Геометрия

    И я объясню почему. Когда вы идете в ВУЗ - вы уже знаете алгебру и геометрию. Это курс школьной
    программы и я не вижу смысла его подмешивать к компьютерным науками. Если вы по каким-то причинам
    алгебру не знаете. То я вообще не вижу смысла вам дальше двигаться. Вы не будете понимать доказательтв
    и выводов формул в других науках поэтому выкидываем.

    Далее выкидываем.

    - Теория игр
    - Динамика
    - Расписания

    Теория игр - это факультатив. Почитаете книжки на досуге. Не включают обычно в базовые программы.
    Не знаю зачем выделять отдельно расписания? Это может быть просто подраздел какой-то другой
    оптимизации. Динамика ... хм... Что за динамика? Упругого тела? Непонятно. Разверните опредление.

    - Строки

    Выкидываем строки. Это первое занятие по Turbo Pascal. За 15 минут вы узнаете что такое строки.
    Никаких особых знаний там нет. Алгоритм КМП и Боуер Мур - пойдет в ОЯ и СД.

    Графы - я не буду выкидывать. Но они идут как подраздел дискретной математики.
    Теория множеств. Дискретка. Графы. Это обычно один предмет.

    Далее.

    - Алгоритмы на последовательностях

    Я не знаю что это такое. Приведите пример. Возможно это имеет другие названия? Автоматы? Сети? Цепи?

    - Комбинаторика

    Тоже идет как подраздел дискретной математики.

    Итого в сухом остатке у нас остается 4 предмета.

    - ОЯ и СД из программы любого ВУЗа
    - Дискретная математика из ВУЗа
    - Линейная алгебра
    - Численные методы (да это реально настоящий предмет ВУЗа и притом достаточно плотный). Семестр как минимум.

    Структуры данных - поглощаются ОЯ и СД. Вот. Остается Линейная Алгебра. Я ее не знаю куда положить.
    Я не изучал ее отдельно как предмет. Возможно это и где-то выделяется в науку. Говоря о последовательности
    изучения этих 4 предметов - я могу просто сослаться на методички ВУЗов. Ищите их. Ищите учебные планы.
    Некоторые из этих наук я думаю можно учить параллельно.
    Ответ написан
    Комментировать
  • Как сделать поиск папки у которой будет промежуточный каталог?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Поскольку топик тегирован алгоритмами - то мы должны обсуждать именно алгоритмы.

    Алгоритм называется DFS (Deep First Search). Это поиск в дереве в глубину.
    Поиск выдает нам листовые вершины. И путь от корня до листовой вершины будет
    кандидатом на ответ.

    Значит наша задача - перебрать всех кандидатов на предмет совпадения с шаблоном.

    "C:\***\\AppData\***\Adobe"

    Здесь можно рассмотреть разные оптимизации. Например узел 1 и 3 и 5 уровней у нас - константа.
    Это можно было бы рассматривать но мне без конкретного языка программирования это уже
    неудобно и не интересно. Поэтому было-бы хорошо чтобы автор указал язык разработки.
    Ответ написан
    Комментировать
  • Seed для CRC32?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Я сразу попробую ответить на главный вопрос.

    написать хэш-таблицу без коллизий


    Написать такую таблицу можно если мы заранее знаем весь набор данных (в случае автора это
    множество ключей (K). Здесь для простоты предполагаем что ключи - это целые числа int32 (DWORD).

    Алгоритм примерно такой:
    1) Берем размер хеш-таблицы в n = size(K). Метод открытой адресации.
    2) Берем любую хеш-функцию (по области определения больше чем n
    SHA1, MD5, xxhash, mur-mur-hash)
    3) Начинаем наполнять таблицу.
    4) Как только детектирована коллизия - удаляем старую таблицу и создаем новую
    с размером например 120% от исходного n.
    5) Повторяем алгортм до тех пор пока не будут расставлены все ключи.

    Profit.

    Если мы не знаем наши данные изначально (у нас их нет и мы не знаем количество и тип данных)
    то мы не можем гарантировать отсустствие коллизий хотя-бы потому что у нас
    нету такой хеш функции которая бы гарантировала отсутствие коллизий на вариативном
    типе данных
    .

    Изучать хеширование на базе целых чисел - вобщем-то не интересно. Более общий случай - это
    строки (String) и я-бы делал эксперименты со строками и с реальными данными (мобильные
    телефоны емейлы налоговые номера и прочее). Целые числа - это .... слишком синтетические
    тесты и их результаты потом никуда натянуть нельзя.

    UPD: Алгоритм в таком виде не работает. По крайней мере от коллизий мы не избавились.
    Не голосуйте здесь пока.
    Ответ написан
  • Как хешировать в хеш таблице узлы дерева?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Дружище тебе не надо портить дерево. Оно и так хорошо.
    Просто заведи отдельную хеш-таблицу и трекай две структуры
    одновременно.

    LRU например так и делает. Цепной список + Hashtable.
    Ответ написан
    Комментировать
  • Где я мог увидеть задачу про то как объект идёт по шагам вперёд и впереди строится стена?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Парадокс Зенона?
    Ответ написан
    Комментировать