Блог пользователя iroro

Автор iroro, 12 лет назад, По-русски

Вот такой http://users.livejournal.com/_darkus_/655190.html конкурс проводится автором русских книг по Haskell.

Задача:

«Демиург задумал поместить новую разумную расу на планету во Вселенной так, чтобы она как можно быстрее освоила весь доступный космос. Для этих целей он собрал перечень всех планет, находящихся в поясе Златовласки, после чего решил найти среди них две, наиболее близко расположенные друг к другу. Разумная раса должна быть расположена на одной из таких планет. Это, по замыслу Демиурга, позволит максимально быстро обеспечить освоение космоса. Помогите Демиургу найти две планеты, находящиеся на наименьшем расстоянии друг от друга.»

Суть — решить как можно более общно. Зачастую в конкурсе побеждают хаскеллисты, дабы разбавить эту статистику, мы решили разместить этот пост на цф :)

  • Проголосовать: нравится
  • +21
  • Проголосовать: не нравится

»
12 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

kd tree за O(n5 / 3), на рандоме за .
http://en.wikipedia.org/wiki/K-d_tree
Должно отработать за пару минут.
Писать пока лень...

  • »
    »
    12 лет назад, # ^ |
    Rev. 5   Проголосовать: нравится 0 Проголосовать: не нравится

    dist^2 = 11558
    977464 250360 504213
    977446 250385 504316
    all done in 63078 ms

    надеюсь нигде не напортачил в реализации))

    upd. да, написание кода — где то час с вспоминанием как kd-tree вообще работает...

    upd2. а я ведь напортачил. версия вроде без глюков теперь находит
    dist^2 = 7393
    637957 813791 458265
    637999 813818 458335
    all done in 32205 ms

    но я пока еще погоняю на рандоме, запущу стресс тест)

    upd3. http://pastie.org/4055843

    • »
      »
      »
      12 лет назад, # ^ |
        Проголосовать: нравится +3 Проголосовать: не нравится

      Теперь сходится =) . Но у меня нет КД-дерева, просто сортировка по X и один проход с отсечением по расстоянию по X.

      • »
        »
        »
        »
        12 лет назад, # ^ |
        Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

        значит тест слабенький.

        стресстест не нашел контртеста на 1000 рандомных тестов по 1000 вершин, значит мое kd-дерево без глюков) доволен там, что написал его, пишу 2й раз в жизни))

        вроде еще есть тупой алгоритм бросания на рандомную прямую, работает за O(N3 / 2). видимо ты его и написал, и прямая y=0, z=0 тут оказалась рандомной :D

        • »
          »
          »
          »
          »
          12 лет назад, # ^ |
            Проголосовать: нравится +3 Проголосовать: не нравится

          Понятно, что на случайных точках это работает быстро.

          А при взгляде на файл не бросается в глаза какая-либо неслучайность координат точек.

          • »
            »
            »
            »
            »
            »
            12 лет назад, # ^ |
              Проголосовать: нравится +3 Проголосовать: не нравится

            да, согласен. увы, kd-дерево пришло мне в голову раньше, а про это решения я как то и не вспомнил.

»
12 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Там меня что-то маркнули как спам, напишу сюда.

У меня получилось расстояние 85.982556... (Квадрат расстояния 7393).

Первая звезда 166820 (0-based): 637957 813791 458265.

Вторая звезда 342967 (0-based): 637999 813818 458335.

Язык C++.

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

  • »
    »
    12 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Комментарии помечаются как спам, чтобы их никто кроме автора блога не видел до конца конкурса.

»
12 лет назад, # |
Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

637999 813818 458335

637957 813791 458265

85.9826

Аналогичный результат. Просто использовал http://e-maxx.ru/algo/nearest_points . http://pastebin.com/Ps3KQvzX

  • »
    »
    12 лет назад, # ^ |
      Проголосовать: нравится +3 Проголосовать: не нравится

    А ничего, что по ссылке 2D, а в задаче 3D?

    • »
      »
      »
      12 лет назад, # ^ |
        Проголосовать: нравится +3 Проголосовать: не нравится

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

      • »
        »
        »
        »
        12 лет назад, # ^ |
          Проголосовать: нравится +3 Проголосовать: не нравится

        За nlog2n вроде очевидно. А за nlogn — там какая-то магия. Там какая-то внезапная теорема нужна, про то что есть измерение в котором что-то-там будет маленьким.

        • »
          »
          »
          »
          »
          12 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится

          ну я пока за и обобщил. такой сложности уже хватает.

      • »
        »
        »
        »
        12 лет назад, # ^ |
        Rev. 3   Проголосовать: нравится +3 Проголосовать: не нравится

        Вроде же есть несложное обобщение за O(N * log2N). Делаем все так же, как в 2D, при слиянии двух полупространств получаем некоторую область, заключенную между двумя параллельными плоскостями небольшой ширины, а в этой области решаем задачу почти как в 2D.

»
12 лет назад, # |
  Проголосовать: нравится +12 Проголосовать: не нравится

Казалось бы, причём тут ФП?..

»
12 лет назад, # |
  Проголосовать: нравится +41 Проголосовать: не нравится

http://it-talk.org/topic15619.html
а задача то NP-полная. мужики то и не знают...

»
12 лет назад, # |
Rev. 4   Проголосовать: нравится 0 Проголосовать: не нравится

Сортировка по расстояние от удалённой на "Ура" заходит...
Хватает посмотреть 80 в каждую сторону.
Что-то не так... :D

  • »
    »
    12 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Ну, лэндмарки всегда хорошо работали на рандоме, все в порядке :)