• Как заполнить структуру данными?

    wataru
    @wataru Куратор тега Алгоритмы
    beduin01, Может быть a,b,c,d,e,f,g, а может быть a,b,e,c,d,f,g.
  • Как реализовать алгоритм рекурсией?

    wataru
    @wataru Куратор тега Алгоритмы
    Станислав Некрасов, не питонист я. Спасибо за комментарии.
  • Как заполнить структуру данными?

    wataru
    @wataru Куратор тега Алгоритмы
    beduin01, Вот я пытаюсь формализовать порядок. Вот какой он будет для структуры:{a: {b:{c:"", d:""}, e:{f:"",g:""}}}?
  • Как заполнить структуру данными?

    wataru
    @wataru Куратор тега Алгоритмы
    beduin01, Важный вопрос, в каком порядке даны данные в массиве? Почему оба name даны в конце, почему первый идет вместе с первым number?
  • Как реализовать алгоритм рекурсией?

    wataru
    @wataru Куратор тега Алгоритмы
    1Tima1, Я отредактировал ответ, дописав комментарии в код. Но вроде все должно быть понятно и без них. Код довольно простой.
  • Как реализовать алгоритм рекурсией?

    wataru
    @wataru Куратор тега Алгоритмы
    1Tima1,

    По первому вопросу: s[i] - это i-ый символ в строке (считая с 0).

    Сравнения там делаются чтобы отделить цифры от букв и от скобок. Вы у себя сморите, что символ один из numers, но можно это сделать сравнениями '0'<=s[i] and s[i] <= '9'. Сравнение строк же происходит посимвольно. Это не идеальный способ в питоне, возможно есть более корректный метод, я не питонист.

    ord(s[i]) - ord('0') - должно выдвавть численное значение цифры. Для '7' - должно вернуть 7. Пользуется тем, что цифры идут в алфавите подряд с 0 до 9.

    Важно отментить, что мой пример решения не работает с юникодом, а только c ascii текстом. Можно изменить так, чтобы работало не только с английским алфавитом. Для этого надо выделать в тексте только цифры и скобки, а все остальное считать текстом. Т.е. заменить проверку на то, чот символ от 'a' до 'z' проверкой что символ не цифра и не скобка.

    Зато мое решение, в отличие от вашего, работает с многозначными числами и "123a" распакует именно как 123 копии "a", а не 1 копию "2" и 3 копии "a".
  • Как правильно хранить ключ шифрования для десктопных приложений?

    wataru
    @wataru
    > Даже мастер-пароли могут украсть во время их ввода и обработки.

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

    wataru
    @wataru
    Если пользователь расскажет свои пароли кому-то, то это не ваша проблема. Если пароли из вашего приложения утекли, потому что пользователь сидит под админом, то на хабре будет статья "приложение X взломали".
  • Как правильно хранить ключ шифрования для десктопных приложений?

    wataru
    @wataru
    Gennady S, Это так не работает. Пользователи запускают левые файлы по рекламным ссылкам из-под администратора. В конце концов, есть уязвимости.
  • Как объеденить пользователей с общим имейл?

    wataru
    @wataru Куратор тега Алгоритмы
    Какой изврат. Любое решение этой задачи будет так или иначе работать с графом. Возможно неявно.

    Вы не называйте граф - графом, и будет без графов)

    Один хешмап будет по пользователю выдававть список емейлов. Второй - по емейлу список пользователей. Третий - по пользователю или емейлу выдавать выведен ли этот пользователь уже или нет.

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

    Фактически, это обход в глубину на двудольном графе, но выглядит, что вы берете всех пользователей с тем же мылом и выводите все их имейлы и берете всех пользователей с такими же имейлами и выводите все их остальные емейлы, и так по кругу, пока все не соберете.

    Тут видно, что работает за линейную сложность - GetAllMails может запуститься только один раз от каждого пользователя. Внутри оно один раз проходит список его емейлов. Для каждого емейла ровно один раз, при выводе, будет пройден список всех пользователей с таким мылом.
  • Как объеденить пользователей с общим имейл?

    wataru
    @wataru Куратор тега Алгоритмы
    Андрей Шалыгин, Прям вам в условии и сказано, что должно быть 2 hashmap'a? Если так надо, вы можете использовать их для храниния ребер в графе - для каждого пользоватля выдавать список емейлов и наоборот. Еще нужно будет как-то хранить пометки обойденных вершин. Это еще один хешмап. Если нужно ровно 2 - то один для ребер, второй для пометок.

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

    wataru
    @wataru Куратор тега C++
    Для 3 это одно и то же.
  • Как найти в графе все циклы определённой длины?

    wataru
    @wataru Куратор тега C++
    Вам количество, или вывести сами циклы вывести еще надо?
  • Как перемешать массив одинаково для всех?

    wataru
    @wataru Куратор тега Алгоритмы
    twobomb, Что уж там, тогда делайте просто function rand() {return 0;} Тоже в некотором смысле перемешано будет. Хоть вариант и всего один будет.

    Но в вопросе указано:
    Но при этом результат должен быть уникальным, не таким каким был с предыдущим числом.


    Это вообще сложно гарантировать с использованием псевдослучайного генератора. Но в вашем примере будет всего 67 перестановок (может и меньше), несмотря на то, что seed может принимать очень много значений и перестановок возможных очень много. Вряд ли это удовлетворительное решение.
  • Как перемешать массив одинаково для всех?

    wataru
    @wataru Куратор тега Алгоритмы
    Во-первых, не надо сортировке выдавать самопротиворечивую функцию сравнения.
    Она и в O(N^2) может запросто скатиться, а то и повиснуть. И может выдавать разные результаты при одинаковых входных данных:
    compareFunction(a, b) must always return the same value when given a specific pair of elements a and b as its two arguments. If inconsistent results are returned, then the sort order is undefined.


    Во-вторых, раз уж у вас есть rand() с seed, то можно перемешать массив вот этим стандартным методом, что 100% быстрее и без возможных спец-эффектов:

    for (i = 1; i<arr.length; ++i) {
     let j = floor(rand()*(i+1));
     let tmp = arr[i];
     arr[i] = arr[j];
     arr[j] = tmp;
    }
  • Как решить задачу на C++ быстрее чем за n^2?

    wataru
    @wataru Куратор тега Алгоритмы
    Proshka17, И как в итоге сделали, дерево отрезков или сбалансированным бинарным деревом?
  • Как решить задачу на C++ быстрее чем за n^2?

    wataru
    @wataru Куратор тега Алгоритмы
    xmoonlight, Я правильно понимаю, что составляется некоторая таблица, в которой ключ - тройка чисел (какой символ надо зашифровать, где этот символ в текущей перестановке, номер итерации), так? Я точно что-то путаю же?

    Могли бы вы показать работу вашего алгоритма по шагам (приведите то, что вы называете "кубом") для примера из трех символов в алфавите. Зашифруйте, пожалуйста, текст "3 1 2 3" (ответ "3 2 3 3") и "3 1 1 3" (ответ "3 2 1 2").
  • Какой выбрать язык для криптографии?

    wataru
    @wataru
    Лентюй, Если вам нужна скорость, то вопрос выбора языка перед вами не стоит вообще. Берете готовую библиотеку к языку в вашего проекта. Или выбираете язык по каким-то вашим критериям.

    Сама же библиотека будет на С, вылизанная с ассемблерными вставками, и обернута в интерфейс для вашего языка.
  • Почему неправильно работает такая реализация алгоритма быстрой сортировки?

    wataru
    @wataru Куратор тега C++
    AnT, Когда у вас глубина рекурсии достигает ~N в неоптимизированной реализации, то у вас сортировка, даже с вашей оптимизацией, будет работать за O(N^2). Если N такое большое, что O(N) памяти в стеке страшно завести, то вам в любом случае уже сильно поплохеет. Даже без оптимизации рекурсии.

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

    wataru
    @wataru Куратор тега C++
    Потому что фигню сделали в quicksort(). Мало цикл закомментировать, надо всегда делать 2 рекурсивных вызова. А у вас один будет - в какой-то ветке if-else. Сравните с этим кодом.