|
v7: Оптимальный алгоритм сортировки массива 🠗 (Злопчинский 15.08.2014 04:29) | ☑ | ||
---|---|---|---|---|
0
Злопчинский
14.08.14
✎
22:33
|
Есть неупорядоченный массив чисел размерностью M, где М - колво элементов массива.
Числа в массиве - любые значения от 0 до N. Числа в массиве могут быть неуникальными. Любим порядок. Хотим получить упорядоченный массив по убыванию. Получить его легко - тупо отсортируем числа массива по убыванию. . Доступен дополнительный "буфер" (массив) размерностью K, где К - колво элементов буфера, К может быть в принципе любым от 1 до М. . То есть в наличии и неотсортированный массив, и отсортированный массив. . Какой алгоритм является оптимальным с точки зрения минимизации количества перестановок элементов исходного неотсортированного массива для получения конечного отсортированного массива (можно использовать буфер, для промежуточного хранения сортируемого массива/его чисел). . |
|||
1
ДенисЧ
14.08.14
✎
22:33
|
||||
2
NS
14.08.14
✎
22:35
|
(0) Уверен что по "количеству перестановок"?
(1) Имел в виду наверно O(n*log n), решается естественно за О(n) при такой формулировке. |
|||
3
Злопчинский
14.08.14
✎
22:42
|
(2) да, по количеству перестановок.
. (1) алгоритм использует только перестановку "между собой" двух элементов - то есть с промежуточным буфером размером = 1. Как-то мне кажется если есть промежуточный буфер сразмером больше 1 - колов перестановк может быть меньше... или не? |
|||
4
Злопчинский
14.08.14
✎
22:43
|
(2) математик я слабый... к сожалению.
|
|||
5
NS
14.08.14
✎
22:45
|
(3) Может быть меньше, но сложность по количеству перестановок все-равно О(M)
Vинимальный - каждое стоящее не на своем месте поставить на свое место. Вроде достаточно одной доп. переменной для этого. Но по количеству сравнений будет О(M^2) |
|||
6
Злопчинский
14.08.14
✎
22:46
|
есть у кого готовая реализация на 1С быстрой упомянутой сортировки..? - потестить бы что получается... или не сам алгоритм,а хотя бы чтоб можно было обсчитать - чтобы я подсунул входной массив данных..
? |
|||
7
NS
14.08.14
✎
22:48
|
(6) Писать надо.
|
|||
8
Злопчинский
14.08.14
✎
22:49
|
(5) вот у меня получается что если больше 1 переменной промежуточной - то гораздо меньше будет перестановок...
|
|||
9
Garykom
гуру
14.08.14
✎
22:50
|
(6) для какой версии 1С то хоть нуна?
|
|||
10
Злопчинский
14.08.14
✎
22:50
|
(7) ну вот я написал, но мну сомнения гложут... а так как я математик слабый - то сомнения сильные...
|
|||
11
Злопчинский
14.08.14
✎
22:50
|
(9) для клюшек давай!
|
|||
12
Злопчинский
14.08.14
✎
22:51
|
в принцуипе даже готов конкурс устроить с денежным призом ;-)
|
|||
13
Злопчинский
14.08.14
✎
22:51
|
в качестве массива хочется ТЗ юзать для большей универсальности!
|
|||
14
NS
14.08.14
✎
22:52
|
(8) Любое значение которое стоит не на своем месте нужно переставить. Алгоритм который переставляет только те элементы которые стоят не на своем месте - требует только одной доп. переменной. То есть это точно минимальный алгоритм.
|
|||
15
NS
14.08.14
✎
22:53
|
(12) Конкурс? Ну у тебя и юмор.
Ищем первое значение которое стоит не на своем месте, ставим его на свое место, значение по адресу куда поставили так-же ставим на "свое место" и т.д. |
|||
16
Злопчинский
14.08.14
✎
22:56
|
можно даже упростить (усложнить?) - главное чтобы были упорядочены не все элементы массива, а первые X
|
|||
17
Garykom
гуру
14.08.14
✎
22:56
|
(15) угу и при этом нужно выполнить кучу сравнений на > < в результате да перестановок минимум а тормозиит ))
|
|||
18
NS
14.08.14
✎
22:56
|
(16) Это задачу не меняет совершенно. Ровно та-же задача.
|
|||
19
Garykom
гуру
14.08.14
✎
22:57
|
может все таки надо не минимум перестановок а быстрейший?
|
|||
20
NS
14.08.14
✎
22:57
|
(17) Прочитай условие - минимизация количества перестановок, а не сравнений. Сравнений будет О(M^2)
|
|||
21
Garykom
гуру
14.08.14
✎
22:58
|
(20) да вот и спрашиваю зачем нужен именно "минимум перестановок"?
|
|||
22
Garykom
гуру
14.08.14
✎
22:59
|
(21)+ т.е. понятно что когда может не хватить памяти то такие алгоритмы и применяют, например можно сортировку делать прямо на hdd(ssd) из памяти одна переменная ))
|
|||
23
NS
14.08.14
✎
22:59
|
(21) Практический пример? Стоит в ряд 100 бетонных маркированных блоков. Переставить в порядке убывания маркировки.
|
|||
24
Злопчинский
14.08.14
✎
23:00
|
(15) хитрый какой... давай нагрузим физикой. - числа вполне реальные физ.объекты.
. > Ищем первое значение которое стоит не на своем месте, - найти не вопрос. > ставим его на свое место, "свое место" - занято. значит - осовобождаем "свое место" - оттуда "лишнее" число сдвигаем в буфер, первое число ставим на свое место. - 2 перестановки. и "лишнее" число - в буфере. |
|||
25
NS
14.08.14
✎
23:00
|
(22) При чем тут память?
|
|||
26
Злопчинский
14.08.14
✎
23:00
|
(21) потому что гоняем не электроны, а вполне себе физобъекты
|
|||
27
Злопчинский
14.08.14
✎
23:01
|
и размер исходного массива - небольшой, сотня-две чисел... скорость расчета тут не важна. важна как раз количество перестановок
|
|||
28
NS
14.08.14
✎
23:01
|
(24) ничего не понял. Ты хочешь сказать что нужно две переменных, так как мы должны помнить пустое место (из которого мы переместили) и значение в руках?
|
|||
29
sda553
14.08.14
✎
23:02
|
(1) Таких сортировок не существует. Хотя бы потому, что для сортировки надо как минимум считать значения всех элементов, алгоритмы сортировок никак не могут быть лучше, чем О(n)
|
|||
30
Злопчинский
14.08.14
✎
23:03
|
(28) угу.. Представь: мы двигаем палеты по складу. стоят неоптимально в ряду. надо переставить чтобы стояли оптимально.
|
|||
31
Злопчинский
14.08.14
✎
23:05
|
число - это вес палеты.
чем больше вес палеты - тем ближе к началу ряда она должна стоять. изначально стоят - абы как... . фсе. |
|||
32
Garykom
гуру
14.08.14
✎
23:05
|
(30) задача понятна теперь, всегда нужно знать прикладную область ))
|
|||
33
NS
14.08.14
✎
23:05
|
(30) То есть переставлять только рядом стоящие? Не поверишь! Но оптимален пузырек! :)
|
|||
34
Злопчинский
14.08.14
✎
23:06
|
в ряду есть пусте палеты..
|
|||
35
NS
14.08.14
✎
23:07
|
И сложность тогда по перестановкам О(M^2)
|
|||
36
Garykom
гуру
14.08.14
✎
23:07
|
(32)+ т.е. есть ряд паллет (с весом), есть буферный ряд куда можно переставлять временно, и есть ряд куда нужно переставить - или нету 3-го ряда и нужно паллеты в том же 1-м ряду оставить?
|
|||
37
Злопчинский
14.08.14
✎
23:07
|
(33) нет. какие угодно можно переставлять.в каком угодно порядке. с использованием промежуточного безразмерного буфера.
|
|||
38
Garykom
гуру
14.08.14
✎
23:08
|
(33) кстати да может все таки не кол-во перестановок нужно уменьшить а пройденный ими путь при передвижениях?
|
|||
39
Злопчинский
14.08.14
✎
23:08
|
(36) совершенно верно. есть буферный ряд - временный и исходный ряд с палетами. все больше места нет. после окончания персеановок буферный ряд - д.б. пустой.
|
|||
40
NS
14.08.14
✎
23:08
|
(37) Не нужен безразмерный буфер. Достаточно буфера на один элемент.
|
|||
41
Garykom
гуру
14.08.14
✎
23:09
|
(39) тогда все просто нам пофиг как переставлять нужно просто табличка старое место - новое место, и все можно переставлять
|
|||
42
Garykom
гуру
14.08.14
✎
23:10
|
(41) а каким образом (алгоритмом) получили эту табличку пофиг в данном случае...
|
|||
43
Злопчинский
14.08.14
✎
23:10
|
(38) если это облегчит решение задачи - то пусть будет так...
|
|||
44
Злопчинский
14.08.14
✎
23:11
|
(41) да, две табличик а) старые места и б) новые места - их не проблема получить. получаются мгновенно.
|
|||
45
Garykom
гуру
14.08.14
✎
23:11
|
(42) хотя нет парю, паллеты же друг другу мешают при перестановке
это кроме 1-го ряда по буферу 2 паллеты разъедутся? |
|||
46
Злопчинский
14.08.14
✎
23:11
|
у меня так и есть - две таблицы - старая расстановка и новая расстановка. дальше пытаюсь минимизировать телодвижения...
|
|||
47
Garykom
гуру
14.08.14
✎
23:13
|
(45) просто если нет, то это головоломка получается если нужно переставить местами 1-ю и последнюю паллеты ))
|
|||
48
Злопчинский
14.08.14
✎
23:14
|
(45) палеты таскает один человек (пока так). поэтому никто никому не мешает - взял палету - вытащил откуда-то, поставил куда-то. и т.д. пока не получим из старой - новую расстановку
|
|||
49
Злопчинский
14.08.14
✎
23:15
|
ну... я могу предсотавить исходный массив и что у меня получилось... по перестановкам.. как у слабого математика..
|
|||
50
Garykom
гуру
14.08.14
✎
23:15
|
(48) т.е. буфер он многорядный? можно поставить паллеты не в ряд а еще одним рядом? сколько максимум?
|
|||
51
Злопчинский
14.08.14
✎
23:19
|
(50) пока - пофиг. представь что буфер - он везде. но он однеомерный, линейный.
|
|||
52
Злопчинский
14.08.14
✎
23:19
|
Исходные данные
Палета вес 01-001-01 26 01-002-01 27 01-003-01 14 01-004-01 31 01-005-01 23 01-006-01 21 01-007-01 30 01-008-01 25 01-009-01 24 01-010-01 23 01-011-01 21 01-012-01 8 01-013-01 8 01-014-01 3 01-015-01 21 01-016-01 3 01-017-01 7 01-018-01 6 01-019-01 10 01-020-01 26 01-021-01 17 01-022-01 27 01-023-01 7 01-024-01 15 01-025-01 15 01-026-01 28 01-027-01 15 01-028-01 30 01-029-01 8 01-030-01 2 01-031-01 13 01-032-01 2 01-033-01 16 01-034-01 9 01-035-01 18 01-036-01 6 01-043-01 11 01-044-01 4 01-045-01 9 01-046-01 6 01-047-01 4 01-048-01 6 01-049-01 3 01-050-01 3 01-051-01 8 01-052-01 3 01-053-01 8 01-054-01 3 01-055-01 5 01-056-01 5 01-057-01 4 01-058-01 2 01-059-01 13 01-060-01 3 01-061-01 11 01-062-01 4 01-063-01 4 01-064-01 2 01-065-01 11 01-066-01 0 01-067-01 15 01-069-01 10 01-071-01 1 01-073-01 12 01-074-01 15 01-075-01 5 01-076-01 2 01-077-01 3 01-078-01 4 01-079-01 4 01-080-01 9 01-081-01 2 01-082-01 5 01-083-01 4 01-084-01 25 01-085-01 9 01-086-01 0 01-087-01 2 01-088-01 3 01-089-01 5 01-090-01 22 01-091-01 7 01-092-01 3 01-093-01 14 01-094-01 3 01-095-01 4 01-096-01 3 01-103-01 4 01-104-01 3 01-105-01 7 01-106-01 3 01-107-01 15 01-108-01 2 01-109-01 11 01-110-01 2 01-111-01 4 01-112-01 4 01-113-01 12 01-114-01 4 01-115-01 0 01-116-01 5 01-117-01 2 01-118-01 5 01-119-01 3 01-120-01 0 01-121-01 1 01-122-01 1 01-123-01 1 01-124-01 1 01-125-01 2 01-126-01 1 01-127-01 6 01-128-01 0 01-129-01 2 01-130-01 3 01-131-01 2 01-132-01 7 01-133-01 2 01-134-01 9 01-135-01 3 01-136-01 3 01-137-01 0 01-138-01 4 01-139-01 3 01-140-01 1 01-141-01 7 01-142-01 3 01-143-01 3 01-144-01 7 |
|||
53
Garykom
гуру
14.08.14
✎
23:22
|
Если буфер многорядный (т.е. есть место для разъезда паллет) то алгоритм такой выходит:
1. Вычисляем любым алгоритмом таблицу откуда-куда 2. Берем 1-ю паллету, точнее не берем а вытаскиваем в буфер паллету с того места куда нужно поставить 1-ю 3. Проверяем не свободны ли места куда нужно поставить паллеты из буфера, если свободны - ставим 4. Берем следующую паллету в ряду и по пункту 2. 5. Пункт 3. |
|||
54
Garykom
гуру
14.08.14
✎
23:22
|
(53)+ пропустил между 2 и 3 ставим паллету на освободившееся место
|
|||
55
Злопчинский
14.08.14
✎
23:23
|
(53) ну у меня так и сделано.. но гложут сомнения
|
|||
56
Garykom
гуру
14.08.14
✎
23:24
|
Т.е. правильно
1. Вычисляем любым алгоритмом таблицу откуда-куда 2. Берем 1-ю паллету не на своем месте, точнее не берем а вытаскиваем в буфер паллету с того места куда нужно поставить 1-ю 3. Ставим паллету на освободившееся место. 4. Проверяем не свободны ли места куда нужно поставить паллеты из буфера, если свободны - ставим 5. Снова пункт 2 6. Если все паллеты на своих местах, то чистим буфер и профит... |
|||
57
Злопчинский
14.08.14
✎
23:26
|
исходно
Пал вес 01-001-01 26 01-002-01 27 01-003-01 14 01-004-01 31 01-005-01 23 01-006-01 21 01-007-01 30 01-008-01 25 01-009-01 24 01-010-01 23 01-011-01 21 01-012-01 8 01-013-01 8 01-014-01 3 01-015-01 21 01-016-01 3 01-017-01 7 01-018-01 6 01-019-01 10 01-020-01 26 01-021-01 17 01-022-01 27 01-023-01 7 01-024-01 15 01-025-01 15 01-026-01 28 01-027-01 15 01-028-01 30 01-029-01 8 01-030-01 2 01-031-01 13 01-032-01 2 01-033-01 16 01-034-01 9 01-035-01 18 01-036-01 6 01-043-01 11 01-044-01 4 01-045-01 9 01-046-01 6 01-047-01 4 01-048-01 6 01-049-01 3 01-050-01 3 01-051-01 8 01-052-01 3 01-053-01 8 01-054-01 3 01-055-01 5 01-056-01 5 01-057-01 4 01-058-01 2 01-059-01 13 01-060-01 3 01-061-01 11 01-062-01 4 01-063-01 4 01-064-01 2 01-065-01 11 01-066-01 0 01-067-01 15 01-069-01 10 01-071-01 1 01-073-01 12 01-074-01 15 01-075-01 5 01-076-01 2 01-077-01 3 01-078-01 4 01-079-01 4 01-080-01 9 01-081-01 2 01-082-01 5 01-083-01 4 01-084-01 25 01-085-01 9 01-086-01 0 01-087-01 2 01-088-01 3 01-089-01 5 01-090-01 22 01-091-01 7 01-092-01 3 01-093-01 14 01-094-01 3 01-095-01 4 01-096-01 3 01-103-01 4 01-104-01 3 01-105-01 7 01-106-01 3 01-107-01 15 01-108-01 2 01-109-01 11 01-110-01 2 01-111-01 4 01-112-01 4 01-113-01 12 01-114-01 4 01-115-01 0 01-116-01 5 01-117-01 2 01-118-01 5 01-119-01 3 01-120-01 0 01-121-01 1 01-122-01 1 01-123-01 1 01-124-01 1 01-125-01 2 01-126-01 1 01-127-01 6 01-128-01 0 01-129-01 2 01-130-01 3 01-131-01 2 01-132-01 7 01-133-01 2 01-134-01 9 01-135-01 3 01-136-01 3 01-137-01 0 01-138-01 4 01-139-01 3 01-140-01 1 01-141-01 7 01-142-01 3 01-143-01 3 01-144-01 7 |
|||
58
Злопчинский
14.08.14
✎
23:28
|
итог
пал вес 01-001-01 31 01-002-01 30 01-003-01 30 01-004-01 28 01-005-01 27 01-006-01 27 01-007-01 26 01-008-01 26 01-009-01 25 01-010-01 25 01-011-01 24 01-012-01 23 01-013-01 23 01-014-01 22 01-015-01 21 01-016-01 21 01-017-01 21 01-018-01 18 01-019-01 17 01-020-01 16 01-021-01 15 01-022-01 15 01-023-01 15 01-024-01 15 01-025-01 15 01-026-01 15 01-027-01 14 01-028-01 14 01-029-01 13 01-030-01 13 01-031-01 12 01-032-01 12 01-033-01 11 01-034-01 11 01-035-01 11 01-036-01 11 01-043-01 10 01-044-01 10 01-045-01 9 01-046-01 9 01-047-01 9 01-048-01 9 01-049-01 9 01-050-01 8 01-051-01 8 01-052-01 8 01-053-01 8 01-054-01 8 01-055-01 7 01-056-01 7 01-057-01 7 01-058-01 7 01-059-01 7 01-060-01 7 01-061-01 7 01-062-01 6 01-063-01 6 01-064-01 6 01-065-01 6 01-066-01 6 01-067-01 5 01-069-01 5 01-071-01 5 01-073-01 5 01-074-01 5 01-076-01 5 01-075-01 5 01-077-01 4 01-078-01 4 01-079-01 4 01-080-01 4 01-081-01 4 01-082-01 4 01-083-01 4 01-084-01 4 01-085-01 4 01-086-01 4 01-087-01 4 01-088-01 4 01-134-01 4 01-135-01 4 01-089-01 3 01-090-01 3 01-091-01 3 01-092-01 3 01-093-01 3 01-094-01 3 01-095-01 3 01-096-01 3 01-103-01 3 01-104-01 3 01-105-01 3 01-106-01 3 01-107-01 3 01-108-01 3 01-109-01 3 01-110-01 3 01-111-01 3 01-112-01 3 01-113-01 3 01-114-01 3 01-136-01 3 01-115-01 2 01-116-01 2 01-118-01 2 01-119-01 2 01-120-01 2 01-121-01 2 01-122-01 2 01-123-01 2 01-124-01 2 01-125-01 2 01-126-01 2 01-117-01 2 01-127-01 2 01-138-01 2 01-128-01 1 01-129-01 1 01-139-01 1 01-140-01 1 01-141-01 1 01-142-01 1 01-143-01 1 01-130-01 0 01-131-01 0 01-132-01 0 01-133-01 0 01-137-01 0 01-144-01 0 |
|||
59
Злопчинский
14.08.14
✎
23:32
|
Получилось
Требуемый размер буфера = 20 Мест без движения = 18 Количество перестановок = 165 . есть помарки в алгоритме, но они несущественные. . вот примерно так6 -- шаг: 001 -- 01-001-01(26) -> *БУФЕР-БОЛЬШОЙ*(1) 01-004-01(31) -> 01-001-01(пусто) -- шаг: 002 -- 01-002-01(27) -> *БУФЕР-БОЛЬШОЙ*(2) 01-028-01(30) -> 01-002-01(пусто) -- шаг: 003 -- 01-003-01(14) -> *БУФЕР-БОЛЬШОЙ*(3) 01-007-01(30) -> 01-003-01(пусто) -- шаг: 004 -- 01-026-01(28) -> 01-004-01(пусто) -- шаг: 005 -- 01-005-01(23) -> *БУФЕР-БОЛЬШОЙ*(4) *БУФЕР-БОЛЬШОЙ* (27) -> 01-005-01(пусто) -- шаг: 006 -- 01-006-01(21) -> *БУФЕР-БОЛЬШОЙ*(4) 01-022-01(27) -> 01-006-01(пусто) -- шаг: 007 -- *БУФЕР-БОЛЬШОЙ* (26) -> 01-007-01(пусто) -- шаг: 008 -- 01-008-01(25) -> *БУФЕР-БОЛЬШОЙ*(4) 01-020-01(26) -> 01-008-01(пусто) -- шаг: 009 -- 01-009-01(24) -> *БУФЕР-БОЛЬШОЙ*(5) *БУФЕР-БОЛЬШОЙ* (25) -> 01-009-01(пусто) -- шаг: 010 -- 01-010-01(23) -> *БУФЕР-БОЛЬШОЙ*(5) 01-084-01(25) -> 01-010-01(пусто) -- шаг: 011 -- 01-011-01(21) -> *БУФЕР-БОЛЬШОЙ*(6) *БУФЕР-БОЛЬШОЙ* (24) -> 01-011-01(пусто) -- шаг: 012 -- 01-012-01(8) -> *БУФЕР-БОЛЬШОЙ*(6) *БУФЕР-БОЛЬШОЙ* (23) -> 01-012-01(пусто) ну и т.д. |
|||
60
Злопчинский
14.08.14
✎
23:33
|
то есть алгоритм как в (56), но гложут сомнения...
|
|||
61
Злопчинский
14.08.14
✎
23:34
|
ушел на автобус.. с надеждой...
|
|||
62
Garykom
гуру
14.08.14
✎
23:52
|
оп понял нужен банальный прогон действий виртуально тогда будет M+1 перестановок ))
т.е. в коде (59) 2-й шаг другой -- шаг: 001 -- 01-001-01(26) -> *БУФЕР-БОЛЬШОЙ*(1) 01-004-01(31) -> 01-001-01(пусто) Счас место 4 свободно ищем что туда нужно поставить и ставим -- шаг: 002 -- 01-026-01(28) -> 01-004-01(пусто) и т.д. не трогаем буфер пока есть пустые места для заполнения(перестановок напрямую) не из буфера |
|||
63
Garykom
гуру
14.08.14
✎
23:55
|
(62)+ эээ насчет M+1 погорячился, но уменьшить до минимума перестановок можно
|
|||
64
Garykom
гуру
14.08.14
✎
23:56
|
(63)+ правильнее будет сказать в самом лучшем случае будет M+1 перестановок, если последним поставленным на место будет единственный элемент который засунули в буфер ))
|
|||
65
NS
14.08.14
✎
23:56
|
Для а=1 по м цикл
пустоеместо=а; значение=знач[а]; Пока значениевотсортированноммассиве[пустоеместо]<>значение Цикл темп=найтигденаходится в знач(значениевотсортированноммассиве[пустоеместо]); переместить с темп в пустоеместо; пустоеместо=темп; КонецЦикла; КонецЦикла |
|||
66
NS
14.08.14
✎
23:57
|
Каждый элемент стоящий не на своем месте будет перемещен ровно один раз, сразу на правильное место.
|
|||
67
Garykom
гуру
14.08.14
✎
23:59
|
(66) не не не может с первичной раскладкой не повезти, например самый хреновый случай все элементы попарно нужно переставить ))
1 и 2, 3 и 4 и т.д. |
|||
68
Garykom
гуру
15.08.14
✎
00:00
|
Задачка то действительно весьма конкурсная, узнать минимально необходимое кол-во перестановок ))
|
|||
69
NS
15.08.14
✎
00:00
|
(67) Ну и?
|
|||
70
Garykom
гуру
15.08.14
✎
00:01
|
(67)+ если перестановка это взять паллету, переставить сразу на нужное место или в буфер, или из буфера в нужное место
|
|||
71
Garykom
гуру
15.08.14
✎
00:02
|
(69) перестановка что такое? если использован буфер то это одна или все таки 2 перестановки?
|
|||
72
NS
15.08.14
✎
00:03
|
Первое стоит не на своем месте, поднимаем его, смотрим какое должно стоять на нем - второй элемент массива.
Ставим его на первое место, первое опускаем на второе. После этого второе стоит на своем месте. Третье не на своем, поднимаем его, смотрим какое должно стоять на его месте. Четвертое. Ставим четвертое на третье место. Поднятое опускаем на четвертое. Все четыре стояли не на своих местах. Четыре перестановки мы и сделали. |
|||
73
NS
15.08.14
✎
00:04
|
(71) А не важно, и так и так минимально возможное количество перестановок.
|
|||
74
NS
15.08.14
✎
00:05
|
(71) каждое не на своем месте ровно один раз снять (с неправильного места), и один раз поставить (на правильное место). И явно это минимальное количество перестановок.
|
|||
75
Garykom
гуру
15.08.14
✎
00:05
|
(72) это если 2 погрузчика работают то да супер а если 1?
Первое стоит не на своем месте, поднимаем его, +1 смотрим какое должно стоять на нем - второй элемент массива. Ставим его на первое место, +1 первое опускаем на второе. +1 После этого второе стоит на своем месте. Третье не на своем, поднимаем его +1 , смотрим какое должно стоять на его месте. Четвертое. Ставим четвертое на третье место. +1 Поднятое опускаем на четвертое. +1 Все четыре стояли не на своих местах. Четыре перестановки мы и сделали. Итого 6 перестановок! |
|||
76
NS
15.08.14
✎
00:06
|
(75) И все равно это минимальное количество перестановок.
|
|||
77
Garykom
гуру
15.08.14
✎
00:10
|
Вообщем задача решается за от M+1 до M+M/2 перестановок в случае 1-го погрузчика
|
|||
78
Garykom
гуру
15.08.14
✎
00:15
|
(76) да минимальное согласен, и алгоритм (65) походу правильный, только бы еще счетчик перестановок добавить ))
|
|||
79
Garykom
гуру
15.08.14
✎
00:16
|
(NS) если в курсе что такое вектор признаков и приходилось заниматься классификацией/кластеризацией то можешь помочь?
|
|||
80
NS
15.08.14
✎
00:20
|
(79) Я спать хочу. :)
Конечно я знаю что такое вектор признаков. |
|||
81
Garykom
гуру
15.08.14
✎
00:22
|
(80) это не срочно ;)
все та же задачка разделения строки на подстроки по накопленным образцам правильного разделения, с помещением подстрок в нужные колонки |
|||
82
Garykom
гуру
15.08.14
✎
00:26
|
(81)+ сейчас я решаю ее правилами 2-х видов "хорошо" и "плохо" и сравнением кол-ва этих правил которым удовлетворяет подстрока
но это очень медленно, так как проверяются все подстроки на соответствие всем правилам - полный перебор вот и хочется ускорить заюзав многомерное пространство признаков подстрок |
|||
83
NS
15.08.14
✎
00:39
|
А где условие то?
|
|||
84
Garykom
гуру
15.08.14
✎
00:40
|
(83) А отдельную ветку не создавал, писал в разных сорри
|
|||
85
Garykom
гуру
15.08.14
✎
00:42
|
Как насчет очень умной загрузки разных табличных документов из таблиц excel'я?
Тех же накладных из формы Торг-12 и т.д. У нас сейчас полуручной режим сначала правим ексель ручками, а это очень долго потому что название товара нужно разделить на вид товара, название, артикул и т.д. в форме торг-12 оно одной строкой идет а нужно раздельно. Вот и приходится извращаться с НАЙТИ() и ПСТР() и только потом грузить готовую форму. Предложение сделать простую в использовании НЕ программистом программу для предварительной конвертации таких табличных файлов. Да конечно проще всего согласовать с поставщиками формат электронных накладных, вот тока скинуть накладную в экселе может любой манагер любого контрагента и выгрузить в DBF или чем еще не все и притом что делать когда поставщиков несколько десятков как со всеми согласовать? У меня сейчас сделан некий набросок такой программы: 1. Открывается таблица исходная 2. Пользователь отмечает нужные и ненужные колонки/строки - при этом автоматически все похожие строки/колонки также выделяются цветом, т.е. попадают в нужные и ненужные. Остальные этапы типа добавление доп.колонок и перенос в них данных из существующих ячеек и прочее пока в обдумывании. В принципе даже существует аналог для подобного он он слишком сложный для использования когда много разных форматов а не один настроенный. http://infostart.ru/public/21810/ |
|||
86
Garykom
гуру
15.08.14
✎
00:42
|
пример оттуда же
1-я строка кольцо арт.111 17,5 585 3,5 гр. фианит 2-я строка 222 кольцо 18 4,0 гранат 3-я строка кольцо 333 (925) 5,4 гр куб циркония нужно выделить для каждой строки: артикул, вид изделия, вес, пробу, размер и вставки вот как это сделать если в строке оно может быть как угодно |
|||
87
Garykom
гуру
15.08.14
✎
00:45
|
(85)+ уже решена задача авто выбора нужных и отбрасывания ненужных ячеек, т.е. всяческие шапки на каждой странице и прочее подобное выкидывает автоматом
но вот разделение строк на реквизиты номенклатуры это пока проблема, то что сделал по сути не пашет как только кол-во правил переваливает за некоторое кол-во |
|||
88
Злопчинский
15.08.14
✎
02:00
|
(70) помещение вбуфер - это есть отдельная перестановка.
Перестановка - элементарное перемещение (откуда, куда) |
|||
89
Злопчинский
15.08.14
✎
02:07
|
(62) без разницы - у меня это делается 4 шагом, а не вторым. т.к к увеличению затрат это не приводит, и у тебя и у меня перестановка 01-026-01(28) -> 01-004-01(пусто) производится без дополнительных промежуточных движений.
|
|||
90
Злопчинский
15.08.14
✎
02:12
|
(75) да, 6 перестановок
|
|||
91
дедушка Вах
15.08.14
✎
02:26
|
если вы уже про многомерные массивы, то там вероятность быстрее считать чем тупо перебором
|
|||
92
Злопчинский
15.08.14
✎
02:35
|
(65) попытаюсь вкурить...
|
|||
93
Злопчинский
15.08.14
✎
03:15
|
(66) и (65) вот ты пишешь, елы-палы...
> Каждый элемент стоящий не на своем месте будет перемещен ровно один раз, сразу на правильное место. - не выйдет. Возьмем колво элементов = N. Рассмотрим случай, когда все элементы стоят не на своих местах. Очевидно, что "каждый элемент, стоящий не на своем месте будет перемещен !!ровно один раз, сразу на правильное место!!" - неверно, т.к. любой элемент не может быть перемещен сразу на правильное свое место - так как это место ЗАНЯТО ДРУГИМ элементом. Предварительно правильное место надо освободить (переместить в буфер), то есть совершить более одного перемещения для положения элемента на правильное место. и так далеее: далее в буфере сидит элемент, есть пустое место (откуда извлекли элемент который сейчас оказался на своем месте) и оно может использоваться как буфер или как приемник для предназначенного ему элемента. В худшем случае можно получитm оценку макcимального количества перемещений = 2N, все элементы перемещаются в буфер (N перемещений), из буфера каждый элемент кидается на свое место которое заведомо свободно (еще N перемещений). |
|||
94
Злопчинский
15.08.14
✎
03:18
|
для конкретной произвольной расстановки - каков будет порядок величины требуемых перемещений по сравнени с N...?
|
|||
95
Злопчинский
15.08.14
✎
03:26
|
(64) угу,
но вот каков оптимальный алгоритм перестановок для произвольного случая...? |
|||
97
Garykom
гуру
15.08.14
✎
03:43
|
(95) дык он уже описан в (65)
|
|||
98
Злопчинский
15.08.14
✎
03:47
|
Сформулирую задачу еще раз, максимально близко к реальности физической ;-)
1. есть линейный ряд ячеек. 2. ячейки нумеруются от 1 до N. 3. есть М товаров, где М не больше N М=N - в каждой ячейке лежит разный товар (один и тот же товар не может занимать больше 1 ячейки), свободных ячеек нет. М<N - в каждой ячейке лежит разный товар, есть свободные ячейки 4. каждый товар имеет произвольный вес, пустые ячейки соответственно имеют вес=0. 5. Имеется свободное буферное пространство размером N ячеек (что эквивалентно неограниченному размеру буфера) 6. требуется упорядочить расстановку товаров в ряду по убыванию веса с минимально возможным количеством перемещений товаров между ячейками/буфером (и сообщить сколько максимально задейстовано буферных ячеек). 7. Перемещения выполняет 1 человек. 8. Товар может находиться либо в ячейке, либо в буфере, в "воздухе" не болтается... . пункт 6 может быть дополнительно ограничен условием на размер буферных ячеек: сколько надо перемещений если буферная ячейка =1? = 2..? |
|||
99
Garykom
гуру
15.08.14
✎
03:48
|
(94) от N+1 до N+N/2 точнее только прогоном алгоритма в (65) с добавленным счетчиком
ну или нахождением кол-ва паллет которые нужно поменять просто местами, каждая такая пара паллет дает +1 к N (не обязательно пара может быть группа из 2,3 и более которые нужно переставить внутри этой группы не трогая другие, т.е. группа замкнута) |
|||
100
Злопчинский
15.08.14
✎
03:48
|
(97) криво описан, где буфер там?
NS уж сильно абcтрагировался... $-) |
|||
101
Garykom
гуру
15.08.14
✎
03:51
|
(100) дык не вышло у него больше одного значения в буфер засунуть ))
значение у него буфер |
|||
102
Garykom
гуру
15.08.14
✎
03:52
|
(101) т.е. даже самый оптимальный алгоритм не требует больше одного буферного места
|
|||
103
Злопчинский
15.08.14
✎
03:53
|
(99) в (65) криво - хотя бы потому что если помещение в буфер это оператор
значение=знач[а]; то в лучшем случае расстановки (когда все товары стоят на своих местах) товар сделает лишнее движение по буферу (или останется в буфере) |
|||
104
Злопчинский
15.08.14
✎
03:53
|
(102) вот сомневаюсь я...
|
|||
105
Garykom
гуру
15.08.14
✎
03:54
|
(103) дык это ж алгоритм а не прога управления роботом-погрузчиком ))
|
|||
106
Злопчинский
15.08.14
✎
03:58
|
(105) да пофиг робот или прога/алгоритм.. последовательность шагов/перемещений нужна
|
|||
107
Злопчинский
15.08.14
✎
03:59
|
Вот совсем близко к реальности, живые данные
Товар-Ячейка-Вес (вес - это некий обобщенный критерий), м.б.=0 ячейка может быть пустая, пустая ячейка тоже имеет вес=0 . Товар Ячейка Вес 630044 01-001-01 26 420244 01-002-01 27 900638 01-003-01 14 420256 01-004-01 31 900092 01-005-01 23 420258 01-006-01 21 900082 01-007-01 30 420616 01-008-01 25 900094 01-009-01 24 630880 01-010-01 23 428132 01-011-01 21 630414 01-012-01 8 900884 01-013-01 8 595056 01-014-01 3 900048 01-015-01 21 595066 01-016-01 3 634522 01-017-01 7 634524 01-018-01 6 630886 01-019-01 10 420644 01-020-01 26 900076 01-021-01 17 900620 01-022-01 27 630536 01-023-01 7 668220 01-024-01 15 900870 01-025-01 15 378878 01-026-01 28 900872 01-027-01 15 428260 01-028-01 30 900874 01-029-01 8 594124 01-030-01 2 794003 01-031-01 13 594128 01-032-01 2 900020 01-033-01 16 594222 01-034-01 9 900022 01-035-01 18 594225 01-036-01 6 900026 01-043-01 11 892066 01-044-01 4 900030 01-045-01 9 892064 01-046-01 6 900032 01-047-01 4 318022 01-048-01 6 900034 01-049-01 3 318512 01-050-01 3 900036 01-051-01 8 892044 01-052-01 3 900040 01-053-01 8 892042 01-054-01 3 668142 01-055-01 5 892040 01-056-01 5 900043 01-057-01 4 892018 01-058-01 2 900044 01-059-01 13 892016 01-060-01 3 630884 01-061-01 11 892014 01-062-01 4 900049 01-063-01 4 863152 01-064-01 2 900050 01-065-01 11 623570 01-066-01 0 900054 01-067-01 15 900056 01-069-01 10 900070 01-071-01 1 900060 01-073-01 12 888425 01-074-01 15 900062 01-075-01 5 863154 01-076-01 2 900063 01-077-01 3 602020 01-078-01 4 601250 01-079-01 4 863080 01-080-01 9 601028 01-081-01 2 602024 01-082-01 5 595064 01-083-01 4 888225 01-084-01 25 594012 01-085-01 9 01-086-01 0 892320 01-087-01 2 637410 01-088-01 3 668140 01-089-01 5 643555 01-090-01 22 900676 01-091-01 7 594018 01-092-01 3 900084 01-093-01 14 594020 01-094-01 3 637414 01-095-01 4 594022 01-096-01 3 900832 01-103-01 4 594024 01-104-01 3 631424 01-105-01 7 594026 01-106-01 3 900634 01-107-01 15 594028 01-108-01 2 900636 01-109-01 11 892068 01-110-01 2 900810 01-111-01 4 892092 01-112-01 4 900812 01-113-01 12 892094 01-114-01 4 630329 01-115-01 0 892090 01-116-01 5 630889 01-117-01 2 594244 01-118-01 5 630914 01-119-01 3 630330 01-120-01 0 594236 01-121-01 1 594328 01-122-01 1 897422 01-123-01 1 594520 01-124-01 1 892340 01-125-01 2 594524 01-126-01 1 420645 01-127-01 6 630331 01-128-01 0 897420 01-129-01 2 630364 01-130-01 3 892322 01-131-01 2 634520 01-132-01 7 900644 01-133-01 2 630690 01-134-01 9 896962 01-135-01 3 630890 01-136-01 3 623344 01-137-01 0 630917 01-138-01 4 630916 01-139-01 3 900698 01-140-01 1 900898 01-141-01 7 896964 01-142-01 3 906320 01-143-01 3 637428 01-144-01 7 |
|||
108
Злопчинский
15.08.14
✎
04:01
|
01-086-01 - пустая ячейка
|
|||
109
Злопчинский
15.08.14
✎
04:03
|
если нужена всего 1 буферная ячейка - ну сильно сомнительно мне это... не получается у мну так...
|
|||
110
Злопчинский
15.08.14
✎
04:11
|
ага.. вроде кажется начинаю въезжать...
|
|||
111
Злопчинский
15.08.14
✎
04:13
|
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс, 1996 г.
- ну точняк про меня... |
|||
112
Злопчинский
15.08.14
✎
04:15
|
все, понял (вроде) что в (65) NS написал...
мдя.. пойти застрелиться что ли... |
|||
113
Злопчинский
15.08.14
✎
04:28
|
Притоплю пока.. до разборок..
|
|||
114
Злопчинский
15.08.14
✎
04:45
|
блин, пытаюсь вспомнить, чего же у меян алгоритм не такой простой как в (65)...
усложним задачу: требуется чтобы оптимально была расставлена лишь часть прохода (от его начала), например, первые 30 ячеек? порядок растановки следующих ячеек - несущественен. |
|||
115
Злопчинский
15.08.14
✎
04:46
|
.. и сращзу все тсановится интереснеее.. (?)
|
|||
116
wertyu
15.08.14
✎
05:40
|
(6) выгрузить массив в список и отсортировать
|
|||
117
NS
15.08.14
✎
10:51
|
(114) алгоритм при этом не меняется.
|
|||
118
ADirks
15.08.14
✎
11:45
|
(0) возьми алгоритм QuickSort, к примеру на C, и перепиши на 1С - это легко, я даже когда то делал для прикола, только оно потерялось.
|
|||
119
ADirks
15.08.14
✎
11:49
|
собственно, http://infostart.ru/public/128251/
|
|||
120
Garykom
гуру
15.08.14
✎
12:49
|
(116) мне нравится Ваш юмор но надо все таки призаки )) или :) ставить...
|
|||
121
Torquader
15.08.14
✎
14:17
|
На самом деле, когда идёт оценка алгоритма, то забывают, что перестановка и сравнение - операции разные.
Например, для объектов, перестановка - замена адреса положения объекта в переменной (то есть одного числа), а для структур, например, перестановка всей структуры. Так что - массив может потребоваться только для того, чтобы сохранить данные перестановок до того, как они будут сделаны и избежать многократной перестановки одного элемента. Для 1С, насколько я понимаю, копирование переменных не приводит к копированию объектов, так что перестановка не даёт большой нагрузки на память, а вот сравнение элементов - обращение к полям объекта - даёт некоторую нагрузку. |
|||
122
NS
15.08.14
✎
14:24
|
(121) Ты о чем?
|
|||
123
Torquader
15.08.14
✎
14:29
|
(122) Я о том, что когда идёт оценка O(n), то оцениваются какие-то "сферические операции в вакууме".
В реальных данных, может оказаться, что одна перестановка стоит по затратам времени десяти и более сравнений. |
|||
124
Torquader
15.08.14
✎
14:30
|
Не забываем, также, что в базах данных сами записи вообще не затрагиваются - вместо перестановок создаётся дерево индекса.
|
|||
125
NS
15.08.14
✎
14:53
|
(123) Когда оценивается О(n) - оценивается предел при n стремящемся к бесконечности, и понятно что независимо от константы значащей останется только операция с худшей сложностью.
Только вопрос - какое отношение это имеет к теме? Ты ветку хоть читал? |
|||
126
Злопчинский
16.08.14
✎
02:06
|
читаю.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |