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

    qmax
    @qmax
    программер
    Марковские цепи помогут вычислить сочетаемость букв в именах, и выбирать наиболее "благозвучную" букву по контексту (префиксу).
    Метод архиэффективный и способен породить бесконечннешее количество слов.
    Но только если обучающая выборка достаточно большая.

    Мои рекомендации:
    Используйте длинну префикса 3-4 буквы (примерно длинна слога).
    Боле длинные префиксы будут порождать слова слишком похожие на исходные и их рекомбинации.
    Более короткие будут не очень благозвучны.
    Обязательно используйте символы начала и конца слова в качестве спец-буквы ('^' и '$'), просто пробела недостаточно, но уже не помню почему.

    Для имён имеет смысл генерить их с конца, поскольку окончания у имён специфичные, и рандом может долго не попадать на концевую цепочку, порождая излишне длинные слова. А при генерации с конца можно просто по критической длинне принудительно оборвать слово, или выйти на ближайшей остановке.

    Для хранения эффективно использовать префиксное дерево с частотами в качесве значений.
    Алгоритм составления словаря довольно простой:
    prefix = '^'
    for letter in text:
      freqdict[prefix+ letter] += 1 # увеличение счётчика этого сочетания
      if letter ='$':  # конец слова, сброс префикса
        prefix = '^'
      else:
        prefix = prefix[-depdth:] # обрезане префикса до максимальной длинны

    После этого нужно нормальизовать значения для каждого префикса, чтобы
    для каждого префикса сумма значений всех хвостов была = 1.
    При таком раскладе можно "склеить" частоты в единичный отрезок, разделёный на части пропорционально частоте, и рандомом выбирать "взвешенно-равномерно".

    Алгоритм генерации:
    prefix = '^'
    while prefix[-1] != '$':
      tails = freqdict[prefix].items() # под-дерево всех продолжений префикса в виде списка (key, value)
      thresh = random() # точка на единичном отрезке
      i = 0 # текущий элемент
      level = 0 # верхняя граница отрезка текущего элемента
      while thresh > level:
        level += tails[i][1]
        i++
      prefix += tails[i][0]


    Код написан по памяти, не принимайте на слово :)
    Наверно, мне уже пора выкладывать библиотеку для рыбогенерации...
    Ответ написан
    3 комментария
  • Где взять список хороших и плохих слов?

    qmax
    @qmax
    программер
    распарсить кучу отзывов, где оценки выставлены вручную и есть текст (flamp, google play market)

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

    qmax
    @qmax
    программер
    онлайн сервис:
    www.lucidchart.com

    Есть всяческие типы диаграм и экспорт в разные форматы.
    Но какие-то ограничения в бесплатном аккаунте.
    Ответ написан
    Комментировать
  • Задача с замощением прямоугольной области L образной плиткой

    qmax
    @qmax
    программер
    Можно попробовать заполнять обасть по рядам.
    Каждый ряд разбивать на отрезки (длинной 1 или 2), относящиеся к одной плитке.
    Каждое заполнение будет порождать ограничения (шаблон) для заполнения следующего ряда.

    Конкретно, каждый новый (не из шаблона) отрезок порождает для следующего ряда два варианта заполнения в смежных клетках.

    [_][2][2][_]
    [_][1][_][_]

    [_][2][2][_]
    [_][_][1][_]

    [_][_][1][_][_]
    [_][2][2][_][_]

    [_][_][1][_][_]
    [_][_][2][2][_]

    Ну только хранить это надо чуть хитрее, чем просто клеточки.
    Ответ написан
  • Сколько треугольников на картинке?

    qmax
    @qmax
    программер
    ДЛЯ ПОТОМКОВ: не верьте всему, что пишут в интернетах! это решение неправильное!

    При увеличении стороны треугольника на 1
    C(i+1) =
    C(i) /* все треугольники предыдущей фигуры (которая со стороной i) */
    + 2i+1 /* треугольники со стороной 1, пририсованные к одной из сторон предыдущей фигуры*/
    + i /* треугольники со стороной 2 накладывающиеся на предыдущую на 1 */
    + i-1 /* треугольники со стороной 3 накладывающиеся на предыдущую на 2*/
    + i-2 /* треугольники со стороной 4 накладывающиеся на предыдущую на 3*/
    + итд до нуля (тоесть до i-i)
    Ответ написан
    1 комментарий
  • Какие почитать учебники по алгоритмам?

    qmax
    @qmax
    программер
    В любом случае имеет смысл также приобрести и прочесть библию программирования Дональда Кнута:
    Том 1. Основные алгоритмы
    Том 2. Получисленные алгоритмы
    Том 3. Сортировка и поиск

    Если других книгах есть тоже, что и у Кнута - это ненужные книги.
    Если в других книгах есть то, чего нет у Кнута - это неправильные книги.
    Ответ написан
    4 комментария
  • Веб-приложение: запрет многократных голосований пользователем

    qmax
    @qmax
    программер
    вести syslog, в который писать все события голосования (а может быть заодно и другие, типа создания сообщений/комментариев)
    решит проблему и одноразового голосования, и голосования типа «раз в день»
    Ответ написан
    5 комментариев