• Нахождение общей площади, образованной объединением прямоугольников?

    Mrrl
    @Mrrl
    Заводчик кардиганов
    Довольно просто решить за O(N^3).
    Пусть координаты k-го прямоугольника - (x1[k],x2[k],y1[k],y2[k]).
    Берёте все x1,x2 (их 2*N штук), сортируете, выкидываете одинаковые. Это проекции вершин на ось X. Обозначим полученный массив A.
    Аналогично с y1,y2 - получается массив B (тоже длиной не больше 2*N).
    Теперь перебираем прямоугольники C=[A[p],A[p+1]]*[B[q],B[q+1]] для всех p,q. Ни один из них не пересекается сторонами исходных прямоугольников, так что если центр C лежит в одном из исходных прямоугольников, то весь прямоугольник принадлежит объединению, если нет - то не имеет с ним общих внутренних точек. Суммируем площади всех прямоугольников, принадлежащих объединению, и пишем ответ.
    Можно соптимизировать до O(N^2). Насчёт O(N*log(N)) не знаю.
    Ответ написан
    6 комментариев
  • Как преобразовать коллекцию объектов в коллекцию значений одного из его свойств одной строкой?

    Mrrl
    @Mrrl
    Заводчик кардиганов
    var result=source.ConvertAll(c=>c.Text);
    Ответ написан
    Комментировать
  • Как построить полную сетку из не полной?

    Mrrl
    @Mrrl
    Заводчик кардиганов
    Думаю, что лучше ещё раз посмотреть в сторону триангуляции.
    После того, как триангуляция Делоне исходных точек построена, то для любого треугольника и любого уровня высоты пересечение изолинии с треугольником будет либо пустым, либо точкой, либо отрезком. Координаты концов отрезка определяются линейной интерполяцией. И продолжать изолинию можно будет просто шагая по треугольникам.
    Проблема возникнет, когда изолиния уткнётся в вершину. Теоретически, из вершины может быть больше двух путей - если она оказалась седловой точкой. Чтобы этого избежать, достаточно просмотреть в начале все данные, и если попадётся "круглое" число - слегка его изменить.
    Ответ написан
    5 комментариев
  • Как увеличить хеш-таблицу?

    Mrrl
    @Mrrl
    Заводчик кардиганов
    Заполненность обычно берут 70-75% от размера таблицы. Можете также попробовать посчитать число шагов в цикле rehash, и если оно для какого-то элемента больше критической величины (например, 3 или 5), значит, пора.
    "Умножить на 2 и взять следующее простое число" - нормально.
    Хешировать заново, конечно, придётся - как же без этого :)
    Кстати, то, что rehash не знает про исходный ключ - это правильно? Ведь так получается, что если для двух ключей rehash дал одинаковые результаты, то и вся последующая цепочка для них совпадёт, и будут повышаться шансы, что новые элементы будут попадать именно в эту цепочку.
    Ответ написан
    5 комментариев
  • Поиск наибольшей возрастающей подпоследовательности?

    Mrrl
    @Mrrl
    Заводчик кардиганов
    Если сравнивать код с алгоритмом, то пропущено условие d[j-1] < a[i] (видимо, в коде оно должно выглядеть, как ub==v.begin() || ub[-1] < a[i] ). Похоже, что без него алгоритм будет искать не возрастающую, а неубывающую последовательность (но я в этом не уверен).
    Ответ написан
    Комментировать
  • Как определить пересечение отрезка и полигона?

    Mrrl
    @Mrrl
    Заводчик кардиганов
    Сначала лучше перейти в систему координат, в которой стороны прямоугольника параллельны координатным осям, а центр - в точке (0,0): пусть при преобразовании (x,y) -> (p*x+q*y+r,-q*x+p*y+s) прямоугольник переходит в abs(X) <= A, abs(Y) <= B.
    Пусть (X1,Y1) и (X2,Y2) - координаты вершин отрезка после преобразования.
    Если max(X1,X2) < -A || min(X1,X2) > A || max(Y1,Y2) < -B || min(Y1,Y2) > B, то не пересекается: отрезок находится за одной из сторон прямоугольника.
    В противном случае условием пересечения, насколько я понимаю, будет
    abs(X1*Y2-Y1*X2) <= abs(A*(Y2-Y1)) + abs(B*(X2-X1))
    Тщательно не проверял, но шансы, что формула правильная, хорошие.
    Ответ написан
    Комментировать
  • Можно ли работать на Западе в сфере IT без диплома?

    Mrrl
    @Mrrl
    Заводчик кардиганов
    Чтобы работать в США, нужна, как минимум, виза Н1. Для её получения работодатель должен убедить иммиграционные власти, что Вы - человек, обладающий нужными качествами, какие в США (за ту же зарплату) найти трудно. И здесь диплом (а лучше, диплом кандидата наук) будет очень полезен.
    Ответ написан
    Комментировать
  • С точки зрения лексем языка си минус это?

    Mrrl
    @Mrrl
    Заводчик кардиганов
    Придётся научить распознаватель выполнять операции над константами. Тогда и -1, и 2-1 будут константами, вычисленными на этапе компиляции, а (-x) и x-1 - результатом применения различных операций "минус" (которые не обязаны быть как-то связаны между собой).
    Ответ написан
    Комментировать
  • Как правильно вычислять географические расстояния в высоконагруженных сервисах?

    Mrrl
    @Mrrl
    Заводчик кардиганов
    Может быть, вычислять расстояние только до пользователей, которые находятся в этом или смежных квадратах? Можно ограничиться 4 квадратами - расположенными вокруг вершины, ближайшей к пользователю.
    Ответ написан
    Комментировать
  • Является ли хорошим тоном постоянно использовать много методов/функций?

    Mrrl
    @Mrrl
    Заводчик кардиганов
    Иногда на каждую характеристику лучше своя функция.
    Иногда, если набор характеристик в каком-то смысле однородный (проекции модели на три координатные плоскости, число красных/зелёных/синих рёбер...) можно какой-то признак характеристики передать параметром - тогда одна функция будет вычислять любую из нескольких характеристик.
    Иногда, если несколько характеристик удобно вычислять вместе, и они логически связаны между собой (и с большой вероятностью потребуются вместе) - объединить их в структуру и заставить функцию заполнять её всю.
    Иногда - когда для вычисления характеристик уже не надо лезть в потроха объекта, а можно воспользоваться другими характеристиками, и, возможно, какими-нибудь итераторами, а кроме того, вычисление само по себе трудоёмко и требует сложных алгоритмов - вынести это вычисление в отдельный класс.
    Ответ написан
    Комментировать
  • Как решить задачу о математической игре Баше?

    Mrrl
    @Mrrl
    Заводчик кардиганов
    Если позиция сразу проигрышная, то программа не помечает ход как правильный. Больше ошибок пока не видно.
    Ответ написан
  • Как найти статью на хабре о получении числа 100 из 6 цифр?

    Mrrl
    @Mrrl
    Заводчик кардиганов
    Возведения в степень там точно не было. Список вот:
    https://www.dropbox.com/s/v1gp0yp62kr1kdh/badticke...
    Но я не помню, разрешался там унарный минус, или нет.
    Дата создания файла 3 апреля 2013, но вряд ли это поможет.

    UPD. habrahabr.ru/post/174715
    К счастью, она была в хабе "алгоритмы".
    Ответ написан
    Комментировать
  • Практическое применение гиперболических функций?

    Mrrl
    @Mrrl
    Заводчик кардиганов
    Редко применяются. Главным образом, потому, что они хорошо выражаются через обычную экспоненту. Конечно, написать (exp(x)+exp(-x))/2 сложнее, чем cosh(x), но функция обычно нужна не сама по себе, а как часть большого выражения.
    Логика подсказывает, что гиперболические функции удобно использовать для формул, связывающих углы и стороны треугольника на плоскости Лобачевского, но та же логика говорит, что в реальной жизни это нужно чуть реже, чем никогда. Можно встретить эти функции в каких-то задачах на теплопроводность... и получается ответ - используйте эти функции тогда, когда встретите их в справочнике. Из остальных случаев могу вспомнить только использование tanh() в формуле релятивистского сложения скоростей. Почему-то перейти от скорости к "быстроте" мне тогда показалось удобным.
    Ну, и полезное применение tanh() - что она отображает всю числовую прямую на интервал (-1,1). Хотя для положительных чисел проще использовать x/(1+x).
    Ответ написан
    Комментировать
  • Дан массив S из n действительных чисел, а также число x. Как за время O(nlogn) определить, можно ли представить х в виде суммы двух элементов из S?

    Mrrl
    @Mrrl
    Заводчик кардиганов
    1) сортируете массив
    2) пускаете два указателя - один с начала, другой с конца. Если сумма элементов под ними меньше X - увеличиваете первый, если больше - уменьшаете второй. Если равна - вы победили, возьмите приз с полки.
    3) если указатели встретились, а сумма так ни разу и не равнялась X - то проиграли, можно стреляться.
    Ответ написан
    2 комментария
  • Как ускорить алгоритм?

    Mrrl
    @Mrrl
    Заводчик кардиганов
    Сначала учитываем 3*N^2 треугольников, у которых вершина с прямым углом лежит на одной из координатных осей (или вообще в точке (0,0)).
    Теперь посчитаем все остальные треугольники.
    Пусть (a,b) - координаты вершины с прямым углом, 0 < a <= N, 0 < b <= N.
    Если c=НОД(a,b), a1=a/c, b1=b/c, то оставшаяся вершина должна иметь координаты (x,y)=(a+t*b1,b-t*a1), где t - ненулевое целое число.
    Должны выполняться условия 0 <= x,y <= N. Перепишем их в виде условий на t:
    -a/b1 <= t <= (N-a)/b1, -(N-b)/a1 <= t <= b/a1 (заметим, что a1, b1 больше нуля, так что делить можно). Учитывая, что t должно быть целым, оно лежит на отрезке от
    t0 = -floor(min(a/b1,(N-b)/a1))
    до
    t1 = floor(min((N-a)/b1,b/a1))
    И, поскольку запрещённое значение 0 всегда принадлежит этому отрезку, получаем, что число треугольников с вершиной (a,b) равно t1-t0.
    Перебираем все точки (a,b), считаем t1-t0 и суммируем.
    Всё. Сложность N^2*log(N), основное время тратится на вычисление НОД.
    Если надо быстрее - надо будет думать. Скорее всего, надо будет перебирать взаимно простые пары (a1,b1), считать, сколько точек попало в перекошенный квадрат (переведённый в базис (a1,b1), (-b1,a1)), искать для них формулу и суммировать. Может быть, получится, может быть, нет. Какого порядка N?
    Ответ написан
    Комментировать
  • Как проверить делимость чисел из последовательности 1,11,111,...,11..1 на их порядковые номера?

    Mrrl
    @Mrrl
    Заводчик кардиганов
    Если N небольшое (скажем, не больше 100000), то можно так:
    char *A=new char[N+1];
      for(int n=1;n<=N;n++){
        int a=0;
        for(int b=0;b<n;b++) a=(10*a+1)%n;
        A[n]=!a;
      }

    При больших N нужно пользоваться аналогом быстрого возведения в степень.
    Получается, что кроме 3 и 37, в числах оказываются такие простые делители, как 163, 757, 1999, 9397... Не понимаю, откуда они берутся.
    UPD.
    757 - делитель 10^27-1
    163 и 9397 - делители 10^81-1
    1999 - делитель 10^999-1
    Ответ написан
    1 комментарий
  • Возможно ли "соединить" два файла, не перемещая данные?

    Mrrl
    @Mrrl
    Заводчик кардиганов
    В любом случае, для этого нужно, чтобы длина первого файла была кратна размеру кластера. Тогда, при наличии физического доступа к диску, шансы могут быть ненулевыми.
    Если файлы для задачи были промежуточными, то, возможно, проще было бы ввести промежуточный тип - "многофайловый файл", который сам разбирается, из какого файла что читать. Там надо переопределить метод ReadBytes() (и всякие мелочи вроде Seek, Position, Length...) Заодно и в других программах может пригодиться.
    Ответ написан
    Комментировать
  • Как определить возвращает ли экземпляр Delegate значение?

    Mrrl
    @Mrrl
    Заводчик кардиганов
    Попробуйте так:
    static bool IsAction(Delegate x){
        return x.Method.ReturnType==typeof(void);
      }

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

    Mrrl
    @Mrrl
    Заводчик кардиганов
    Лучше брать дробное случайное число:
    double r=frand()*total_chance_sum.
    (как сегодня называется frand() я не знаю - должно выдавать случайное число от 0 до 1). Условие current_sum <= r не нужно, оно выполняется всегда.
    Если хотите повысить шансы тех, кто делал большие ставки - можете возвести эти ставки в квадрат (т.е. если цены - 0.5, 1, 2, то шансы на победу будут 1/21, 4/21, 16/21). Не знаю, хорошо ли это.

    Вообще, не очень понятно, как работает
    current_sum += items[i].chance
    если сумма целая, а ставка дробная. Она не ругается на потерю точности?
    Ответ написан
  • Как найти работу заграницей и стоит ли?

    Mrrl
    @Mrrl
    Заводчик кардиганов
    Зависит от очень многих факторов:
    - сможете ли жить в выбранной стране вообще, с учётом того, что законы и обычаи могут сильно отличаться от наших? Если да - будет ли это достаточно комфортно? Сможете ли там найти круг общения для себя?
    - есть ли семья, дети? Если да - берёте ли семью с собой, и каково им там будет?
    - остаётся ли кто-нибудь, кто будет заботиться о родителях, когда они состарятся? Перевести их с собой может не получиться. А получится ли и захочется ли вернуться - неизвестно.
    Ответ написан
    Комментировать