Форум Академгородка, Новосибирск > симметрия и перестановки элементов массива
Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: симметрия и перестановки элементов массива
Форум Академгородка, Новосибирск > Образование > Задачник
Texnik
Добрый день форумчане!

Суть задачи:
Имеется массив данных Arr[N,N,N,N] и некая функция заполняющая его: Arr[i,j,k,l] = f(i,j,k,l). Известно, что уникальны не все результаты работы данной функции, а именно:
1) Arr[i,j,k,l] = Arr[j,i,k,l]
2) Arr[i,j,k,l] = Arr[i,j,l,k]
3) Arr[i,j,k,l] = Arr[j,i,l,k]
4) Arr[i,j,k,l] = Arr[k,l,i,j]
5) Arr[i,j,k,l] = Arr[l,k,i,j]
6) Arr[i,j,k,l] = Arr[k,l,j,i]
7) Arr[i,j,k,l] = Arr[l,k,j,i]

Итого имеем уникальных комбинаций: N*(N+1)*(N*N + N + 2)/8

Соответственно имеет смысл вычислить только уникальные значения, а остальные просто скопировать. Первые три условия симметрии решаются просто:
Код
do l = 1, N
   do k = 1, l
      do j = 1, N
          do i = 1, j
             if ("условие для 4-7") Arr[i,j,k,l] = f(i,j,k,l)
          enddo
      enddo
   enddo
enddo


А вот как красиво воспользоваться условиями симметрии 4 - 7?
Eyeless Watcher
Условия симметрии у вас говорят, что можно безболезненно переставить первую и вторую пару индексов, плюс индексы внутри каждой из этих пар. Отсюда с помощью сортировки по любой четверке индексов можно построить ее "каноническую" форму, в которой i<=j, i<=k, k<=l. Собственно, все наборы индексов, у которых индексы уже в канонической форме можно считать оригиналами, все остальные - дубликатами.
Texnik
у меня сперва была похожая мысль, но такое условие дает, что при N=100 мы имеем 12920425 уникальных значений, в то время как реально их 12753775, то есть берем в расчет что-то лишнее sad.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Русская версия IP.Board © 2001-2024 IPS, Inc.