• Как найти наибольшее значение у такой функции?

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

    Правда, там трубуется, чтобы функция сторго возрастала а потом строго убывала.
    Если у вас функция горизонтальная на отрезках длины 1 (т.е. от целочисленных аргументов), то троичный поиск еще можно применить.

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

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

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

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    У вас решение за O(MN), когда как можно за O(M log N).

    Вы говорите, что оно линейно, но вы выполняете линейное количество операций на каждый элемент массива b. Это медленно. Ваша проблема в том, что вы храните все индексы для каждого значения просто в списке и потом там наивно ищите первое вхождение больше данной границы. Можно список хранить в Set. Вот я не в курсе, умеет ли он, как C++-шный set искать первый элемент больше заданной границы. Если нет, то можно тупо хранить отсортированые списки индексов, тогда там можно будет делать бинпоиск.
    Ответ написан
    7 комментариев
  • Почему нет интернета?

    @Drno
    Привязвкк по мак адресу стоит видимо
    Позвоните в тех по, скажите что переставили кабель из пк в роутер

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

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Это задача - вариант Subset sum problem.

    Она NP-полная - тут нет быстрых и простых решений. В общем случае, возможно только решение полным перебором за N*3^N. Что-то вроде того, что предложил Alexandroppolus, только там вообще не рассматривается случай, что текущее число просто пропускается. Еще можно делать это же без рекурсии на основе битовых масок.

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

    @kalapanga
    В Вашем ответе, по-моему, строка "g" входит и в 28 и в 3
    Ответ написан
    1 комментарий
  • Какой есть алгоритм для нахождения тенденции к уменьшению или увеличению значений в массиве?

    sergiks
    @sergiks Куратор тега Алгоритмы
    ♬♬
    Линейная регрессия
    Ответ написан
    Комментировать
  • Почему не работает такое решение?

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

    Чтобы через DFS найти отрицательный цикл - придется перебирать ВСЕ циклы. Для этого надо не помечать вершины как visited. Правда, работать будет очень медленно и почти гарантированно не пройдет по time limit, ибо циклов в гарфе может быть экспоненциально много.

    Edit, вот вам пример. В графе только один отрицательный цикл 1->2->3->1. Но есть еще ребро 1->3. Если вы начнете из 1-ой вершины, потом возьмете ребро 1->3, то дальше вы из вершины 3 никуда не сможете пойти, уберете ее из стека и пометите как visited. Далее вы рассмотрите ребро 1->2 а потом из вершины 2 ребро 2->3 вы пропустите, потому что вершина 3 уже visited.

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

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Java
    Седой и строгий
    Используйте отладчик.
    Ответ написан
    Комментировать
  • Как решить задачу?

    BorLaze
    @BorLaze
    Java developer
    Ты неправильно генеришь данные.

    Смотри:
    1 шаг: в массиве только [1] (число 1 является элементом последовательности)
    2 шаг: берем 1, добавляем 2, 3, 5 (если a – элемент последовательности, то 2a, 3a, 5a тоже являются элементами последовательности) - а равно 1, в итоге получаем [1, 2, 3, 5]
    3 шаг: берем 2, добавляем 2*2, 3*2, 5*2 (а теперь равно второму элементу, 2), сортируем: [1, 2, 3, 4, 5, 6, 10]
    4 шаг: берем 3... ну, и так далее.
    Ответ написан
    5 комментариев
  • Как решить задачу?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Вы правильно поняли, какого вида числа будут в последовательности (перемноженные степени 2, 3 и 5).

    Проблема в том, что вы, например, пропустите число 2^23, которое входит в первые 10000.

    Вам надо поднимать границы от 22, пока сгенерированная последовательность (первые 10000 чисел) не перестанет менятся. Вы сгенерируете первые 10000 чисел точно, и какие-то дальше в последовательности (возможно с пропусками) - всего будет сильно больше 10000 чисел.

    Но скорее всего, придется поменять алгоритм. Поскольку ограничения маленькие, то тут можно делать что-то типа BFS. Вы вычисляйте числа в последовательности по порядку. И поддерживайте множество возможных следующих чисел. Каждый раз дописывайте минимальное число из кандидатов к последовательности и добавляйте к кандидатам это новое число, умноженное на 2, на 3 или на 5. Это будет квадратичный алгоритм. Можно использовать heap или какой-нибудь set, тогда будет за O(n log n).

    Еще есть линейный алгоритм. Он получается из предыдущего так: все кандидаты разбейте на 3 множества - те, которые получены домножением на 2, на 3 и на 5. Каждое такое множество в итоге будет тупо сама же последовательность, домноженная на 2, 3 или 5. Поэтому единственное, что вам надо знать для полного описания кандидатов - это какое число из последовательности было домножено на 2,3 или 5. Это три индекса.

    Т.е. решение будет поддерживать три индекса в уже сгенерированном массиве. Потом смотреть, какое число, домноженное на соответсвующий множитель минимально, это число дописывать в последовательность и этот индекс сдвигать на 1.
    Ответ написан
    Комментировать
  • Где я могу найти теорию по интернету, сетям, прокси-серверам, использованию IP и другим вещам, которые связаны с интернет-сёрфингом?

    deepblack
    @deepblack
    По сетям:
    • Олифер В. Г., Олифер Н. А. Компьютерные сети. Принципы, технологии, протоколы ISBN: 978-5-4461-1426-9
    • Таненбаум Э. С., Уэзеролл Д. Компьютерные сети. 5-е изд. ISBN:978-5-4461-1248-7

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

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

    Никакого переполнения быть не может, bigInteger вам не нужен. Даже long не нужен: максимальная длина пути - 10000.
    Ответ написан
    7 комментариев
  • Какой тест не проходит решение?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Задача сводится к построению графа и нахождению кратчайшего пути в нём.
    Каждый отсек, в котором нет стены, это узел графа.
    Каждый возможный переход между отсеками, как в соседние, так и через гипертуннель, это ребро графа.
    Ответ написан
    Комментировать
  • Как узнать степень числа, которая является средним арифметическим степеней двух чисел?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Странное задание. Какая польза от этого сокращения сравнений, если всего в результате вставки переместится до O(log n) элементов?

    Но, если так надо, то вам нужно для каждого числа сначала узнать номер старшего ненулевого бита (most significat bit - MSB), и потом сдвинуть верхнее число вправо на половину разницы в позициях старших битов.

    1 = 0000001b, msb = 0
    18 = 0010010b, msb = 4

    Разность - 4 разряда. Значит, надо сдвигать на 2 разряда вправо:
    18 >> 2= 0010010b >> 2 = 00100b = 4

    Еще пример: для 4 и 18 msb были бы 2 и 4, разность -2. Сдвинув 18 на 2/2=1 разряд вправо, вы бы получили 9.

    Чтобы эта оптимизация давала хоть какую-то пользу, надо находить msb очень быстро. Или предподсчитайте их для всех возможных индексов, или надейтесь, что в вашем языке есть встроенная функция, которая вызывает нужную инструкцию процессора, типа __builtin_clz.

    Еще можно подсчитать msb только один раз для правой границы бинпоиска, а потом просто помнить его, ведь у средней точки - это среднее арифметическое (левая граница изначально 1 - у нее msb = 0). А потом в процессе бинпоиска надо просто хранить msb для двух границ и заменять известным значением середины один из концов.

    Для предподсчета просто в цикле задавайте msb[i] = msb[i/2] + 1;
    Ответ написан
    Комментировать
  • Почему так долго работает сортировка слиянием?

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

    mergeSort(a, temp, 0, mid);


    Надо сортировать часть с lo по mid. А не с 0.
    Ответ написан
    Комментировать
  • Как происходит выбор маски подсети, если компьютер находится в нескольких VPN?

    saboteur_kiev
    @saboteur_kiev Куратор тега Компьютерные сети
    software engineer
    грубо говоря, каждое VPN подключение создает виртуальную сетевую карточку (интерфейс) со своими настройками сети. И маска одного интерфейса к другому интерфейсу никаким боком не относится. Вопрос в том, в какой интерфейс будет идти трафик.
    Ответ написан
    Комментировать
  • Как происходит выбор маски подсети, если компьютер находится в нескольких VPN?

    @rPman
    каждый vpn должен добавлять правило route в котором и прописывается подсеть (адрес + маска подсети), при необходимости, можно определить приоритеты метрикой (поция route) вручную создав свои правила
    Ответ написан
    Комментировать
  • Как происходит выбор маски подсети, если компьютер находится в нескольких VPN?

    Jump
    @Jump
    Системный администратор со стажем.
    Как происходит выбор маски подсети, если компьютер находится в нескольких VPN?
    Никак, компьютер маску не выбирает, ему ее сообщают.
    Может ли компьютер состоять в двух разных подсетях, у которых одинаковая маска подсети?
    Разумеется, хоть в десяти.
    Как ведет себя DHCP сервер, если компьютер уже находится в другой сети, но хочет присоединиться к новой?
    Так же как и до этого. Какое ему дело до того что кто-то там чего-то хочет?
    Ответ написан
    Комментировать
  • Как происходит выбор маски подсети, если компьютер находится в нескольких VPN?

    hint000
    @hint000
    у админа три руки
    Может ли компьютер состоять в двух разных подсетях, у которых одинаковая маска подсети?
    Может. Вообще никакой проблемы.
    Как ведет себя DHCP сервер, если компьютер уже находится в другой сети, но хочет присоединиться к новой?
    Ведёт себя как обычно. DHCP сервер об этом ничего не знает и не хочет знать.
    Ответ написан
    Комментировать