|
|
|
Нужен оптимальный алгоритм перестановок элементов массива
|
|||
|---|---|---|---|
|
#18+
Всем добрый день. Существует некоторый массив элементов, в котором элементы расположены так: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 нужно за минимальное число перестановок элементов массива сделать их него вот такой массив: 1 11 21 2 12 22 3 13 23 4 14 24................................ 9 19 29 разрешается выходить за границы массива, то есть делать дополнительные промежуточные элементы. главная задача - минимизировать общее число перестановок. нужна общая схема, не конкретно для 29-ти элементов. но их количество будет всегда кратное общему числу 'цикла' цифр (не знаю как лучше объяснить). спасибо за идеи! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2016, 15:31 |
|
||
|
Нужен оптимальный алгоритм перестановок элементов массива
|
|||
|---|---|---|---|
|
#18+
Тут достаточно сделать функцию сравнения двух элементов и затем сортировку с ее помощью. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2016, 16:03 |
|
||
|
Нужен оптимальный алгоритм перестановок элементов массива
|
|||
|---|---|---|---|
|
#18+
Dima T, для наглядности я представил данные цифрами. в реальном массиве же лежат не цифры, просто их посортировать не получится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2016, 16:06 |
|
||
|
Нужен оптимальный алгоритм перестановок элементов массива
|
|||
|---|---|---|---|
|
#18+
makhaonдля наглядности я представил данные цифрами. в реальном массиве же лежат не цифры, просто их посортировать не получится. Создай еще один массив той же размерности с цифрами, отсортируй его, по нему переставляй в исходном или в новый. функция сравнения Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2016, 16:17 |
|
||
|
Нужен оптимальный алгоритм перестановок элементов массива
|
|||
|---|---|---|---|
|
#18+
Dima T, скажем так. я могу и так узнать, как именно массив зациклен и без сортировки просто сгенерировать нужную последовательность цифр. самый главный вопрос: переставлять потом как? 1. не переставляем. 2. переставляем с 11? потом как мне 2-ку на место (4-е) поставить? :) нет проблемы с сортировкой. непонятно, как потом быстро переставить элементы. вангую - что алгоритм элементарный, но я его не вижу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2016, 16:39 |
|
||
|
Нужен оптимальный алгоритм перестановок элементов массива
|
|||
|---|---|---|---|
|
#18+
makhaonглавная задача - минимизировать общее число перестановок В таком случае: 1) Определяем элементы, которые уже на месте. Исключаем их из процесса. 2) Из оставшихся - помещаем обменом на место первый элемент. Исключаем его. Если обмененный с ним элемент попал на своё место - тоже исключаем. 3) Повторяем пункт 2, пока все элементы не окажутся на своих местах. Фактически - жадный алгоритм. Может не найти оптимум. Но вычислительная сложность поиска оптимума стопудово перевесит его выгодность по отношению к найденному варианту. Дополнительные элементы - не нужны. Предложенный алгоритм гарантированно на каждом шаге уменьшает число стоящих не на месте элементов на 1, а при удаче на 2. При дополнительной памяти шаги с её использованием гарантировано ставят на место не более 1 элемента, а также присутствуют шаги, когда ни один элемент не встаёт на место. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2016, 17:10 |
|
||
|
Нужен оптимальный алгоритм перестановок элементов массива
|
|||
|---|---|---|---|
|
#18+
makhaonDima T, скажем так. я могу и так узнать, как именно массив зациклен и без сортировки просто сгенерировать нужную последовательность цифр. самый главный вопрос: переставлять потом как? 1. не переставляем. 2. переставляем с 11? потом как мне 2-ку на место (4-е) поставить? :) нет проблемы с сортировкой. непонятно, как потом быстро переставить элементы. вангую - что алгоритм элементарный, но я его не вижу. сразу делай сортировку в нужном порядке. В qsort есть предикат сравнения. в твоем случае сравнение делается начиная с младших разрядов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2016, 17:14 |
|
||
|
Нужен оптимальный алгоритм перестановок элементов массива
|
|||
|---|---|---|---|
|
#18+
хеш-функция не вариант? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2016, 18:01 |
|
||
|
Нужен оптимальный алгоритм перестановок элементов массива
|
|||
|---|---|---|---|
|
#18+
Примитив в VBA по исходному условию: Код: vbnet 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2016, 18:12 |
|
||
|
Нужен оптимальный алгоритм перестановок элементов массива
|
|||
|---|---|---|---|
|
#18+
Сделал, в общем, сортировкой с функцией Dima T. похоже - что всё работает, как нужно. наверно быстрее (читай - за меньшее число перестановок), чем быстрая сортировка всё равно не получится. Всем огромное спасибо за обсуждение! Dima T - за функцию! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2016, 19:53 |
|
||
|
Нужен оптимальный алгоритм перестановок элементов массива
|
|||
|---|---|---|---|
|
#18+
makhaon, у членов (инстансы классов) массива добавил его порядковый номер в массиве, по ним и посортировал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2016, 19:56 |
|
||
|
Нужен оптимальный алгоритм перестановок элементов массива
|
|||
|---|---|---|---|
|
#18+
makhaonСуществует некоторый массив элементов, в котором элементы расположены так: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 нужно за минимальное число перестановок элементов массива сделать их него вот такой массив: 1 11 21 2 12 22 3 13 23 4 14 24................................ 9 19 29Т.е. они сгруппированы по значению последней цифры в числе. Какой-то пример приведенный вами не удачный. Потому как исходя из конкретного вашего примера ни каких перестановок и сравнений вообще не нужно. Пишется элементарный алгоритм, который сразу формирует массив согласно предложенного вами. Небольшой комментарий к предлагаемому алгоритму. Предположим у вас в исходном массиве 1000 items. Тогда просто рассчитываем количество item у которых последняя цифра == 1 и генерируем их /то бишь помещаем их в исходный массив сразу. Так как в алгоритме мы знаем индекс где item должен находиться/. Впрочем предложенный способ годится и для остальных последних цифр в значениях items. Sorry. Реализацию алгоритма не стану приводить, так как он тривиально прост. PS: Если бы ваш массив был не упорядоченный, то можно его упорядочить вообще не прибегая ни к каким перестановкам ... Но это уже другая песня ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2016, 20:33 |
|
||
|
Нужен оптимальный алгоритм перестановок элементов массива
|
|||
|---|---|---|---|
|
#18+
Нипанимаю... зафигом нужна сортировка, когда есть алгоритм с гарантированным O(n)? просто описанный мной выше алгоритм нужно инвертировать, и выполнять обмен не по конечной, а по текущей позиции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2016, 21:33 |
|
||
|
Нужен оптимальный алгоритм перестановок элементов массива
|
|||
|---|---|---|---|
|
#18+
AkinaНипанимаю...Нифиганипанимаю +1 а "патриарх "пятничных бенчмарков"" что-то скажет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2016, 22:35 |
|
||
|
Нужен оптимальный алгоритм перестановок элементов массива
|
|||
|---|---|---|---|
|
#18+
Тут нечего добавить. Во первых задачка слишком натянута даже для собеседования. Подозреваю что автор его завалил и пришел сюда с вопросом. Либо она изменена и отличается от изначальной постановки (типичная ситуация). Это мне почему-то напомнило Microsoft-овскую сортировку терабайтного текстового файла с неизвестной длиной строки. Эффективность решения зависит от гарантий того, какие данные придут или могут приходить на вход. Какова статистика. А в сабжевой задаче - сбивает с толку ярко выраженная последовательность целых чисел от 1 до 29 ? Это sequence? Так всегда будет? Тогда решение тривиально. Это генерация новой последовательности. Про это уже писали выше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2016, 23:00 |
|
||
|
Нужен оптимальный алгоритм перестановок элементов массива
|
|||
|---|---|---|---|
|
#18+
mayton, Похоже, речь идет о строковой сортировке по обращенному значению строки. Функция сравнения здесь самая необыкновенно обыкновенная, но применяется не к исходным элементам массива, а к их реверсу, если реверс выделен в отдельную функцию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2016, 02:02 |
|
||
|
Нужен оптимальный алгоритм перестановок элементов массива
|
|||
|---|---|---|---|
|
#18+
похоже на задачку с собеседования, решаемую на раз-два числа записать инвертированными строками лексикографически упорядочить инвертировать (обратно) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2016, 05:12 |
|
||
|
Нужен оптимальный алгоритм перестановок элементов массива
|
|||
|---|---|---|---|
|
#18+
В реальной задаче идет сортировка в TObjectList<T> с помощью компаратора. Функция сортировки, приведенная Dima T отлично работает. Думаю, что существенно большего ускорения как быстрой сортировкой добиться не удастся. Разве что сразу стараться заполнять список вычисляя места данных еще до того, как они будут помещены в список. Однако - текущая скорость обработки меня более чем устраивает. Остановлюсь на это варианте. авторЭто sequence? Так всегда будет? Да, это последовательность. Фактически это номера инстансов в списке. Если сортировать по ним - список сортируется как нужно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2016, 15:14 |
|
||
|
Нужен оптимальный алгоритм перестановок элементов массива
|
|||
|---|---|---|---|
|
#18+
Мудроглюков, авторчисла записать инвертированными строками лексикографически упорядочить инвертировать (обратно) Я привел простой случай, когда массив нужно сортировать с циклом равным 10-ти, однако это не всегда так (точнее так - редкость). Цикл чисел может быть разный, например: 1 2 3 4 5 6 7 8 9 10 > 1 6 2 7 3 8 4 9 10 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2016, 15:47 |
|
||
|
Нужен оптимальный алгоритм перестановок элементов массива
|
|||
|---|---|---|---|
|
#18+
makhaonМудроглюков, авторчисла записать инвертированными строками лексикографически упорядочить инвертировать (обратно) Я привел простой случай, когда массив нужно сортировать с циклом равным 10-ти, однако это не всегда так (точнее так - редкость). Цикл чисел может быть разный, например: И? Тебе уже несколько раз сказали - делаешь свой компаратор. Под свою уникальную последовательность makhaon1 2 3 4 5 6 7 8 9 10 > 1 6 2 7 3 8 4 9 10 и в этом случае компаратор - три строчки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2016, 16:08 |
|
||
|
Нужен оптимальный алгоритм перестановок элементов массива
|
|||
|---|---|---|---|
|
#18+
makhaonВ реальной задаче идет сортировка в TObjectList<T> с помощью компаратора. Функция сортировки, приведенная Dima T отлично работает. Думаю, что существенно большего ускорения как быстрой сортировкой добиться не удастся. Разве что сразу стараться заполнять список вычисляя места данных еще до того, как они будут помещены в список. Однако - текущая скорость обработки меня более чем устраивает. Остановлюсь на это варианте. авторЭто sequence? Так всегда будет? Да, это последовательность. Фактически это номера инстансов в списке. Если сортировать по ним - список сортируется как нужно. Всегда удивляли люди использующие списки. И вдвойне - сортирующие их ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2016, 16:09 |
|
||
|
Нужен оптимальный алгоритм перестановок элементов массива
|
|||
|---|---|---|---|
|
#18+
locked, так я и написал, что сделал компаратор :) как Dima T изначально кинул. автори в этом случае компаратор - три строчки. Нужен один для всех случаев. Потому как все случаи заранее неизвестны. Указанный работает в общем случае. Только вместо периода цикла (10) подставляю своё значение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2016, 18:57 |
|
||
|
Нужен оптимальный алгоритм перестановок элементов массива
|
|||
|---|---|---|---|
|
#18+
locked, авторВсегда удивляли люди использующие списки. И вдвойне - сортирующие их Есть варианты более подходящие для хранения массива инстансов классов? Delphi, если что. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2016, 19:00 |
|
||
|
Нужен оптимальный алгоритм перестановок элементов массива
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 15:37 |
|
||
|
Нужен оптимальный алгоритм перестановок элементов массива
|
|||
|---|---|---|---|
|
#18+
makhaonВсем добрый день. Существует некоторый массив элементов, в котором элементы расположены так: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 нужно за минимальное число перестановок элементов массива сделать их него вот такой массив: 1 11 21 2 12 22 3 13 23 4 14 24................................ 9 19 29 разрешается выходить за границы массива, то есть делать дополнительные промежуточные элементы. главная задача - минимизировать общее число перестановок. нужна общая схема, не конкретно для 29-ти элементов. но их количество будет всегда кратное общему числу 'цикла' цифр (не знаю как лучше объяснить). спасибо за идеи! А в каких позициях должны оказаться числа 10 и 20 ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2016, 18:18 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=39355512&tid=1340551]: |
0ms |
get settings: |
10ms |
get forum list: |
17ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
41ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
85ms |
get tp. blocked users: |
1ms |
| others: | 223ms |
| total: | 401ms |

| 0 / 0 |
