Задать вопрос
Ответы пользователя по тегу Алгоритмы
  • Нужно преобразовать номерную емкость из одного формата в другой, кто может подсказать алгоритм?

    @throughtheether
    human after all
    Я бы на вашем месте использовал префиксные деревья. Суммаризацию (вам же необходимо минимальное количество префиксов, или, как вы их называете, "масок"), скорее всего, придется писать самостоятельно.
    Ответ написан
    Комментировать
  • Как рассчитать какое слово будет сгенерировано?

    @throughtheether
    human after all
    У вас по сути четверичная система счисления, с символами qwtj вместо цифр 0123.
    Как узнать каким будет 5000 слово?
    Переводите 5000 из десятичной в четверичную систему счисления, заменяете цифры на символы.
    И как узнать сколько всего слов будет?
    Мощность алфавита в степени длины слова.
    Ответ написан
    1 комментарий
  • Какой здесь алгоритм шифрования?

    @throughtheether
    human after all
    Вы можете новые записи создавать? Если да, попробуйте провести атаку типа chosen plaintext, создайте записи с полями вида 'а', 'аа', 'ааа', затем 'б', 'бб', 'ббб'. Может быть, что-то прояснится (или нет).
    Ответ написан
  • Как равномерно визуализировать узлы дерева?

    @throughtheether
    human after all
    Спасибо, что "призвали", помогу чем смогу.

    узлы-братья удалены друг от друга на динамически задаваемое значение (в данном случаи 20), так же как и узлы-соседи (в данном случаи 40)
    Давайте с терминологией определимся, под соседями подразумеваются узлы на одном уровне дерева, не имеющие общего непосредственного родителя (не братья)?

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

    Если есть какие-то идеи я буду рад выслушать
    Идея такая. Дерево, как правило, имеет на нижних уровнях больше узлов, чем на верхних. Больше узлов - меньше свободы в плане сколь-нибудь равномерного их размещения. Так и начинайте снизу. Из готовых алгоритмов навскидку могу только вспомнить Tidier drawing of trees (за авторством Reingold, Tilford), вполне возможно, что удастся его адаптировать под ваши требования.
    Ответ написан
  • Когда начинать изучать алгоритмы и структуры данных?

    @throughtheether
    human after all
    Дайте совет, когда и как стоит приступать к этим вкусняшкам?
    Когда у вас появятся релевантные задачи. Например, как вам уже рекомендовали, "олимпиадные". (рекомендую codeeval и codewars). Вы можете сначала решить задачу каким-либо "наивным" способом, затем поискать (спросить) подходящую структуру данных, сравнить производительность подходов. На мой взгляд, привязка к какой-никакой практике позволяет знаниям лучше усваиваться.

    Еще могу порекомендовать курс (там две части) на coursera от Stanford за авторством Tim Roughgarden. Очень доступно объясняет.
    Ответ написан
    1 комментарий
  • Как улучшить скорость функции?

    @throughtheether
    human after all
    Что можете посоветовать?

    sum(range(n+1)) - константа (в дальнейшем, C) для заданного n, можно вынести ее вычисление за цикл.
    Далее, ваше уравнение можно переписать: b = (C-a)/(a+1). Можно перейти от квадратичного времени к линейному, итерируя по a и проверяя делимость (C-a) на (а+1)

    Навскидку:
    def get_ab(n):
    	C=sum(xrange(1,n+1))
    	return [(a, (C-a)/(a+1)) for a in xrange(1,n+1) if (C-a)%(a+1)==0 and (C-a)/(a+1)<n]


    In [10]: % timeit removNb(10)
    1000 loops, best of 3: 185 us per loop
    In [11]: %timeit get_ab(10)
    100000 loops, best of 3: 6.74 us per loop
    Ответ написан
    3 комментария
  • Как решить задача связанную с такой арифметической прогрессией?

    @throughtheether
    human after all
    Значение на i-том месте (начиная счет с единицы) равно 2i(i-1). Если надо найти индекс значения, то необходимо решить квадратное уравнение вида 2i(i-1)=A, где i-переменная.
    Ответ написан
    1 комментарий
  • Почему алгоритм Дейкстры корректен?

    @throughtheether
    human after all
    После выполнения алгоритма, мы получим, что кратчайшее расстояние до второй вершины равно 10.
    Вот здесь непонятно, поясните вашу мысль.

    Изначально (стартуем из вершины 1) у вас вершина 1 имеет ассоциированное число (длину пути, d[1]) 0, она же находится во множестве посещенных вершин. Длина пути до других вершин - бесконечность.
    Для всех ребер, соединяющих множества посещенных и непосещенных вершин (т.е. для ребер 1-2 и 1-3) рассмотрим суммы d[u]+w(u,v), где d[u]-длина кратчайшего пути до вершины u, w(u,v) - вес (длина) соответствующего ребра. Минимальная сумма наблюдается для ребра 1-3, соответствующего пути 1,3. Добавляем 3 в посещенные.
    Снова, для всех ребер, соединяющих множества посещенных и непосещенных вершин (т.е. для ребер 1-2, 3-2) рассматриваем соответствующие суммы (10 и 2), выбираем минимальную, т.е. добавляем вершину 2 в путь (и во множество посещенных вершин), имеющий вид 1,3,2. Так как непосещенных вершин не осталось, завершаем работу алгоритма.
    Ответ написан
    2 комментария
  • Что такое конкатенация битовых образов символов?

    @throughtheether
    human after all
    Что такое конкатенация битовых образов символов?
    Предполагаю, битовый образ строки определяется при помощи строкового "сложения" битовых образов символов. Например, при алфавите {A,B,C,D} и битовом представлении A:00,B:01,C:10,D:11, строка ABBA будет иметь представление 00010100.
    Ответ написан
    Комментировать
  • Возможно ли обратить SHA-256?

    @throughtheether
    human after all
    Возможно ли обратить SHA-256?
    В общем случае это называется preimage-атакой. В таблице по ссылке указаны примерные оценки вычислительной сложности проведения подобных атак. Сложность порядка 2^128, насколько мне известно, считается достаточной для того, чтобы полагать атаку непрактичной.

    можно ли найти серийник?
    Если вы обладаете каким-либо знанием о структуре серийного номера, позволяющем вам на порядки (до значений, делающих атаку практичной) сократить мощность множества возможных вариантов, то логично попытаться реализовать атаку грубой силы (brute force).

    сколько серийников может быть у одного хэша SHA-256?
    В вашем случае, думаю, разумно предполагать соответствие от 0 до 1 серийных номеров произвольному хэшу.
    Ответ написан
    Комментировать
  • Как найти вдохновение в своей специальности?

    @throughtheether
    human after all
    Написал пятнашки, крестики нолики в консоли с применением мега мелькающей дефолтной графики по средствам раскрашивания askii.
    Может подскажите что можно написать ради себя, ради души и практики,
    Напишите игру/демку, кторая рендерится в ascii-символы, вот пример.
    Ответ написан
    Комментировать
  • Aсимптотическая сложность взаимной корреляционной функции?

    @throughtheether
    human after all
    Интересует верхняя граница O(???) для ВКФ дискретных последовательностей длины l и k (к примеру l меньше k) с единичным лагом

    Навскидку, Ο(k^2). Подразумеваю, последовательности одномерны.
    Представим себе окно шириной k, будем в него вдвигать последовательность длины l. Всего возможно k+l вариантов. Для каждого варианта необходимо посчитать скалярное произведение содержимого окна и последовательности длины k (комплексно-сопряженной к исходной), что потребует Θ(k), или Ο(k). Перемножая, отбрасываем младшие члены, получаем Ο(k^2).
    Ответ написан
    Комментировать
  • Реализации двоичной кучи. В чём не корректен код?

    @throughtheether
    human after all
    if (command == com_extract) {
    			cout << bh.heapSort() << endl;
    		}

    Вам надо извлечь корневое значение, восстановить свойство кучи и вернуть предварительно извлеченное значение. Мне не вполне ясно, что вы делаете:
    int heapSort()
    	{
    
    		for (int i = heap_data.size() - 1; i >= 0; i--)
    		{
    
    			heapify(0);
    			return extract();
    		}
    	}

    Почему, например, return в цикле?
    Если я правильно понял, то вам надо строку cout << bh.heapSort() << endl; заменить на cout << bh.extract() << endl;
    Ответ написан
    4 комментария
  • Каким будет время работы построения кучи?

    @throughtheether
    human after all
    Каким будет время работы построения кучи, если просто последовательно добавить в кучу все n элементов?

    Мне нужно выбрать все верные варианты из следующих
    O(n)
    Ω(n2)
    Ω(n)
    O(n2)
    Ω(nlogn)
    O(nlogn)

    Если мы последовательно добавляем элементы (всего их n) в кучу (бинарную кучу) и каждый раз восстанавливаем свойство кучи (верхняя оценка сложности O(logn), нижняя оценка Ω(1)), то верхняя оценка общей сложности будет O(nlogn), нижняя - Ω(n). Правильные варианты, на мой взгляд:
    Ω(n), O(n2) (если имеется в виду O(n*n)),O(nlogn)
    Ответ написан
    Комментировать
  • Как расположить функции в порядке увеличения скорости роста?

    @throughtheether
    human after all
    Предполагаю, порядок таков:
    3 1 4 5 6 7 2
    В частности, f1(n)=n^0.3 < f4(n)=n^0.5
    Ответ написан
    3 комментария
  • Что такое "асимптотически точная оценка времени работы алгоритма"?

    @throughtheether
    human after all
    Мое авторитетное мнение дилетанта таково.
    Во-первых, имеет смысл ознакомиться с первоисточником по данной теме, а именно со статьей Дональда Кнута. В ней на стр.19 дается удобное, на взгляд автора, определение отношений Θ,O,Ω. Эти отношения первоначально задаются как отношения значений неких двух функций. Оценка временной и пространственной сложности - это приложения. Целью введения такой нотации было упростить вычисление количества операций, требуемых для выполнения алгоритма, без потери качественных характеристик, а также отвязаться от возможных зависимостей от архитектуры, компилятора и т.д. Грубо говоря, если алгоритм обсчитывает 1000 единиц входных данных час, то эта нотация помогает быстро оценить, как долго будут обсчитываться, например, 2000 единиц. Естественно, что эта нотация "огрубляет" информацию о значениях функции, в этом ее предназначение.

    Что такое «асимптотически точная оценка времени работы алгоритма»?
    Если речь идет о Θ-нотации, то это функция (или множество функций), растущая так же быстро, как и время работы алгоритма с увеличением длины входных данных.

    Оценка Θ() существует только тогда, когда O() и Ω() совпадают и равна им.
    Это положение мне представляется частично верным. Если f(n)=O(g(n)) и f(n)=Ω(g(n)), то f(n)=Θ(g(n)), где g(n) - некая функция, например, вида nlogn. Другое дело, что если f(n)=O(n), то также верно, что f(n)=O(n^2), то есть, несмотря на то, что у функции есть Θ-оценка, ее O- и Ω-оценки могут не совпадать.

    Итак, O() - асимптотическая оценка алгоритма на худших входных данных, Ω() - на лучших входных данных
    Если определить "лучшие"/"худшие" данные как требующие минимального/максимального времени среди наборов входных данных такой же длины, то это утверждения мне также представляется частично корректным. Количество операций, которое выполняет алгоритм в худшем, среднем и лучшем случаях - это функции от длины входных данных. Каждую из этих функций можно оценить при помощи каждой из трех (Ω,Θ,O) нотаций.

    Мне представляется разумным такое восприятие оценок:
    f(n)=O(g(n)) - функция f(n) растет не быстрее функции g(n)
    f(n)=Ω(g(n)) - функция f(n) растет не медленнее функции g(n)
    f(n)=Θ(g(n)) - функция f(n) растет так же быстро, как и функция g(n)
    Попробуйте нарисовать график некоей возрастающей функции в логарифмическом масштабе по оси ординат, и представить, где расположены значения функций, корректно оценивающих исходную при помощи Ω,O,Θ нотаций, пользуясь определениями из статьи Кнута и отметив на графике константы C и n0.


    Известно, что например для сортировки qsort средняя оценка для случайного распределения входных данных (она же лучшая, для полностью сбаллансированного варианта) равна Θ(nlogn),
    С моей точки зрения, корректно также будет сказать, что средняя оценка также равна O(nlogn) или Ω(n).

    тогда как верхняя оценка (для специально подобранных неоптимальных данных) равна O(n^2).
    а также равна Θ(n^2).

    Правильно ли будет сказать, что реально асимптотически точная оценка алгоритма дается в первую очередь на основании особенностей работы конкретного алгоритма для усредненных входных данных (понимая под усредненными данными случайно распределенный массив данных), а в сложных случаях - отталкиваясь от оценок сверху O() и снизу Ω()?
    С моей точки зрения, если есть совпадающие оценки O и Ω, элементарно получается Θ-оценка. Другое дело, что "худшая", "лучшая", "средняя" вычислительные сложности - это функции от длины входных данных. Для каждой из этих функций может быть дана оценка асимптотической скорости возрастания, будь то Ω, Θ или O. Рассуждая о "случайно распределенном массиве данных", можно углубиться в матстатистику, что, на мой взгляд, не упростит задачу.

    Пользуясь случаем, рекомендую курс на coursera от Tim Roughgarden. Релевантные видео есть на youtube.
    Ответ написан
    9 комментариев
  • Как решается уравнение x^x?

    @throughtheether
    human after all
    напомните пожалуйста быдлокодеру как решаются уравнения типа
    x^x = c, где с - известная константа
    Я в свое время решал так:
    1) перебором находим такие целые i, i+1, что i^i<=c<=(i+1)^(i+1). В случае равенства возвращаем соответствующее значение.
    2) продолжаем при помощи метода деления отрезка пополам (он же метод бисекции, решаемое уравнение имеет вид x^x-c=0), пока длина отрезка не станет меньше некоего порога точности (или значение функции x^x в точке не будет в необходимой окрестности константы c).
    Ответ написан
    Комментировать
  • Алгоритм сортировки массива точек в трехмерном пространстве относительно заданной?

    @throughtheether
    human after all
    Существует ли быстрый алгоритм сортировки массива точек в трехмерном пространстве относительно заданной?
    Я не знаю, что вы подразумеваете под словом "быстрый", но мои соображения таковы:
    1) определить расстояние от каждой из n точек до заданной - O(n) (даже Θ(n)). Я не вижу здесь потенциала для фундаментального улучшения.
    2) отсортировать массив - O(n*logn) в лучшем случае.
    Итого - O(n)+O(n*logn)=O(n*logn).

    Другое дело, что если входные данные имеют специфическую структуру, то можно, при соответствующем подходе, понизить (или попытаться понизить) "константы" O-нотации и соответственно время выполнения.
    Ответ написан
  • Как сгенеририровать строку по id?

    @throughtheether
    human after all
    Есть пользователь с закрепленным за ним id (например, 10 цифр). Надо получить уникальную строку из букв и цифр большей длинны (около 200). Надо что бы в любой момент эту строку можно было получить зная только id юзера, не прибегая к БД.

    Наивный (но имеющий место, на мой взгляд) подход таков. Вычисляете 2-3-4 различных хэш-суммы (md5, sha-1, и т.д.) от id + произвольная соль (которую храните глобально). Полученные 'hexdump', т.е. представления хэшей в шестнадцатеричном формате конкатенируете. Результат кодируете в base64. Для достижения необходимой длины может понадобиться: 1) конкатенация хэша с самим собой несколько раз, до кодирования 2) конкатенация результата base64-кодирования с самим собой несколько раз.

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