Получение перестановки по номеру

Тема в разделе "WASM.A&O", создана пользователем Pahan, 10 янв 2009.

  1. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Pahan
    Дык это же классическая задача теории вероятностей (комбинаторики). Возьми первый томик Феллера и поищи слово "серии". Про серии много чего известно.
     
  2. Pahan

    Pahan New Member

    Публикаций:
    0
    Регистрация:
    10 янв 2009
    Сообщения:
    55
    2 Black_mirror:
    В основном цикле:
    Код (Text):
    1. for(int i=0;i<N;i++)
    2.     alter[i]=mark;
    и ниже:

    Код (Text):
    1. alter[i]=alter[next[i]];
    Нет ли здесь опечатки?

    2 crypto:
    На самом деле предложенный алгоритм кажется мне уже достаточно хорошим и убыстрять я его планировал именно засчет тонкостей реализации.
    Но Феллера посмотрю, спасибо. Думаю там все равно будет много полезного.
     
  3. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    Pahan
    Подаётся ей массив бит и его длина, ну а функция печатает все различные цепочки длиной от 1 до N. В массиве next хранятся указатели на следующую такую же цепочку. А массив alter нужен только для разделения списка на два при удлинении цепочек на один бит. Если нужно выводить количество одинаковых цепочек, по можно перед выводом добавить пару циклов и перед переводом строки выводить alter:
    Код (Text):
    1. for(int i=0;i<=N-len;i++)
    2.   alter[i]=1;
    3. for(int i=0;i<=N-len;i++)
    4.   alter[next[i]]+=alter[i];
    Ну а если нужно в отсортированном виде выводить, то придётся делать массив указателей на элементы для которых next>=mark и сортировать его.
     
  4. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    Pahan
    Здесь нет, но вообще я этот код в браузере писал, так что могут быть другие баги баги.
     
  5. Pahan

    Pahan New Member

    Публикаций:
    0
    Регистрация:
    10 янв 2009
    Сообщения:
    55
    2 Black_mirror
    еще одну опечатку при выводе на
    Код (Text):
    1.  int j=j
    я исправил. Код запустил, все работает.
    Можно узнать общую идею алгоритма, а то по коду не могу ее уловить? Хочу сравнить по трудоемкости с той, которую я использую и по возможности переделать для случая когда алфавит больше, чем двоичный.
     
  6. Pahan

    Pahan New Member

    Публикаций:
    0
    Регистрация:
    10 янв 2009
    Сообщения:
    55
    *
    Код (Text):
    1. int j=i
     
  7. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    Pahan
    Сложность алгоритма N*N. А общая идея такова, что сначала все биты связываются в список цепочек нулевой длины, а потом увеличиваем длину цепочки на один бит и расщепляем каждый список на два: список элементов, которые оканчиваются на 1, и список элементов, которые оканчиваются на 0. Ну а в alter хранится указатель на следующий элемент списка с элементами отличающимися от текущего в последнем бите. Если число символов в алфавите не большое, то можно конечно добавить к массиву alter еще одну размерность, но это приведёт к появлению мультипликативной констранты, равной числу символов в алфавите. Если кто знает как более эффективно расщеплять списки, пусть поделится.
     
  8. Pahan

    Pahan New Member

    Публикаций:
    0
    Регистрация:
    10 янв 2009
    Сообщения:
    55
    Black_mirror
    По моим представлениям, алгоритм предложенный Y_Mur в этой теме обладает трудоемкостью не хуже, чем N*N.
     
  9. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    Pahan
    Ну это и есть его алгоритм :)
     
  10. luckysundog

    luckysundog New Member

    Публикаций:
    0
    Регистрация:
    28 окт 2008
    Сообщения:
    106
    глупости. что значит под юникс? там исходники выложены, что мешает их собрать?
     
  11. Pahan

    Pahan New Member

    Публикаций:
    0
    Регистрация:
    10 янв 2009
    Сообщения:
    55
    luckysundog
    Уже ничего=) Собрал ее через cygwin - работает.