Ответы пользователя по тегу Алгоритмы
  • Где я мог увидеть задачу про то как объект идёт по шагам вперёд и впереди строится стена?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Парадокс Зенона?
    Ответ написан
    Комментировать
  • Как построить путь из одной координаты в другую, используя промежуточные координаты из списка?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Задача выглядит как поиск кратчайшего пути в графе. Но решать в географических координатах
    сложно т.к. надо учитывать кривизну планеты Земля. На эту тему есть куча формул и еще лучше,
    куча систем координат и API.

    Но я-бы просил автора нарисовать на картинке как это он себе видит. Возможно тут либо все очень
    проще. Либо очень сложнее.
    Ответ написан
  • Как определить есть ли противоречия в цепочке логических выражений?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Можно попробовать на Prolog написать. Правила (rules) известны. А в качестве утверждений - просто
    проверить что существуют ли целые числа которые удовлетворяют всем rules.
    Ответ написан
    Комментировать
  • Как вычислить значение x mod 2 на машине Тьюринга?

    mayton2019
    @mayton2019
    Bigdata Engineer
    В унарном виде - это как цепочка единичек. Например число 5 будет.

    _11111_

    Справа и слева должен стоять blank sysmbol. Типа признак конца ленты чтоб было что проверять.

    Тогда (5 mod 2) = 1

    И мы должны получить на ленточке просто единичку.

    _1_

    Это можно сделать поглощая пары соседних единичек. А для четного числа будет пустая лента. Тоесть остаток от деления равен нулю.

    Ну вот такой алгоритм. Дальше надо делать конечный автомат который ищет пары единичек.
    Ответ написан
    Комментировать
  • Как правильно реализовать алгоритм Дейкстры в Python с применением ООП?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Графы и графовые алгоритмы являются хорошим краш-тестом для memory. Очень сложно придумать оптимальную структуру для графа чтоб было и экономно и быстро искать исходящие и входящие ребра в вершину.

    Есть компактные структуры из примитивов такие как матрицы смежности например. Но они могут быть плохие
    в другом. Например в поиске в глубину. Насколько Алгоритм Дейкстры пригож для этих структур - никто не знает.

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

    mayton2019
    @mayton2019
    Bigdata Engineer
    Есть массив [1,2,3,3,4].
    Нет. Нет. Все не так. Бинарное дерево строится на основе любых произвольных массивов.
    Не обязательно сортированных. То что ты привел это какой-то частный случай чтоб облегчить себе
    жизнь. И непонятно зачем мы здесь будем обсуждать частный случай.

    Вот попробуй построить дерево из
    [5,1,3,2,4].
    Ответ написан
  • Существуют ли инструменты для хранения иерархических связанных между собой показателей?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Семантические графовые базы данных скорее всего подходят под данную задачу. Типа RDF/Semantic Web.
    В качестве языка запросов там могут быть использованы SparQL. В качестве платформы хранения.... а чорт
    его знает. Там много форматов. И XML и JSON и есть бинарники и JDBC адаптеры.

    Это вообще серебрянная пуля которая везде подходит. Даже реляционки можно также представить. Со своими
    накладыми но можно.

    Но есть несколько мыслей почему их применение может быть неудобным. Первая. Например - знания о том
    как все внутри устроено - будут только у 1 человека. У создателя этой базы. И никто кроме автора
    в этой базе ничего не найдет.

    Вторая. В эпоху умных чятов такие базы знаний умерли очень быстро. Вернее сказать их полезность
    сильно девальвировала. В 20м веке в такие базы много вкладывали. Делали ставку на то что системы
    со строгими правилами позволят выводить новые правила и факты. Но не сбылось.

    Возможно я ошибаюсь и автору нужно на самом деле другое? Что другое? Ну просто какой-то язык
    разметки типа markdown language или вообще confluence где можно макросами расширить функционал
    и просто делать ссылки на формулы. И может быть это автору будет достаточно.

    Вобщем для более глубокого понимания хотелось-бы чтоб автор просто привел парочки примеров. Может
    там реально все проще.
    Ответ написан
    2 комментария
  • Что эффективней, чтение из файла или массив?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Вопрос не глупый а вполне себе хороший.

    Его плавное развитие приводит к концепции баз данных. Самое главное что можно сказать тезисно это
    1) Пока памяти хватает (массив) - используй смело память
    2) Диск - больше и дешевле памяти
    3) С памятью работать легко. С диском - очень неудобно и надо обрабатывать IOExceptions почти всегда.
    Диски внезапно полны сюрпризов. Могут быть сетевыми дисками.
    4) Разные диски имеют скорость на порядки разную.
    5) Диски ведут себя очень плохо на random access. От этого даже метрика IOPS появилась.
    Ее очень любят обсуждать админы баз данных.
    6) Существуют структуры данных которые спецом создавались только для дисков (B+Tree)
    7) Диск - переживает выключение питания.
    8) Самые разумные решения - сочетают в себе и диск и память в тех частях кода где это нужно.
    9) Есть интерфейсы программирования которые виртуализирут диск как память. Этим пользуется
    SQLite например.
    10) Диск может достигать очень высокой последовательной скорости чтения или записи в файл
    при условии отсутствия конкурирующих записей в данный момент. Этим пользуются в БД
    для журналирования событий.

    В принципе если современный программист просто будет использовать только оперативную память
    то никто ему не сможет ударить по рукам или подойти с какой-то метрикой и чего-то там измерив
    сказать что он неправ. Тут уж только падения по OOM и потери информации и performance issues
    могут быть каким-то значимым аргументом.
    Ответ написан
    3 комментария
  • Как оптимизировать элементы на двухмерном массиве(пиксели) в прямоугольники?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Например, есть двухмерный массив:

    Сразу неправильно. В компьютерной графике и графическом моделировании (книжка образца 1990х годов)
    перечислены большинство графических оптимизаций. И практически везде нет никаких много-мерных
    массивов. Забудьте многомерные массивы если хотите перформанса. Это блажь. Забудьте пиксели-объекты. Никаких объектов! Только WORD (ARGB) или индесные цвета.

    Тезисно.
    1) Растровая картинка - всегда отображатеся в 1-мерный массив в памяти. Выравнивается по границе кеш-линии и т.д. Тоесть решил рисовать в 1024х768 в RGB цвете - будь добр выдели - 3145728 байт памяти (я округлил RGB до 4 байтов).

    2) Все операции рисования линий, прямоугольников кругов и полигонов и даже шрифтов - работают через прямой (direct) доступ к памяти. Никто пикселями не рисует. И ежу понятно что накладные расходы на стек и все съедают и когерентность доступа идет всегда неудачно по кешам. Одни промахи. Эти-же принципы реализованы в OpenGL, Direct3d только там еще и с позиции параллелизма. Одну фигурку может рисовать несколько графических ядер.

    Я не знаю как в Python. Здесь надо быть глубоким специалистом в Python чтоб понять как там соптимизировать for. (Я думаю никак). Но все быстрые графические алгоритмы обычно пишуться на C/C++ и там работают с бегущим указателем. Если условия позволяют - делают SIMD. Чтоб за 1 команду закрасить или наложить маску на 2 пиксела сразу. Или на 4. Или на 8.

    Вообще с Питоном идея - тухляк изначально. Если хочешь быстро красить краской прямоугольники в экране - тебя надо реализовать это на сях а потом дописать фасад для Питона чтоб делать вызов сразу рисования прямоугольника. И все современные библиотеки машинного обучения вобщем-то так и реализованы. Питон - только запускает а реализация вращает циклы в других более быстрых языках.
    Ответ написан
    1 комментарий
  • Какую структуру данных выбрать для описания конфигуратора изделия?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Непонятно зачем автор протегал это АЛГОРИТМАМИ. Тут вобщем-то имеет место обычная работа с формочкой.
    Дизайнеры форм лабают это и не зная ваших умных абстракций. Просто пишут там хендлер на каждую радио-кнопку или на чек-боксик и в зависимости от действий - скрывают некоторые филды или подсвечивают.

    Но если вам интересна теория, то такое поведение можно описать небольшим конечным автоматом. Или
    в данной задаче несколькими конечными автоматами которые взаимосвязаны по реакции на переходы.

    Гуглить можно по FSM (Finite State Machine) и библиотек по сям и питонам будет много.

    Вообще данная задача еще не набрала критическую массу знаний чтоб кодить ее в автоматах.
    Время потраченное на библиотеки и на привязку их к формам может быть слишком большим
    и эффекта не будет. Будет разочарование.
    Ответ написан
    3 комментария
  • Как быстро получить случайное слово из файла на 12 ГиБ?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Какая максимальная длина слова? Ну допустим 20 символов.

    Не в курсе насчет питона. Но я-бы убрал фактор плавающей длины. Например я-бы разбил
    этот 12Гб файл на 20 файлов. Допустим в первом будут лежать все слова длиной в 1 символ.
    Во втором 2 символа. И так далее.

    Тогда формула будет такая. Считаем распределение слов по этим 20 файлам. Там гистограмма получается.
    Типа допустим 5% на 8 символьные слова. 8% на 9 символьные и так далее. Выбираем случайный файл
    ну как-бы учитывая "перекос". И потом уже внутри этого файла просто ищем случайное слово. Будет
    быстро потому-что слова уже имеют фиксированную длину.
    Ответ написан
    5 комментариев
  • Почему сортировка вставкой работает быстрее сортировки выбором в самом сложном случае?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Какого размера у тебя массивы? Там для маленьких - вообще теоретическая формула не работает.
    Видимо в силу когерентности кеша тупые и жлобские алгоритмы работают лучше чем умные и сложные.

    Я думаю что теоретическая оценка начинает играть роль тогда, когда массив реально в несколько крат
    превышает хотя-бы кеш L3.

    Я для мелких массивов (2,3 элемента) сортировка пузырем вполне себе делает минимум операций.
    Ее даже можно хардкодить размоткой циклов.

    Есть также вопросы на собеседовании для джунов (Java) которые практически позволяют нагнуть новичка
    показав ему на практике что вставка примитива в ArrayList (массив) работает быстрее чем вставка в LinkedList.

    Опять-же этот эффект заметен на малых размерах массивов.
    Ответ написан
    3 комментария
  • Есть ли простое и быстрое решение определить, что фраза изменена незначительно?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Можно вести подсчет триграмм. (Троек символов). И если разница в небольшом числе триграмм - тогда
    считаем что слова равны с "допуском". Величину допуска можно установить экспериментально исходя
    из тестовых выборок.

    Для случая сходразвал сход-развал.
    сходразвал: схо ход одр дра раз азв вал
    для слова с дефисом из триграмм выпадают
    одр дра
    следовательно допуск равен двум.

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

    mayton2019
    @mayton2019 Куратор тега Java
    Bigdata Engineer
    Поскольку случай - очень простой, то он решается шаблоном. Но если вместо а или б может быть
    тоже выражение - тогда нужно определять свою грамматику. Например:
    min ( min(a,b) , min (c,d) )
    Тогда умные дядьки-теоретики берут язык описания грамматик. EBNF типа. И пытаются
    свой новояз описать в терминах например EBNF https://en.wikipedia.org/wiki/Extended_Backus%E2%8...
    Описывают что такое число. Какое оно. Отрицательное? Вещественное? Экспоентциальное?
    Короче надо описать вообще все что может быть. Описывают функцию минимума.
    Потом по этой грамматике создают парсер. Программно. И парсер на выходе выдает
    дерево. Где корень - это вся грамматика а на листиках будут висеть числа. Или терминалки не помню
    как они это называют. И вот когда ты уже получил это чортово дерево - можно ПРИСТУПАТЬ ко второй
    части задачи - а именно к транформации в инфиксную форму. Но ты сначала реализуй хотя-бы первую
    часть.

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

    mayton2019
    @mayton2019
    Bigdata Engineer
    Насчет корней не знаю. Есть алгоритм Snowball https://snowballstem.org/demo.html#Russian
    Он делает примерно то что нужно. Например сводит облако-облак. Сводит разные слова к основе.
    А то что не смог свести ты можешь попробовать сам дописать в справочник или добавить свои суффиксы.

    И у него есть несколько готовых реализаций на C#/Java. Я думаю что кто-то уже делал реализацию для PHP.
    Ответ написан
  • Как организовать массив состоящий из разных участков памяти?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Напоминает попытку построить свой кеш. А зачем топик тегирован Ассемблером? Какая тут нерешаемая
    для ассемблера задача?
    Ответ написан
    Комментировать
  • Какой язык программирования выбрать для изучения основ работы с алгоритмами и структурами данных?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Алгоритмы и структуры данных тесно связаны с зубо-дробительными бенчмарками. Как-то отсортировать терабайтный текстовый файл или найти два одинаковых числа в файле из чисел тоже большого размера.
    Иногда такие задачи задают на собеседованиях Google и Microsoft.

    И если вы будете изучать эти алгоритмы на js, то вы не сможете продемонстрировать эффективность этих
    алгоритмов. Python машина - просто медленная. У нее конечно есть надстройки например над векторной
    алгеброй которые позволяют быстро считать рутину вроде циклов над векторами. Но является ли это
    программированием Python - чорт его знает. Как по мне - нет. Тут - другая экспертиза нужна.

    В структурах данных важно также оценивать память "на глазок".

    В этом смысла кодер С++ имеет много преимуществ т.к. он видит и понимает как распределяется память
    в узле бинарного дерева например (два указателя по 64 бита + какой-то размер для ключа который тоже
    можно посчитать). Какой аллокатор брать? Встроенный в язык new или нужно делать собственный.
    Такой расчет важен для оценки например - применима ли структура данных вообще?
    Какой толк от дерева если оно не влезет в оперативную память? А падение памяти в swap - тут-же замедляет
    алгоритм в разы.

    JS и Python не предоставляют тонкого контроля над памятью. У них своя модель построенная для комфорта
    самого процесса разработки а вовсе не для струткуры данных.
    Ответ написан
    Комментировать
  • Можно ли сбалансировать бинарное дерево поиска без использования поворотов дерева?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Давайте порассуждаем что такое вообще "поворот дерева". Это - метафора. Это изменение двух потомков двух узлов a и b. По сути это функция transform:
    void transform(Node *a, Node *b) {....}
    при этом (a,b) - состоят в отношении relatives. Родственники.

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

    mayton2019
    @mayton2019
    Bigdata Engineer
    Тут - проще объяснить применительно к конкретным языкам разработки и технологиями. Например время доступа к элементу хеш таблицы Java (HashMap) оценивается как O(1). Тоесть время всегда постоянное и не зависит от прочих условия типа размера таблицы. А если у нас вместо хеш-таблицы - красно-черное дерево (TreeMap) - то тогда время доступа оценивается как O(log n). Тоесть логарифмически зависит от размера данных в дереве.

    Считается что O(1) лучше чем O(log n). Но этот тезис действует на объеме данных близком к бесконечности. На малых объемах структуры - неразличимы или могут менять свои свойства в зависимости от разных начальных условий (были ли в кеше L1/L2/L3 до этого уже прочитанные данные).
    Ответ написан
    5 комментариев
  • Как выбрать объекты на изображении по цветам?

    mayton2019
    @mayton2019 Куратор тега Java
    Bigdata Engineer
    Тебе нужна функция цветовой дистанции между двумя цветами. Типа
    double getDistance(int rgb1, int rgb2) {
        ....
    }

    Формула будет похожа на взвешенную сумму цвета как ты писал выше. Только в цветах
    нужны будут разности r1 - r2 e.t.c. И взять декартово расстояние.

    Она будет возрващать от 0 до некоторого максимального вещественного. Если 0 - то цвета идентичны.

    Задаешь порог чувствительности например 5% и если цвета rgb1 и rgb2 близки - то соотв. считаешь
    что совпадение было. Сравнивать по знаку == цвета нельзя в фотографиях. Там очень редко
    бывает численное совпадение. Практически - никогда не бывает.
    Ответ написан
    6 комментариев