|
Помогите решить задачку с сортировкой двумерного массива по ключу | ☑ | ||
---|---|---|---|---|
0
Zakella86
30.08.16
✎
17:51
|
Помогите решить задачку.
[url=http://radikal.ru][img]http://s41.radikal.ru/i093/1608/53/1092dc1291f2.png[/img][/url] я часть уже решил , но дальше не могу понять что делать вот часть моего решения Массив = Новый Массив(6, 5); массив[0][0]=1; массив[0][1]=6; массив[0][2]=3; массив[0][3]=4; массив[0][4]=5; массив[1][0]=2; массив[1][1]=2; массив[1][2]=1; массив[1][3]=2; массив[1][4]=3; массив[2][0]=5; массив[2][1]=6; массив[2][2]=6; массив[2][3]=4; массив[2][4]=7; массив[3][0]=4; массив[3][1]=4; массив[3][2]=5; массив[3][3]=1; массив[3][4]=2; массив[4][0]=1; массив[4][1]=2; массив[4][2]=2; массив[4][3]=2; массив[4][4]=3; массив[5][0]=3; массив[5][1]=6; массив[5][2]=4; массив[5][3]=4; массив[5][4]=5; ПервыйКлюч=2; ВторойКлюч=4; МассивКлючей=Новый Массив(6,5); Для ИндексСтрока = 0 По Массив.Количество() - 1 Цикл Для ИндексСтолбец = 0 По Массив[ИндексСтрока].Количество() - 1 Цикл //Сообщить(Массив[ИндексСтрока][ИндексСтолбец]); Если ИндексСтолбец=ПервыйКлюч-1 Тогда МассивКлючей[ИндексСтрока][ПервыйКлюч-1]=Массив[ИндексСтрока][ИндексСтолбец]; КонецЕсли; Если ИндексСтолбец=ВторойКлюч-1 Тогда МассивКлючей[ИндексСтрока][ВторойКлюч-1]=Массив[ИндексСтрока][ИндексСтолбец]; КонецЕсли; КонецЦикла; КонецЦикла; |
|||
2
Zakella86
30.08.16
✎
17:56
|
http://i11.pixs.ru/storage/9/2/2/1jpg_5947600_23112922.jpg вот изображение получше
|
|||
3
Euguln
30.08.16
✎
17:56
|
ТЗ.Свернуть()
|
|||
4
Zakella86
30.08.16
✎
17:57
|
неа, не все так просто, тут прикол именно в двумерном массиве
|
|||
5
Euguln
30.08.16
✎
17:58
|
(4) Выгрузи в тз, сверни, выгрузи в массив.
|
|||
6
Zakella86
30.08.16
✎
17:59
|
представь что нет ТЗ. Только сортировка двумерного массив. Как решить эту задачу не используя тз?
|
|||
7
Zakella86
30.08.16
✎
18:02
|
своим алгоритмом я уже определил столбцы которые являются ключами. Но никак не могу вспомнить как их сортировать
|
|||
8
Euguln
30.08.16
✎
18:03
|
(7) Где в задаче написано, что надо отсортировать?
|
|||
9
Zakella86
30.08.16
✎
18:06
|
ну я думаю сначала так , нужно выявить колонки ключи, затем выбрать только уникальные значения в колонках, а затем по ключам плюсовать суммируемые колонки. Если кто то видит другое решение буду рад
|
|||
10
Euguln
30.08.16
✎
18:13
|
Цикл по строкам массива, вложенный цикл по строкам массива, дальше текущей в первом цикле. По индексам колонок определяем подходящие строки, плюсуем к текущей и удаляем.
|
|||
11
orefkov
30.08.16
✎
18:19
|
(10)
Так O(N^2) получится. Лучше сначала отсортировать массив по ключевым столбцам, потом за один проход просуммировать, сравнивая с ключами в предыдущей строке. |
|||
12
Zakella86
30.08.16
✎
18:21
|
можете отписать ваше решение, у меня что то не получается так
|
|||
13
Euguln
30.08.16
✎
18:27
|
(11) Меньше, т.к. строки будут удаляться.
Сортировка массива тоже некоторое количество проходов съест. |
|||
14
orefkov
30.08.16
✎
18:44
|
(13)
Расчет O делается для общего случая, так что будет грубо говоря N сравнений для каждой из N строк. Итого N^2. А хорошие сортировки имеют O=N*log2(N). (12) Тебе стратегию расписали, над деталями сам думай, не барское это дело :) |
|||
15
Zakella86
30.08.16
✎
18:47
|
(14) вчера праздновал деняру, нифига еще не вышло из меня. Туплю вообще
|
|||
16
Йохохо
30.08.16
✎
18:48
|
в таких задачах подразумевается что нельзя использовать доп переменные? доп структура с номером строки выходной таблицы и все
|
|||
17
Zakella86
30.08.16
✎
18:49
|
(16) главное типа не использовать тз.
|
|||
18
Йохохо
30.08.16
✎
18:53
|
(17) ну, фигарь, взял строку, построил ключ строки, поискал, нашел добавил в выходную, не нашел... о маленькое от (N+1), развод
|
|||
19
Zakella86
30.08.16
✎
18:57
|
(18) ок сейчас попробуй. но мозги болит просто жуть, не могу сосредоточится даже на простом алгоритме
|
|||
20
Йохохо
30.08.16
✎
19:06
|
в (18) наврал. без ограничения общности столбцы ключа первые К столбцов - очевидно бинарный поиск, О(Н лог2(Н))
|
|||
21
Garykom
гуру
30.08.16
✎
19:58
|
2N сложность, всего 2 цикла требуется
|
|||
22
Garykom
гуру
30.08.16
✎
20:00
|
(21)+ Хотя наврал "ширина" то таблицы любая а не 2 колонки, и ключ составной еще же.
|
|||
23
Zakella86
30.08.16
✎
22:06
|
блин стратегию понимаю, но в рабочий код пока это не выливается :(
|
|||
24
Torquader
30.08.16
✎
22:49
|
Во-первых, нужно создать уникальный ключ на основании двух столбцов. Далее - перебираем массив - создаём ключ и выполняем операции с ячейками.
|
|||
25
Euguln
30.08.16
✎
23:44
|
МассивКлючей =Новый Массив;
МассивКлючей.Добавить(2); МассивКлючей.Добавить(4); МассивЗначенийКлючей =Новый Массив; ИндесТекущейСтроки = 0; Пока ИндесТекущейСтроки< массив.Количество() Цикл МассивЗначенийКлючей.Очистить(); Для Сч = 1 По МассивКлючей.Количество() Цикл МассивЗначенийКлючей.Добавить(массив[ИндесТекущейСтроки][МассивКлючей[Сч - 1] - 1]); КонецЦикла; ИндекСтрокиПеребора = ИндесТекущейСтроки + 1; Пока ИндекСтрокиПеребора< массив.Количество() Цикл КлючПодходит = Истина; Для Сч = 1 По МассивЗначенийКлючей.Количество() Цикл КлючПодходит = КлючПодходит И (массив[ИндекСтрокиПеребора][МассивКлючей[Сч - 1] - 1] = МассивЗначенийКлючей[Сч - 1]); КонецЦикла; Если КлючПодходит Тогда Для Сч = 0 По 4 Цикл Если МассивКлючей.Найти(Сч + 1) = Неопределено Тогда массив[ИндесТекущейСтроки][Сч] = массив[ИндесТекущейСтроки][Сч] + массив[ИндекСтрокиПеребора][Сч]; КонецЕсли; КонецЦикла; массив.Удалить(ИндекСтрокиПеребора); Иначе ИндекСтрокиПеребора = ИндекСтрокиПеребора + 1; КонецЕсли; КонецЦикла; ИндесТекущейСтроки = ИндесТекущейСтроки + 1; КонецЦикла; |
|||
26
Garykom
гуру
30.08.16
✎
23:52
|
Тут слегка того, размеры исходного массива могут быть любые а не только 6х5
|
|||
27
Garykom
гуру
30.08.16
✎
23:52
|
(26) к (25)
|
|||
28
Euguln
30.08.16
✎
23:54
|
(27) Ну простите, что не все разжевал )))
|
|||
29
Garykom
гуру
30.08.16
✎
23:54
|
(25) Но кода правильная, я бы только получение таблицы для заполнения (ключи без дублей) вынес в отдельный цикл в начале.
Тогда извращаться с удалением строк из массива не придется и можно без "Найти" обойтись будет просто циклами. Это на случай если захотят решение на "базовых алгоритмах" без продвинутых возможностей структур. |
|||
30
Euguln
30.08.16
✎
23:57
|
(29) Зато перебора строк меньше.
|
|||
31
Garykom
гуру
31.08.16
✎
00:02
|
(30) Внутри "Найти" один фиг перебор строк )) Это если индексы самому не реализовывать )))
|
|||
32
Euguln
31.08.16
✎
00:16
|
(31) Ну вместо "Найти" можно ещё один массив завести, с суммирующими колонками.
|
|||
33
Zakella86
31.08.16
✎
09:11
|
(25) благодарю
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |