Имя: Пароль:
1C
 
Очень сложная задачка на сортировку массива списков значений.
0 Матрейя
 
01.07.04
18:04
Есть массив списков значений, представляют собой Таблицу значений. Если сортировать допустим строки по первому столбцу(СписЗн[1]), то как оптимальней синхронизировать записи (значения остальных СЗ чтоб соотвествовали записям отсортированного списка)
1 shura
 
01.07.04
18:24
Я так понял таблица все равно двухмерная?
2 Матрейя
 
01.07.04
18:52
СЗ - это слолбец. Массив СЗ - получается что-то типа ТЗ. Все СЗ естественно одинакового размера.
3 shura
 
01.07.04
18:53
А не проще в ТЗ все хранить?
4 Матрейя
 
01.07.04
18:55
Объекта ТЗ нет вообще, массив СЗ заменяет его. Многие методы ТЗ массивом СЗ описаны. Осталось несколько проблемных, одна из проблем - сортировка.
5 shura
 
01.07.04
18:58
Создать еще один СЗ с содержимым:
1
2
3
4
5
6
... То есть номера записи остальных СЗ.
И в процессе сортировки сортировать его, а потом получать значения из других СЗ по номеру записи. Как такое решение (через жопу правда, но такая и задача в принципе...)
6 shura
 
01.07.04
18:59
Блин, тока щас дошло... Да это-ж аналог индексного файла ;))
7 Матрейя
 
01.07.04
19:03
5. Это слишком медленно.
8 romix
 
02.07.04
00:47
По-моему все просто?
При смене двух соседних элементов массива (непременное действие при сортировке)
менять местами не только их, но и делать то же самое для всех остальных массивов. Например, есть

ЯЯ хх зз
АА 11 22

Сортируя по первой колонке, мы меняем местами не только ЯЯ и АА, но и хх и 11, а также зз и 22, то есть и попарно обмениваем значения для всех остальных колонок.
9 Матрейя
 
02.07.04
00:54
8. Все верно, но сортируя один СЗ, мы должны запомнить соотвествия остальных значений других СЗ сортируемым значениям. Затем путем перебора изменить позиции значений для соотвествия сортированным. Это долго. Медленней, чем штатный метод "Сортировать" ТЗ.
10 romix
 
02.07.04
01:04
(9) А что же мешает синхронно все пары элементов в двух строках менять местами (сравнивая, однако, только два значения в первой колонке)? Я не понял, в чем тут трудность - по-моему все так делают...

Сортировка по двум и более колонкам аналогично, но надо производить не одно, а от 1 до N сравнений, пока не натолкнетесь на различие (одинаковые значения вверху и внизу не считаются). N- число сортируемых колонок.
11 Матрейя
 
02.07.04
01:10
10. Представь: две колонки (Разм(СЗ)=2), каждая колонка - это список значений. Чтобы отсортировать делаю так СЗ[1].Сортировать(). Теперь нужно Сз[2] - значения поставить на новые позиции, которые стали у значений Сз[1]. Можно зашить индекс в представление и по индексу, путем перебора, изменить позиции значений СЗ[2] таким образом, чтобы представления СЗ[1]=представлениям Cз[2]. Но это слишком медленно. Возможно есть более оптимальные варианты. Их и ищу.
12 romix
 
02.07.04
01:22
(11) имхо не надо никаких Сортировать()!!! Сканируйте список и обменивайте местами значения (точнее, строки) попарно. Алгоритмы, в т.ч. quicksort, везде описаны. Сэкономить на этом не удастся - надо его и написать.
13 Матрейя
 
02.07.04
01:27
12. Идея понятна, спасибо, но если будет к примеру 20 столбцов и 50000 строк - то процесс может затянуться на минуты.
14 romix
 
02.07.04
01:44
(13) а это без разницы - скорость сравнения двух строк в зависимости от числа сравниваемых столбцов растет даже не линейно, а в среднем вполовину меньше (вроде бы так). А вот зависимость от числа строк более ощутима, но для алгоритма quicksort зависимость наиболее "пологая" (но он жрет много памяти в стеке).
15 Матрейя
 
02.07.04
01:45
14. Спасибо за идею. На досуге поюзаю.
16 ws_mason
 
02.07.04
06:15
2Матрейя
Я так понимаю это для реализации ТЗ в 2С.
Только почему СЗ у тебя это колонка, не проще было бы его строкой сделать.
У тебя:
ССССС
ЗЗЗЗЗ
Предлагаю:
СЗ
СЗ
СЗ
Тогда и сортировка построчная проще и быстрее.
17 laeg
 
02.07.04
09:08
(Матрейя)
ИМХО:
Я уже об этом думал тоже, но скажу одно. ТЗ нужно реализовывать на 0 уровне ... иначе по скорости обработке она будет уступать стандартной 1с ...
18 Eugene G
 
02.07.04
10:21
Полностью согласен с (17), если писать на уровне 2 будет тормознуто.
19 427
 
02.07.04
11:23
и ваще собачка чего то конкретно тупит....
20 ws_mason
 
02.07.04
13:45
(17, 18)
А как быть с объектами, которые создаются на 1 и 2 уровнях.
Как их в ТЗ записывать, ведь 0 уровень ничего не знает о 1 и 2.
21 laeg
 
02.07.04
14:44
(20)
По принципу СпискаЗначений, ведь он как то сделан и работает ...
22 Salimbek
 
02.07.04
15:43
(20) А зачем объекту уровня 0 знать что-то об остальных уровнях? Он предоставляет свои свойства и методы, объекты других уровней ими пользуются.
23 NS
 
03.07.04
00:17
romix
Я просто...
Такое впечатление, что просто детсадовец...
Сложность алгоритма Эн Логарифмов Эн... и всё!!!
На сомом деле - быстрее будет создать ТЗ из двух колонок... Номерстрок, и представление, отсортировать - и грузануть обратно в массив...
Рекурсия легко заменяется стеком - рекурсия в 1С очень медленная...
24 romix
 
03.07.04
00:53
(23) Речь идет о платформе 2С от vtools.ru.

Непонятно, почему ТЗ не включат в уровень ядра 2С; видимо, со временем в порядке оптимизации это сделают.

Еще быстрее алгоритмы сортировки не "на месте", а в другой массив. Ваш алгоритм с двумя колонками я не понял. Возможно, он слишком сложен.
25 romix
 
03.07.04
00:57
(+24) .. или не работоспособен. "Грузануть обратно в массив" - а как быть с остальными колонками??

Рекурсия как вы думаете за счет чего сделана? Она и сделана при помощи стека.
26 NS
 
03.07.04
01:42
(25) А чего здесь понимать? Алгоритм совсем прозрачен...
И для этого даже необязательно ездить га сборы на союз....
Любая сортировка приводится к сортировке по двум столбцам - один ссылка, другой - сортируемое значение....
27 NS
 
03.07.04
01:45
(25) Насчет рекурсии - сделайте пожалуйста факторпиал при помощ рекурсии и без - и сравните результаты...
Либо алгоритм закраски - рекурсивный и на стеке... а если не можете - Х_У_Л_И П_И_З_Д_Е_Т_Ь???
А если можете - результаты замсера в студии...
Я приводил пример рюкзака -  80% времени рекурсивный вызов...
на стеке - в 4-5 раз быстрее.
28 romix
 
03.07.04
02:06
(27) Я не прав, что рекурсия сама сделана на стеке? Извините, но она СДЕЛАНА на стеке, откройте любой учебник.

То, что она медленнее (особенно в интерпретаторах) - очень даже может быть.
То, что нужно использовать не ее, а другой алгоритм (чем плох со вторым массивом?) - очень может быть.

Не забывайте, что речь идет о системе 2С, и код там всегда могут "втупую" перенести в компилятор, где ограничения рекурсии не так существенны по сравнению с интерпретатором. Грубо говоря, один рекурсивный вызов означает добавочные команды  add sp, ноль и более команд push под параметры и лишний call/ret (в современных процах все по 1 такту и менее). В интерпретаторах же это означает очень медленный вызов malloc() на каждую итерацию рекурсии.
29 romix
 
03.07.04
02:18
(+28) со вторым массивом = я хотел сказать, двумя таблицами, из одной копировать отсортированные строки в другую. Да как угодно можно. Рекурсия проще понимается - хотя расписать ее как итерационный алгоритм (для оптимизации) тоже можно. Или извернуться с дополнительной памятью - чем больше - тем быстрее работает. Идеальный случай сортировки описал Крис Касперски, когда нужно 0 сравнений (но очень много памяти).
30 NS
 
03.07.04
03:08
Извиняюсь за грубость - нервы не в порядке...
Насчет того, что рекурсия сделана на стеке - ежу понятно - я имел в виду - очень большие тормоза при работе с ней в 1С - то есть - имеет смысл её использовать только если в теле рек. процедуры - трудоемкие вычисления.
Насчет 2С - Делается двва паралельных массива - и сортируются паралельно - да и всех делов...
Как я сказал на Кубани - куча методов - Слияния отрезков, Квик-сорт, Корпоративная (по бинарному дереву) - всё дается в интститутах. и всё за эн логарифмов.
31 Матрейя
 
03.07.04
12:49
30. Всего делов то приводят тому, что скорость сортировки самописной ТЗ больше скорости сортировки ТЗ 1с. И это несмотря на быстрый интерпретатор 2с. Речь идет не о том, что я не знаю как, а о том, что у меня не получается быстрее.
Romix: пришла идея ТЗ сделать на основе временной таблицы SQL. ИМХО, это самый лучший (быстродействие, большие возможности по дополнительным нестандартным методам) вариант (кроме конечно объекта уровня 0).
32 romix
 
04.07.04
02:14
(31) Ну да, есть в MySQL такие таблицы - которые только в памяти...
Чем не ТЗ? :-) Еще и селектить из нее можно быстро... А что, 2С разве позволяет в уровне 1 юзать все возможности MySQL?
33 romix
 
04.07.04
02:18
(+32) А свертку (следующий шаг) там делать как? :-)
А, хотя наверное можно фетчить отсортированный запрос в массив, переходя на новую строку только при несовпадении измерений свертки...
34 Матрейя
 
04.07.04
03:29
32. Насчет всех возможностей не знаю, но разницы не заметил: можно  записывать, обновлять данные, работать с формой одинаково что в конфигураторе на уровне объектов 1 уровня, что в Предприятии2С.
33. Select and Group by and Into NewTempTable
35 romix
 
05.07.04
02:24
Я похоже тормознул - а ведь работа с ТЗ в этом случае будет по сети?
А связь по сети не всегда имеет широкий канал...
Идеология SQL-как можно меньше юзать сеть...
36 ws_mason
 
05.07.04
06:04
(31) Мне тут на выходных пришли две мысли:
- использовать вторую ТЗ (СЗ) как индекс, причем ТЗ предпочтительнее (индекс сложный можно создать), индекс понадобится при обходе (выборке) отсортированной ТЗ;
- использовать в качестве ТЗ временную таблицу на SQL сервере.

Более подходящий - первый вариант, мне кажется нерациональным привязывать такой универсальный объект как ТЗ к конкретному SQL серверу. Да и сеть будет нагружаться, ведь в 1С такие объекты как ТЗ и СЗ находятся на локальной машине.
37 Матрейя
 
11.07.04
15:17
36. В случае временной таблицы SQL - ТЗ будет обрабатываться на сервере. На клиентскую машину - только окончательный результат запроса.
38 ws_mason
 
12.07.04
11:24
(37) Ага, после сортировки результат - ВСЯ таблица. Хотя...

Все ж думаю им (vtools) надо ТЗ в 0-уровень запихнуть или тем, кто пишет на 1 уровне использовать временную таблицу на сервере.
39 Матрейя
 
12.07.04
13:25
38. ТЗ на первом уровне на базе временной таблицы MSSQL - нормально реализуется.  SQLLite - что-то я не победил :(.  В MSSQL - временные таблицы хранятся в базе tempdb, отдельные экземляры для каждого процесса... SQLLite - создание успешно, но потом этой временной таблицы как бы нет. :(
40 ws_mason
 
12.07.04
13:34
(39) Я, к сожалению, только в MS SQL работаю
41 NS
 
14.07.04
05:15
(31) Приведи замеры... Разница не такая уж и большая...
Все дело в том, что самая трудоемкая операция - добавление/изменение значения в ТЗ... В этот момент строится индекс. А сортировка по индексу - уже эн... только добавление - логарифм, а нужно добавить эн элементов.
Приведи пример с замером скорости.
42 Матрейя
 
14.07.04
13:53
41. Добавление числовых значений по 3 столбцам и 50000 строкам:
1. ТЗ 1с - 4,5сек
2. ТЗ на массивах 2с - 18сек
3. Тз на списках значений 2с - 3сек.