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

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Если нет простой формулы, как в линейном случае (например, логарифм или корень числа), то за О(1) можно только если числа не очень большие: надо предподсчитать ответы для всех возможных индексов.

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

    Если запрос только один, то можно не париться, ибо время на загрузку массива с отрезками вы уже потратили и вся программа уже точно O(n) как минимум.
    Ответ написан
    Комментировать
  • Как использовать getline с файлом?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Открывайте файл через ifstream (или wifstream).
    Вот эту вот штуку и передавайте вместо wcin.
    Ответ написан
    Комментировать
  • Где на практике применяются комплексные числа? В каких сферах IT они нужны?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Вряд ли вам придется использовать на практике комплексные числа, группы и кольца. Их вам дают потому что без этого не дать остальные курсы математики, а математику дают, потому что это здорово вправляет мозги в сторону алгоритмического мышления, что очень полезно в программировании.

    Но вообще, комплексные числа, группы и кольца очень часто используются в криптографии, намример. Сами алгоритмы шифрования и обмена ключами (всякие там RSA, Diffie-Hellman) - это вообще часто чистая математика с этими объектами. Плюс, комлпексные числа используются в быстром преобразовании Фурье, которое позволяет быстро перемножать огромные числа, а эта операция в криптографии тоже очень важна.
    Ответ написан
    Комментировать
  • Как эффективно хранить неопределенное количество разных типов данных?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Ну, без дырок совсем не получится. Во-первых, сами структуры могут быть с дырками из-за выравнивания. Потом, не любой тип можно положить куда угодно, опять же, из-за выравнивания. Далее, при удалении будут образовываться дырки, которые не факт что и можно заполнить (без медленного перелопачивания всей структуры).

    Евгений Шатунов правильно говорит, что это уже алгоритм аллокатора получается, а не структура данных. Ну а дальше, можно как-то выделять сырую память под ваши элементы, и в соседнем векторе указателей хранить где будет лежать i-ый элемент для быстрого доступа.
    Ответ написан
  • Что возвращает return в С++?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Зависит от кода функции и опций компилятора.

    Советую всем программистам на C++ хотябы почитать про ассемблер.
    Стек, регистры, вот это вот все. Тогда станет понятно, как работает процессор.

    Тогда станет понятно что "сам объект tmp" никак не вернуть. Это локальная переменная, лежащая на стеке в части, которая будет отброшена при выходе из функции. Отсюда вытекает, что вообще говоря, там должна быть копия.

    Но есть такая оптимизация, как RVO. В стандарте даже прописано, когда конкретно она гарантирована. Тогда копии не происходит. При этом компилятор вообще не создает локальной переменной. А вместо этого сразу же работает с тем местом, куда надо будет возвращать значение.

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

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Сначала выделяется массив какого-то размера, например 256. Обычно длина - степень двойки. Потом хеш обрезается до размера таблицы. Если элементов становится слишком много, то происходит перехеширование - размер таблицы увеличивается, и все элементы в нее перезапихиваются.

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

    Edit:

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

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Вам понадобятся стандартные функции log, abs, sqrt.

    Дальше вам остается только скомбинировать как записано в задании.
    Ответ написан
    Комментировать
  • Как работает long long int в C++?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Это просто 64 битный (обычно) тип. Сейчас процессоры умеют работать с такими числами напрямую, без "склеивания" двух 32 битных чисел.
    Ответ написан
    4 комментария
  • Как сделать так чтоб в консоли кода можно было водить градусы?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Чем градусы отличаются от сантиметров, килограмм или, допустим, количества камней при вводе?

    Ничем. В консоли можно вводить только числа. А вот что за единицы измерения у этих чисел - это уже вам решать, как их интерпретировать. Хотите, чтобы введенное число было градусами - ну так просто интерпретируйте его как градусы (еще хорошо бы переменную назвать так, чтобы по названию была видна единица измерения. Например angle_deg).

    Со вводом разобрались. Осталось интерпретировать переменную как градусы. Как к ней прибавить 45 градусов? Как к 2 яблокам прибавить 3 яблока и получить 5 яблок? Градусы с градусами можно складывать точно так же. Тупо прибавьте 45 к числу в переменной.

    Далее, у вас там есть вызов тригонометрической функции cos. Читайте справку: в каких единиах измерения функция принимает углы? В радианах. А у вас угол в градусах. Поэтому надо перевести градусы в радианы и результат уже передавать в cos. Как это сделать? Спросите у гугла - он вам формулу напишет прямо над результатами поиска. Пи, которое вам понадобится при переводе, уже есть в стандартной библиотеке.
    Ответ написан
    Комментировать
  • Как правильно передавать QByteArray по двойной ссылке в функцию?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Ошибка
    Call to non-static member function without an object argument


    Если добавить static, сами уже проверили - ошибка исчезает:
    static void FileModifier::writeFile(QByteArray&& fileDataBuf)


    Внезапно, если добавить ключевое слово static, то функция перестает быть non-static. Какая неожиданность /s

    Погуглите, что ли, что static в C++ означает.
    Ответ написан
  • Алгоритм разбиения?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Алгоритм простой - рекурсивно генерируйте все разбиения.
    Текущий предмет может пойти или в одну из занятых кучек, или в первую пустую, если они есть.
    Так, первый предмет обязательно пойдет в первую группу. Второй может пойти в ту же или во вторую. И т.д.
    Чтобы не было пустых групп, элемент обязательно кладется в первую пустую, если их осталось столько же, сколько осталось элементов распределить. Ну, и, нельзя создавать новую группу, их уже, сколько надо. Удобнее распологать элементы с конца.
    Что-то вроде такого:
    def partition(n, k, answer):
        if n == 0 :
          yield answer
        cur_len = len(answer)
        if k-cur_len < n:
            for i in range(cur_len):
                answer[i].append(n)
                yield from partition(n-1, k, answer)
                answer[i].pop()
        if cur_len < k:
            answer.append([n])
            yield from partition(n-1,k, answer)
            answer.pop()
    
    for x in partition(4, 2, []):
        print(x)


    Вроде как set_partitions из пакета more-itertools делает именно то, что вам надо, но так-то алгоритм - всего несколько строк.

    Этот алгоритм переберет все разбиения без повторов, потому что групировка элементов однозначно задает и порядок групп (группа с 1 - всегда первая. Потом группа с минимальным элементом - вторая и т.д.)

    Edit:
    Если же вам надо разбить предметы по 1, 2 и т.д. групп сразу же, а не только на фиксированные k групп, то надо чуть поменять условия в коде - надо сделать return в начале, после yield, и можно будет ставить предмет в любую группу или в новую всегда. Параметр k будет не нужен.
    Ответ написан
  • Как перевести число в соответствующий ему символ?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    '111' - это что вообще? В одиночных кавычках пишут символы, а у вас там строка из трех.
    Ответ написан
  • Как подсчитать кол-во обменных операций в быстрой сортировке?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Да, не правильно. Вы от балды в случайных местах увеличиваете счетчик, на какие-то случайные числа (то 2, то 1, то 3?). Когда как вам надо же считать количество операций обмена.

    Кстати, по английски этот обмен - "swap".
    Ответ написан
    9 комментариев
  • Как правильно перевести GPS координаты из одной системы в другую?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Пока похоже, что первые 3 символа - градусы * 6.
    Потом 2 символа минуты, потом '0', потом 2 символа секунды. Последние 2 символа непонятно как переводятся в десятичные доли секунд. Есть подозрение, что вы ошиблись с координатами на гуглмапсах.

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

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

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Зависит от того, что за алгоритм шифрования вы используете. В некоторых алгоритмах это просто невозможно. Вот вы где приватный ключ-то брали? Вот там публичный и получайте. Обычно приватный и публичный генерируются сразу парой.

    А так, если разберетесь, что там за алгоритм используется (в биткойне, судя по тегам?) и в каком формате данные в этом ключе записаны, то какой-нибудь Crypto++ будет содержать все необходимые вам утилиты (длинная модульная арифметика какая-нибудь). Но готовой функции GetPubicKeyFromPrivateKey скорее всего нигде не существует. Придутся самостоятельно писать всякую математику.
    Ответ написан
    Комментировать
  • Выдает то signal: illegal instruction core dumped то stack smashing detected terminated. Как исправить?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Строки ваши подлиннее сделайте. Вы там по 2 символа для каждой выделяете. Но надо еще место для закрывающего 0 оставить. Поэтому, если пользователь вводит более 1 символа, происходит переполнение стека.
    Ответ написан
    Комментировать
  • Нужно вывести данные из двоичного файла. Все выводит в консоль, но после завершения метода (именно после него) вылетает ошибка. Где она?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Скорее всего MyStruct содержит указатели. Может там std::string тип поля, а там внутри указатель на данные.

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

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Если нет пауз между буквами, то задача однозначно не решается:
    Например, "vz" и "3d" одинаково кодируются "...---.." ("...-- -.." и "...- --..").
    В худшем случае, неправильная интерпретация первых символов может сделать расшифровку в самом конце невозможной.

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

    Тогда надо разбить строку на отдельные "слова" - группы тире и точек, разделенные пробелами и каждую группу перевести в букву по таблице. Таблицу в идеале надо хранить в trie ("бор" по русски), но эта структура не реализована в стандартной библиотеке C++, поэтому можно воспользоваться просто std::map<std::string, char>

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

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    O(1), если "var/www/project" фиксированна. Сравнение двух произвольных строк - линейная сложность.
    Ответ написан
    Комментировать
  • Какая сложность данного алгоритма?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Сложность: простой.

    Если вам нужна ассимптотическая временная сложность - то O(n).
    Эта сложность меряется в зависимости от размера входных данных. Какие у вас входные данные-то? Строка slug, url.

    Эти данные конкатенируются (O(n)) и передаются библиотеке. До 10 раз. Библиотека их парсит, делает dns запрос, открывает сетевое подключение к web серверу, получает данные, парсит ответ. Там тоже есть линейная, видимо, зависимость от длины строки. Ее надо распарсить, записать в сетевой сокет и так далее. Вот получение данных по уже установленному http соединению от длины строки не зависит, поэтому в сложности алгоритма не учавствует.
    Ответ написан
    1 комментарий