|
Платежеспособный зверь
8966 / 4389 / 1655
Регистрация: 28.10.2009
Сообщений: 11,647
|
|
Как вернуть исходные значения?18.11.2010, 15:48. Показов 1647. Ответов 17
Метки нет (Все метки)
Вот вопрос, который мучает меня не первый день:
пусть мы имеем массив натуральных чисел от 1 до N, в котором числа не повторяются, скажем, для N=4 это будет: a[1]=2 a[2]=3 a[3]=4 a[4]=1 Зная этот массив, мы легко можем найти элементы массива a[a[i]], в котором вместо индексов - значения элементов нашего массива: a[a[1]]=3 a[a[2]]=4 a[a[3]]=1 a[a[4]]=2. А как решить обратную задача? Известен массив a[a[i]], найти элементы массива a[i]?
0
|
|
| 18.11.2010, 15:48 | |
|
Ответы с готовыми решениями:
17
Вернуть исходные значения формы по кнопке "Отмена"
Вернуть исходные данные |
|
476 / 444 / 34
Регистрация: 20.11.2009
Сообщений: 1,293
|
|
| 18.11.2010, 16:26 | |
|
А никак. Однозначного решения нет.
Простейший пример: Последовательность (1, 2). a[a[1]] = 1; a[a[2]] = 2; Последовательность (2, 1). a[a[1]] = 1; a[a[2]] = 2; Добавлено через 4 минуты Восстановить перестановку P, если известен только её квадрат P^2, однозначно нельзя. Добавлено через 2 минуты Или может вам любую такую перестановку найти надо? Или все такие перестановки?
0
|
|
|
Платежеспособный зверь
8966 / 4389 / 1655
Регистрация: 28.10.2009
Сообщений: 11,647
|
|
| 18.11.2010, 16:45 [ТС] | |
|
Достаточно одного любого решения. А оно должно быть, раз задача существует. В ней написано "найти любой исходный массив или сообщить, что его не существует"
Насчет "никак" я с вами не соглашусь. Я нашел решение с помощью полного перебора перестановок, но оно меня не удовлетворяет, т.к. сам алгоритм формирования перестановок достаточно громоздок и выдает решение только для малых N, а мне нужен алгоритм работающий хотя бы для N=100 Возможно, надо применять рекурсивную процедуру, но я в этом плохо ориентируюсь
0
|
|
|
476 / 444 / 34
Регистрация: 20.11.2009
Сообщений: 1,293
|
|
| 18.11.2010, 17:05 | |
|
Если вдруг это задача с какого-нибудь онлайн-контестера, дайте ссылку, пожалуйста.
Добавлено через 6 минут Переписка
[16:51:40] Хохол: Дана перестановка P. Найти любую перестановку Q такую, что Q^2 = P. Или сказать что таких нет.
[16:51:59] Caesar: опять жесть какая-то [16:52:48] Хохол: N <= 100 [16:52:53] Alexei: а это задача [16:52:57] Alexei: я думал калядин)) [16:53:03] Хохол: упаси боже [16:53:09] Alexei: ты контрольную писал у него? [16:53:14] Хохол: я видел его ровно один раз в жизни [16:53:16] Хохол: не писал [16:53:20] Caesar: а как вообще перестановки в квадрат возводить? ![]() [16:53:25] Pavel: ))))) [16:53:29] Caesar: это типа переставить так вот [16:53:37] Pavel: дважды применить [16:53:39] Alexei: зря не писал - там халява, и досрочный экзамен халява [16:53:46] Хохол: ну типа P^2[i] = P[P[i]] [16:53:50] Caesar: понял [16:54:35] Pavel: решил вроде ) [16:54:50] Pavel: за квадрат [16:54:52] Constantine Drozdov: о_О [16:54:59] Constantine Drozdov: разбиваем на циклы [16:55:24] Хохол: а если их нет? [16:55:32] Alexei: если нет это Е [16:55:35] Pavel: они всегда есть [16:55:38] Хохол: шутка [16:55:40] Constantine Drozdov: очевидно, что четный цикл при возведении в квадрат разбивается на 2 по четным и нечетным места [16:56:24] Alexei: четным и нечетным местам это не понял [16:56:39] Constantine Drozdov: (1234) => (13)(24) (123) => (132) (12345)=>(13524) [16:57:00] Alexei: теперь понял [16:57:09] Constantine Drozdov: осталось обратить операцию [16:57:18] Pavel: да [16:57:29] Хохол: Во блин. Я не понимаю эти скобочки. Я не хожу к калядину. [16:57:31] Pavel: чётные циклы равных длин собираем парочками и склеиваем [16:57:36] Alexei: зря [16:57:49] Alexei: калядин классный препод [16:57:51] Constantine Drozdov: (1234) перестановка 1 в 2, 2 в 3, 3 в 4, 4 в 1 [16:57:51] Pavel: нечетные циклы звёздочкой перебираем [16:58:01] Constantine Drozdov: там фейл [16:58:13] Constantine Drozdov: надо на группы разбивать [16:58:29] Pavel: ты за O(n) хочешь? [16:58:37] Alexei: чётные циклы равных длин собираем парочками и склеиваем почему это плохо? [16:58:40] Pavel: все быстро отключили смайлики ) [16:58:54] Pavel: да, почему? [16:58:56] Constantine Drozdov: а у тебя левый ноу-солюшн не будет? [16:59:09] Pavel: не будет, а сфигали? [16:59:16] Pavel: а [16:59:21] Pavel: ну все циклы равных длин [16:59:22] Pavel: не токо чётные [16:59:29] Pavel: это когда склеиваем, четные ) [16:59:31] Constantine Drozdov: т.е. если четных циклов данной длины нечетное число всегда ноу-солюшн? [16:59:40] Pavel: щас подумаю [16:59:44] Constantine Drozdov: любой нечетный цикл обратим, да [17:00:15] Constantine Drozdov: а ну да, очевидно, что четные циклы получаются из четных [17:00:26] Constantine Drozdov: и только из них [17:00:30] Constantine Drozdov: по 2 [17:00:37] Constantine Drozdov: значит их всегда четное число одинаковой длины) [17:00:46] Constantine Drozdov: вот вам и О(n) ![]() [17:01:03] Pavel: да [17:01:11] Pavel: O(n) есть [17:01:17] Pavel: теперь за O(1) давайте )) К сожалению, ухожу, и пока на человеческий язык перевести это не могу.
0
|
|
|
Платежеспособный зверь
8966 / 4389 / 1655
Регистрация: 28.10.2009
Сообщений: 11,647
|
|
| 18.11.2010, 21:21 [ТС] | |
|
Я проанализировал. Не убедило.
Это задача вряд ли опубликована.
0
|
|
|
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
|
||||||
| 19.11.2010, 14:27 | ||||||
2
|
||||||
|
158 / 105 / 6
Регистрация: 22.08.2010
Сообщений: 215
|
|
| 19.11.2010, 15:35 | |
|
Mr.X,
Дело в том, что меня тоже заинтересовала данная задача. Спасибо за готовый солюшен, но не могли бы вы на словах немного пояснить принцип работы вашей программы? Си++ для меня увы, как брейнфак примерно. Ну или поставить пару-тройку комментариев в программе. Спасибо.
0
|
|
|
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
|
||
| 19.11.2010, 16:35 | ||
|
1 2 3 X X X 3 1 2 где средний вектор – искомая подстановка, а нижний - ее заданный квадрат. Подставим в первую позицию искомой подстановки цифру 1. Так как под ней стоит 3, то это означает, что в искомой подстановке единица отображается в тройку, следовательно и под единицей верхнего вектора должна стоять тройка, а там единица, что неверно. Подставим на первую позицию двойку, что означает, что в искомой подстановке присутствует отображение 2 -> 3, следовательно под двойкой верхнего вектора нужно подписать 3, а так как под этой тройкой единица, то в искомой подстановке присутствует отображение 3 -> 1, следовательно под тройкой верхнего вектора нужно подписать 1. Одно из решений найдено. Как только очередной цикл в искомой подстановке заканчивается, очередное значение приходится искать перебором.
1
|
||
|
Платежеспособный зверь
8966 / 4389 / 1655
Регистрация: 28.10.2009
Сообщений: 11,647
|
|
| 19.11.2010, 17:16 [ТС] | |
|
Mr.X, жаль, что вместо С я изучал паскаль, но, зная принцип алгоритма я постараюсь разобраться
0
|
|
|
Фрилансер
3709 / 2083 / 567
Регистрация: 31.05.2009
Сообщений: 6,683
|
|
| 19.11.2010, 20:13 | |
|
Никакого перебора не требуется. Можно построить конструктивный алгоритм. Единственное решение вообще строится легко, перебор всех вариантов - чуть сложнее
Добавлено через 4 минуты Mr.X, нескромный вопрос - если уж Вы постарались написать полностью кошерный код С++, то почему first_zero_pos имеет тип int ? ![]() Добавлено через 2 минуты Раз уж в коммерческой ветке граждане не захотели купить этот алгоритм за 500 рублей, опубликую - не пропадать же добру.. Но только позже - сейчас меня из здания выгонять будут, а мне еще остальные дела закруглять
0
|
|
|
Платежеспособный зверь
8966 / 4389 / 1655
Регистрация: 28.10.2009
Сообщений: 11,647
|
|
| 19.11.2010, 20:46 [ТС] | |
|
Блестящее решение этой задачи предложил Сергей (ms@samaralan.ru ). Всё гениально просто, ни перебора, ни рекурсии, никаких функций и процедур, кроме pred и succ. За что ему мой огромный респект и уважуха.
0
|
|
|
476 / 444 / 34
Регистрация: 20.11.2009
Сообщений: 1,293
|
|
| 19.11.2010, 21:21 | |
|
Расскажите решение, пожалуйста.
0
|
|
|
Платежеспособный зверь
8966 / 4389 / 1655
Регистрация: 28.10.2009
Сообщений: 11,647
|
|
| 19.11.2010, 23:37 [ТС] | |
|
Mr.X, это всё, конечно хорошо, но решение предложенное Сергеем уместилось в один цикл for, то есть задача решена за 1 проход по массиву, просто найден красивый алгоритм присвоения величинам значений номеров
0
|
|
|
476 / 444 / 34
Регистрация: 20.11.2009
Сообщений: 1,293
|
|
| 19.11.2010, 23:49 | |
|
0
|
|
|
Платежеспособный зверь
8966 / 4389 / 1655
Регистрация: 28.10.2009
Сообщений: 11,647
|
|
| 20.11.2010, 02:14 [ТС] | |
|
А это дело хозяйское.
Как с сусликом: Видишь суслика? - Нет. И я не вижу. А он есть.
0
|
|
|
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
| 20.11.2010, 05:13 | |
|
А почему бы не выложить код, чтобы, так сказать, все убедились. Нам всё-таки делиться завещали.
0
|
|
|
Платежеспособный зверь
8966 / 4389 / 1655
Регистрация: 28.10.2009
Сообщений: 11,647
|
||||||
| 20.11.2010, 09:35 [ТС] | ||||||
|
Не вопрос, просто в реальности задача была сложнее, чем заявлена в теме, и решение сделано для более сложной задачи. А задача, описанная здесь, решена внутри этой, более сложной задачи.
Итак, общая задача: Массив А состоит из неповторяющихся чисел от 1 до N Массив B сформирован из массива А по закону: B[A[A[i]]]=i По данному массиву В найти массив А
0
|
||||||
|
Заблокирован
|
||
| 20.11.2010, 14:37 | ||
|
Если нужно вручную проделать такой же алгоритм , то нужно сначало реализовать это сохраниение что уместится не в один цикл . И уж только потом благодаря этим функциям выполнять что требуется .
0
|
||
| 20.11.2010, 14:37 | |
|
Помогаю со студенческими работами здесь
18
как вернуть (вывести) 4 значения Как вернуть 2 значения из функции? Как вернуть значения из цикла? Массивы. Найти максимальные и минимальные значения. В строках, где находятся искомые значения все значения обратить в ноль и вернуть номер строки Как правильно вернуть значения из метода? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Оттенки серого
Argus19 18.03.2026
Оттенки серого
Нашёл в интернете 3 прекрасных модуля:
Модуль класса открытия диалога открытия/ сохранения файла на Win32 API;
Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
|
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога
Финальные проекты на Си и на C++:
finish-rectangles-sdl3-c. zip
finish-rectangles-sdl3-cpp. zip
|
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие.
Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
|
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ВВЕДЕНИЕ
Выполняя задание на управление насосной группой заполнения резервуара,. . .
|
|
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|