Имя: Пароль:
IT
 
подскажите пониманию задачки
,
0 DES
 
08.03.19
16:59
"Дан массив из n чисел.
Нужно разбить массив на макимальное количество непрерывных подмассивов так, чтобы
после сортировки элементов внутри каждого подмассива весь массив стал отсортированным."


Разве можно сортирнуть массив, например, разбив массив на два куска, отсортировать каждый кусок и получить весь массив отсортированным?
Или я не понимаю задачу?
1 exwill
 
08.03.19
17:02
(0) Отсортированным в любую сторону?
2 DES
 
08.03.19
17:04
ничего не сказано, но это разве меняет суть дела?
3 DES
 
08.03.19
17:04
все равно эти подмассивы нужно потом сливать, а не соединять!
4 exwill
 
08.03.19
17:06
(0) Если нельзя, тогда ответ - максимальное количество частей = 1.
5 ДенисЧ
 
08.03.19
17:08
6 ДенисЧ
 
08.03.19
17:08
7 exwill
 
08.03.19
17:09
Например, массив

2 1 4 3 можно "разбить" на две части

1 2 4 3 можно "разбить" на три части

1 2 3 4 можно "разбить" на четыре части

2 3 4 1 нельзя разбить
8 DES
 
08.03.19
17:10
(5)(6) не понял, ссылки, они к чему, про точ есть разные виды сортировок еще Кнут писал.
9 DES
 
08.03.19
17:12
(7) идет речь о сортировке ВНУТРИ подмассива
10 Garykom
 
гуру
08.03.19
17:14
(7) >2 3 4 1 нельзя разбить
на одну часть разбивается


>1 2 3 4 можно "разбить" на четыре части
можно и не разбивать оно уже но да макс =4
11 ДенисЧ
 
08.03.19
17:14
(9) Сведи размер массива к 1 и сортируй. Потом слияй.
12 Garykom
 
гуру
08.03.19
17:19
(0) Задача сводится к нахождению последовательностей на своих местах в пределах перестановок.

Попробуй для начала в лоб полным перебором решить.
Для массива из 4-х элементов есть варианты
4
1 3
2 2
3 1
1 2 1
13 DES
 
08.03.19
17:26
(12) слова понятные, смысл не очень.
какой например массив из 4 элементов?
Конкретно вот этот 2 3 4 1
что тут нужно?
14 Garykom
 
гуру
08.03.19
17:27
Т.е. по очереди проверяем соседние элементы по 1, 2, 3 и т.д. будут ли они на своих местах после сортировки.

Сначала делаем копию исходного массива и сортируем его как надо.

Затем берем исходный массив и проверяем по 1 элементу, совпадают ли они на своих местах с правильным.
Если совпадают какие то - это подмассивы из 1 элемента и можно уже делить.

Если не совпадают то берем по 2 элемента и так же после сортировки проверяем на совпадение с правильным. Если совпали то это подмассивы из 2 элементов.

Ну и т.д. для 3, 4 и т.д. до длины массива.

По сути находится список всех возможных подмассивов, далее их надо сопоставить так чтобы собрался правильный целый массив.
Вариантов может быть несколько и надо среди правильных собранных выбрать с максимальным числом подмассивов.
15 Garykom
 
гуру
08.03.19
17:29
(13) 2 3 4 1

По 1 элементу нет готовых подмассивов, проверям по 2 элемента
(2 3) являются таким подмассивом
Еще дойдя до 4 элементов получаем (2 3 4 1)

Итого из возможных подмассивов (2 3) и (2 3 4 1) пытаемся составить полный
Вариант только (2 3 4 1) - итого всего на 1 можно разделить
16 Garykom
 
гуру
08.03.19
17:30
(15) Тьфу (2 3) не являются ошибся только вариант (2 3 4 1) будет сразу
17 Garykom
 
гуру
08.03.19
17:32
Например для 2 1 4 3

из 1 нет, из 2 есть (2 1) и (4 3)
Из 3 нет, из 4 есть (2 1 4 3)

(2 1) собирается с (4 3) и еще есть готовый (2 1 4 5)
(2 1)+(4 3) больше подмассивов чем всего 1
18 Garykom
 
гуру
08.03.19
17:33
1 4 2 3

Из 1 есть (1)
Из 2 нет
Из 3 есть (4 2 3)
Из 4 есть (1 4 2 3)

(1)+(4 2 3) лучше чем (1 4 2 3)
19 Garykom
 
гуру
08.03.19
17:37
1 3 2 4
Из 1 есть (1) и (4)
Из 2 есть (3 2)
Из 3 есть (1 3 2) и (3 2 4)
Из 4 есть (1 3 2 4)

Собираем, варианты
(1)+(3 2)+(4)
(1)+(3 2 4)
(1 3 2)+(3 2 4) не складываются как и (3 2)+(1 3 2) или как (3 2)+(3 2 4)

так понятно?
20 Garykom
 
гуру
08.03.19
17:38
(17) *и еще есть готовый (2 1 4 3)
21 Garykom
 
гуру
08.03.19
17:42
(0) Кстати

Откуда такую задачку взял интересную? В яндекс устраиваешься на работу?
22 Garykom
 
гуру
08.03.19
17:44
Тут главная загвоздка как кодировать подмассив чтобы сохранять варианты.

Можно двумя числами (ДлинаПодмассива, НачалоПодмассива).
Но можно это в одно число засунуть, зная что ДлинаПодмассива<=ДлиныМассива и НачалоПодмассива<ДлиныМассива
23 Garykom
 
гуру
08.03.19
17:47
(22)+ В одно число чтобы линейный массив использовать для хранения вариантов подмассивов, вместо двухмерного
На больших исходных массивах число вариантов может быть огромным
24 Garykom
 
гуру
08.03.19
17:48
Или для хранения можно использовать списки (ТЗ в 1С), что проще
25 kyvv
 
08.03.19
18:10
"Красивая дочка, умница." И зачем папаша ее мучает?
26 RomanYS
 
08.03.19
18:58
Классная задачка. Кажется, знаю решение. Если вечером доберусь до компа, напишу
27 Garykom
 
гуру
08.03.19
19:12
(26) Да решение в лоб не сложное и выше привел.
Но вот придумать оптимальное решение когда в массиве тысячи элементов (или более) это уже сложнее, надо заранее неправильные варианты отсекать.

Кста чтобы правильно решить (как задумал автор задачки) надо знать какую тему(ы) проходили перед этим.
Может там теория графов была с методом ветвей и границ.
Или банальная рекурсия.
28 RomanYS
 
08.03.19
19:28
(27) твоё не смотрел). Мое работает на любых объемах, в один проход (O(N)) при наличии отсортированной копии массива
29 Garykom
 
гуру
08.03.19
20:16
(28) Лучше скажи как это запросом сделать...
30 RomanYS
 
08.03.19
20:27
(29) можно и запросом
31 Garykom
 
гуру
08.03.19
20:35
(30) Угу рекурсивным
32 RomanYS
 
08.03.19
20:45
(31) я таких не знаю))
33 RomanYS
 
08.03.19
20:56
Ну что, идею(простую) или запрос (возможно будет непонятно :))?
34 Garykom
 
гуру
08.03.19
21:07
Запросом как, кодом то все понятно
35 Garykom
 
гуру
08.03.19
21:09
Любой запрос можно перевести в код (это доказывает то что движки написаны кодом).

Вот обратное не всегда. Ибо язык запросов не полный по Тьюрингу.
36 RomanYS
 
08.03.19
21:11
(35) "Любой запрос можно перевести в код" - для этого надо будет понять))
(34) ОК 15 минут
37 Garykom
 
гуру
08.03.19
21:21
(36) Уже 10 минут прошло, осталось 5 минут ))
38 RomanYS
 
08.03.19
21:26
(37) Ок причесывать не буду
39 RomanYS
 
08.03.19
21:27
Количество записей в результате - ответ (сортировка только в одну сторону)
ВЫБРАТЬ
    1 КАК Номер,
    44 КАК Значение
ПОМЕСТИТЬ ВТ

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    2,
    202
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ.Номер КАК Номер,
    СУММА(ВТ1.Значение) КАК НИ
ПОМЕСТИТЬ ВТ_НИ
ИЗ
    ВТ КАК ВТ
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ КАК ВТ1
        ПО ВТ.Номер >= ВТ1.Номер

СГРУППИРОВАТЬ ПО
    ВТ.Номер
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ.Номер КАК НомерИсх,
    СУММА(ВТ1.Значение) КАК НИ,
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВТ1.Номер) КАК Номер
ПОМЕСТИТЬ ВТ_Сорт_НИ
ИЗ
    ВТ КАК ВТ
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ КАК ВТ1
        ПО (ВТ.Значение > ВТ1.Значение
                ИЛИ ВТ.Значение = ВТ1.Значение
                    И ВТ.Номер >= ВТ1.Номер)

СГРУППИРОВАТЬ ПО
    ВТ.Номер
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    *
ИЗ
    ВТ_НИ КАК ВТ_НИ
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Сорт_НИ КАК ВТ_Сорт_НИ
        ПО ВТ_НИ.Номер = ВТ_Сорт_НИ.Номер
            И ВТ_НИ.НИ = ВТ_Сорт_НИ.НИ
40 RomanYS
 
08.03.19
21:29
(37) Сколько времени тебе понадобится чтобы угадать идею))?
41 Garykom
 
гуру
08.03.19
21:47
Нутром чую что кол-во подмассивов зависит от дельности смещения всех элементов не на своем месте.

Но вот доказать не могу.
42 Garykom
 
гуру
08.03.19
21:47
*дальности
43 RomanYS
 
08.03.19
21:49
Засунул в исходную ВТ курс ЦБ бакса с начала 2018
ВЫБРАТЬ
    РАЗНОСТЬДАТ(&Дата, КурсыВалют.Период, ДЕНЬ) Номер,
    КурсыВалют.Курс Значение
ПОМЕСТИТЬ ВТ
ИЗ
    РегистрСведений.КурсыВалют КАК КурсыВалют
ГДЕ
    КурсыВалют.Валюта = &Валюта
    И КурсыВалют.Период > &Дата

Получил 4 отрезка. 433 значения - работает мгновенно
44 RomanYS
 
08.03.19
21:55
(41) Запрос(39) в код то переведёшь? Идею там углядеть можно
45 Garykom
 
гуру
08.03.19
21:59
(44) Оно от "в один проход (O(N))" сильно далеко
46 RomanYS
 
08.03.19
22:00
(45) Это не про запрос было
47 RomanYS
 
08.03.19
22:05
*(43) может мы новый вид техананиза изобрели)))
01.01.2018-09.04.2018    55,6717-58,1718
10.04.2018               58,5714
11.04.2018-09.08.2018    60,8583-64,0683
10.08.2018-09.03.2019    65,2221-69,9744

Реально переломы какие-то нашлись
48 Garykom
 
гуру
08.03.19
22:10
(44) На не числовых данных работать не будет же?
49 Garykom
 
гуру
08.03.19
22:10
(48)+ Хотя пофиг строка это в принципе число
50 RomanYS
 
08.03.19
22:11
(48) нет, без напильника не будет
51 Garykom
 
гуру
08.03.19
22:14
А если значения одинаковые?
52 Garykom
 
гуру
08.03.19
22:16
(51)+ Причем есть 2, 2 и еще и 4
53 RomanYS
 
08.03.19
22:16
(51) будет, из-за этого соединение тяжелое получилось
ПО (ВТ.Значение > ВТ1.Значение
                ИЛИ ВТ.Значение = ВТ1.Значение
                    И ВТ.Номер >= ВТ1.Номер)

для уникальных можно было бы проще
ПО ВТ.Значение >= ВТ1.Значение
54 Ёпрст
 
08.03.19
22:16
(39) 2314 возвращает 2, что не верно
55 Garykom
 
гуру
08.03.19
22:16
(54) Верно
(231) и (4)
56 DES
 
08.03.19
22:17
Всем спасибо. Вроде бы прояснилось.
57 RomanYS
 
08.03.19
22:17
(54) верно
58 Ёпрст
 
08.03.19
22:17
должно быть 0
59 Garykom
 
гуру
08.03.19
22:17
Что вернет 2 4 1 2 ?
60 RomanYS
 
08.03.19
22:17
(58) меньше 1 не может быть)
61 RomanYS
 
08.03.19
22:18
(59) у меня уже курсы))
62 Ёпрст
 
08.03.19
22:18
(57) а ну да..
63 RomanYS
 
08.03.19
22:20
(59) косяк какой-то. Пусто. Похоже что-то в (53) недоделал)
64 Garykom
 
гуру
08.03.19
22:23
(47) По сути это аппроксимация, так что все правильно сказал про переломы
65 Garykom
 
гуру
08.03.19
22:26
(64)+ Но работает только для возрастающих или убывающих функций (с локальными колебаниями) на всем промежутке анализа
66 RomanYS
 
08.03.19
22:40
*(63) Не, всё работает (когда с курсами игрался к первому значению "где ложь" поставил, блиииин)
(59) Возвращает 1
67 Garykom
 
гуру
08.03.19
22:48
(66) Надо проверять на разных наборах тестовых, алгоритмы на основе различия/совпадений сумм значений не очень надежны.
68 RomanYS
 
08.03.19
22:51
(65) Нашлись как оказалось даты объявления санкций +/-
(67) Алгоритм примитивен, в (39) ошибок нет.

Вообще "алгоритмы ... не очень надежны" значит, что алгоритм неправильный.
69 Garykom
 
гуру
08.03.19
22:52
Чем то напоминает задачку про "поменять значения двух числовых переменных не пользуясь дополнительными переменными".
a=2
b=5

сделать чтобы
a=5
b=2

b=b+a
a=b-a
b=b-a
70 RomanYS
 
08.03.19
22:54
(56) Источник озвучь, если не секрет конечно
71 Garykom
 
гуру
08.03.19
22:54
(68) Не очень надежны, это значит есть строгие ограничения на условие задачи.
Ну и вытекает что очень сложно модифицировать алгоритм для обхода этих ограничений.
72 RomanYS
 
08.03.19
23:01
(71) условия из (0) решены в (39).
Точнее решены наполовину: нужна ещё обратная сортировка и выбор большего из двух вариантов прямой/обратный.
Без запроса решается в один синхронный проход трёх массивов: исходного, возрастающего и убывающего. Подготовка служебных массивов естественно за пределами оценки O(N).
73 RomanYS
 
08.03.19
23:02
(71) Идею-то так и не поднял?
74 Garykom
 
гуру
08.03.19
23:17
Коммутативность сложения
75 VladZ
 
08.03.19
23:46
(0) Кому нужны эти сортировки? Все алгоритмы сортировки уже давно придуманы. И в реальных задачах нужно будет другими вещами.
76 Garykom
 
гуру
08.03.19
23:52
(75) Вы не правы очень сильно, потому что когда будет "Все алгоритмы ... уже давно придуманы" то будет технический регресс или как минимум стагнация.

Например сейчас очень быстро развиваются параллельные алгоритмы, распределенные вычисления и различные ML.
Там еще много-много придумывать...
77 Garykom
 
гуру
08.03.19
23:54
(75)+ Я к тому что эта задача из разряда как раз параллельные алгоритмы и/или распределенные вычисления

Сначала быстро делим исходный массив на кусочки которые надо будет отсортировать.
А затем сортируем их по отдельности на разных ядрах или компах.
78 RomanYS
 
08.03.19
23:54
(74) похоже на правду), точно используется
79 Garykom
 
гуру
08.03.19
23:59
Кста интересно можно ли поделить не имея/готовя отсортированный массив?
80 Garykom
 
гуру
08.03.19
23:59
(79) к (72)
81 Garykom
 
гуру
09.03.19
00:05
(79) Гм можно
82 RomanYS
 
09.03.19
00:21
(81) возможно, наверное. Только сложность может больше получиться
83 Garykom
 
гуру
09.03.19
00:24
(82) Ага наверно

Суть создаем множество объектов (списков, множеств) каждый из которых характеризуется минимальным и максимальным значением, содержащихся внутри значений.
И постепенно заполняем их при одном проходе по исходному и этому списку объектов, помещая внутрь если новое значение >мин но <макс.

Если значение >макс то или <мин то создается новый объект
84 Garykom
 
гуру
09.03.19
00:26
(82) Да сложность чуть меньше чем O(n^2)
85 Garykom
 
гуру
09.03.19
00:30
2 3 1 4

2
23
23 12
23 12 4

Совмещаем по мин и макс эти объекты
123 4

Итого два подмассива
86 Krendel
 
09.03.19
00:32
1 кусок
87 Garykom
 
гуру
09.03.19
00:32
(85)+ Но потеряли исходную информацию где были изначально значения
88 Garykom
 
гуру
09.03.19
00:33
(86) Если ты про (85) то 4 стоит на своем месте и образует отдельный подмассив
89 RomanYS
 
09.03.19
00:40
(84) можно вроде в O(n) без сортировки, прохода 3 должно хватить (если только возрастание рассматриваем)
90 Garykom
 
гуру
09.03.19
00:47
(85)+ распишу
2 3 1 5 4

1.Берем первые два элемента =2 и =3
(мин 2, макс 3)

2.Берем 3-й элемент =1
1<2 и 1<3 внутрь не попадет, значит образует новую группу, причем второй парой берем ближайший из мин или макс других объектов-групп это 2
Было 2-3 и добавили 1-2

3.Берем 4-й =5
5>3 и 5>2 ближайшее 3 значит новая группа
Было 2-3 и 1-2 добавили 3-5

4.Берем 5-й =4
он попадает в 3-5, добавляем туда
Было 2-3 и 1-2 и стало 3-4-5

5.Совмещаем по совпадающим мин=макс (только один раз уже совмещенные группы не совмещаем далее)
1-2 с 2-3 = 1-2-3
2-3 с 3-4-5 = 2-3-4-5

6.Получили две группы 1-2-3 и 2-3-4-5 значит два подмассива, причем группы кривые
И правильные подмассивы (2 3 1) и (5 4) не отражают, инфа потеряна

Короче вроде бы работает но я хз.
Кто может найти ошибку у меня?
91 RomanYS
 
09.03.19
00:51
Слишком сложно (90) , завтра с компа (89) напишу, если тема жива будет
92 Garykom
 
гуру
09.03.19
00:55
(89) (91) Может количество проходов будет 1+КолвоЭлементов-КолвоПодмассивов ?
93 RomanYS
 
09.03.19
01:00
(92) нет, проходов 2-4. Подмассивов не надо. 2(или 4 если в обе стороны) служебных массива
94 Garykom
 
гуру
09.03.19
01:49
(93) Проблемы с проходами по служебным массивам в цикле по основному, я не понимаю как этого избежать
95 Лодырь
 
09.03.19
04:55
А совпадающие значения могут быть?
96 RomanYS
 
09.03.19
10:19
(95) в общем случае могут. Но вроде вопрос не принципиальный, если только не пытаться решить запросом)
97 RomanYS
 
09.03.19
14:29
ТС, ответь на (70), пожалуйста
98 DES
 
11.03.19
10:21
Оцените, что получилось.

Пусть p - счетчик подмассивов,
изначально р=1.

Скопируем данный массив $a[n]$ в новый - $b[n]$,
отсортируем его - $O(nlogn)$,
создадим вспомогательный массив $count[n]$,
заполним его значением "0".

будем идти по исходному массиву и если
1. a[j]=i, => count[i] = 1,
после переходим к $b[j]$, если
2. b[j]=k, => a[k] = -1,
далее рассматриваем a[j+1] и т.д. - сложность O(n)

Если в какой-то момент времени, после действия 2. сумма всех значений массива count=0, то данный отрезок можно отнести в подмассив, тогда увеличим счетчик подмассивов - p++
99 RomanYS
 
11.03.19
10:34
(98) ничего не понятно. p, i, j, k?
Откуда задача?
100 RomanYS
 
11.03.19
11:50
Есть простое решение. Без сортировок. Два линейных цикла не вложенных. И никаких массивов подмассивов.
101 Garykom
 
гуру
11.03.19
14:07
(100) Давай уже решение, не обязательно код хотя бы алгоритм
102 Garykom
 
гуру
11.03.19
14:08
(98) Сортировка массива какая сложность?
103 RomanYS
 
11.03.19
14:11
(101) Код будет, но всё-таки хочется узнать источник)
104 K1RSAN
 
11.03.19
14:21
В общем алгоритм:
Находим такое значение, что в первом подмассиве все значения будут меньше его, а во втором - больше. Если такое значение больше максимального в массиве или меньше минимального - значит данный подмассив разбить нельзя.
В каждом полученном подмассиве пытаемся сделать то же самое.
В итоге получится, что на определенном этапе итерации закончатся и мы получим общее количество таких подмассивов.
105 Вафель
 
11.03.19
14:24
как я понял ключевое слово НЕПРЕРЫВНЫХ,
те для 2 3 4 1 - это 1 подмассив
ля 8 2 6 3 7 - это 2 3 и 6 7 8
106 K1RSAN
 
11.03.19
14:27
(104)+ Все упирается именно в процесс поиска нужного числа. Как вариант - в качестве первой попытки выбираем среднее по подмассиву. Потом сравниваем значения с ним. Если до определенного элемента в массиве все числа меньше его, а в другой - больше - тогда можно делить. Если то меньше, то больше - то идем в сторону сопротивления. Например 6 чисел из 10 меньше, а потом идет то больше, то меньше. Значит увеличиваем число и снова проверяем. И так далее, пока не упремся до конца массива или не получится найти состояние "дзен", когда условие выполняется. Если условие достигнуто - начинаем попытку деления в каждом полученном подмассиве. Если не получается - итерация закончена.
107 Garykom
 
гуру
11.03.19
14:39
(104) >Находим такое значение, что в первом подмассиве все значения будут меньше его, а во втором - больше
108 Asirius
 
11.03.19
14:40
Решение:
1) Нормализауем массив сортировкой. Получаем массив-перестановку, в котором заданы числа от 1 до n
2) В перестановке находим все циклы. Например на 1 месте стоит 3, на 3 месте стоит 7, на 7 месте стоит 1.
Цикл 1->3->7->1 замкнулся.
3) Выделяем границы цикла. Для цикла 1->3->7->1 - границы 1 и 7
4) Объединяем циклы, границы которых пересекаются. Это и есть искомые подмассивы
109 Garykom
 
гуру
11.03.19
14:40
(107)+ Ай молодца только ты алгоритм то нахождения скажи без двойного цикла?
110 Garykom
 
гуру
11.03.19
14:41
(108) С предварительной сортировкой уже давно решили, без нее как?
111 Asirius
 
11.03.19
14:42
(110) Что значит, без предварительной сортировки? Быстрее чем 0(N * log N) ? Боюсь, невозможно
112 Garykom
 
гуру
11.03.19
14:44
(111) см мои посты (83)(85)(90)
113 Garykom
 
гуру
11.03.19
14:44
(112)+ Я только доказать не могу что алгоритм рабочий и не выдаст ошибки
114 RomanYS
 
11.03.19
14:46
(111) O(N) возможно.
Прикольная задачка, школьники после прохождения циклов с большИм чем мисятяне успехом её бы решали.
115 K1RSAN
 
11.03.19
14:48
(109) Смотри (106)
Там вроде вполне понятный поиск
116 Garykom
 
гуру
11.03.19
14:51
(115) Что такое "среднее по подмассиву"? Как его нашли? Сколько на нахождение затратили?

Что если среднее не совпало не с одним из имеющихся в массиве значений?

2 1 5 4, ну нету 3 нету
117 K1RSAN
 
11.03.19
14:54
(116) И что? Проверяем на нем. Если не подходит - то увеличиваем его в случае если справа идет "то больше то меньше", или уменьшаем, если слева. Конечно, данное решение имеет определенные недостатки и ограничения, но в простых случаях должно сработать
118 K1RSAN
 
11.03.19
14:55
(117)+ Среднее находим как среднее арифметическое. Надеюсь, как его найти в числовом массиве - понятно
119 Вафель
 
11.03.19
14:58
(117) сколько раз увеличиваем?
120 K1RSAN
 
11.03.19
15:04
(119) Пока не окажется, что все числа в подмассиве больше или все числа в подмассиве меньше этого числа.
121 K1RSAN
 
11.03.19
15:04
То есть цикл типа Do While
122 RomanYS
 
11.03.19
16:03
(114) первый цикл для затравки

//А - входящий массив

    Колво = А.Количество();
    МинНач = Новый Массив(Колво);
    МинКон = Новый Массив(Колво);
    МаксНач = Новый Массив(Колво);
    МаксКон = Новый Массив(Колво);
    
    МинНач[0] = А[0];
    МаксНач[0] = А[0];
    МинКон[Колво - 1] = А[Колво - 1];
    МаксКон[Колво - 1] = А[Колво - 1];
    
    Для инд = 1 По Колво - 1 Цикл
        МинНач[инд] = Мин(А[инд], МинНач[инд-1]);
        МаксНач[инд] = Макс(А[инд], МаксНач[инд-1]);
        МинКон[Колво - 1 - инд] = Мин(А[Колво - 1 - инд], МинКон[Колво - инд]);
        МаксКон[Колво - 1 - инд] = Макс(А[Колво - 1 - инд], МаксКон[Колво - инд]);
    КонецЦикла;
123 RomanYS
 
11.03.19
16:38
второй цикл

    КолПодмассивовУбыв = 1;
    КолПодмассивовВозр = 1;
    Для инд = 0 По Колво - 2 Цикл
        КолПодмассивовВозр = КолПодмассивовВозр + ?(МаксНач[инд] <= МинКон[инд+1], 1, 0);
        Если МаксНач[инд] <= МинКон[инд+1] Тогда
            Сообщить(""+инд +"    "+  МаксНач[инд] +"    "+ МинКон[инд+1]);
        КонецЕсли;
        
        КолПодмассивовУбыв = КолПодмассивовУбыв + ?(МинНач[инд] >= МаксКон[инд+1], 1, 0);
    КонецЦикла;
    
    Результат = Макс(КолПодмассивовВозр, КолПодмассивовУбыв);
124 Asirius
 
11.03.19
23:17
(123)
Помоему, липа.
Что получается на последовательности 3,2,7,1,6,5,4
Разбить такую последовательность на подмассивы нельзя из-за 3->7->4->1->3, а второй цикл из (123) на первом проходе уже больше дает
125 RomanYS
 
11.03.19
23:21
(124) У меня вернул 1.
Что значит "на первом проходе"?
126 Asirius
 
11.03.19
23:24
при инд=1.
КолПодмассивовВозр = КолПодмассивовВозр + ?(МаксНач[1] <= МинКон[1+1], 1, 0);

МинКон[2]= 4
МаксНач[1] =3
Те КолПодмассивовВозр = КолПодмассивовВозр+1
127 Asirius
 
11.03.19
23:25
т.е. инд =0
128 RomanYS
 
11.03.19
23:28
(126) МинКон[2] = 1;//минимальное значение от А[2] до конца массива
129 RomanYS
 
11.03.19
23:30
МаксНач
Индекс    Значение элемента
0    3
1    3
2    7
3    7
4    7
5    7
6    7

МинКон
Индекс    Значение элемента
0    1
1    1
2    1
3    1
4    4
5    4
6    4
130 Asirius
 
11.03.19
23:33
(129) Точно, не заметил, что массив перевернут
131 RomanYS
 
11.03.19
23:36
(130) Это из-за экономии на циклах)), хотелось в два уложиться
132 Asirius
 
12.03.19
00:30
(131) Наконец то я понял, что делает алгорим из (123), переведу на русский.
Первым проходом подготовливаются максимумы-минимумы, суть которых будет ясна ниже.
Вторым проходом пытаемся разрезать последовательность на две.
Для того, чтобы последовательность разрезалась удачно, все числа из первой части, должны быть меньше, чем все числа из второй части. Вместо сравнения всех чисел, сравниваются заранее подготовленные максимумы-минимумы из первого прохода.
133 RomanYS
 
12.03.19
15:41
(132) Спасибо за перевод.
Мне казалось, что даже первого цикла должно хватать для понимания идеи. Надо было комменты к служебным массивам сделать.
134 Garykom
 
гуру
12.03.19
16:13
(133) Можешь это оформить в виде готовой функции?
Желательно чтобы оно и границы подмассивов выдавало сразу.

Ну и следующий шаг а можно ли и этот алгоритм распараллелить так чтобы получилось готовое для очень быстрой параллельной сортировки на множестве ядер.

Т.е. вот эта подготовка пары служебных массивов ее можно на кусочки поделить, делать больше массивов а потом их состыковать?
135 RomanYS
 
12.03.19
16:32
(134) Склей два поста, получишь готовую функцию. A - входящий параметр, Результат на выходе. Можно оптимизировать в два раза, проверять только на убывание или возрастание.

Для каких целей ты его параллелить собрался - не понял. 1С тебе миллионный массив обработает за секунду (если сообщить убрать), что-то си-подобное - миллиарды в секунду.

Задачка абсолютно учебная и базовая, оптимизировать здесь нечего.
136 Garykom
 
гуру
12.03.19
16:39
(135) Когда числа простые да, но бывает надо сортировать нечто чуть посложнее чем просто числа.

А насчет сортировки миллиардов в секунду это ты загнул конечно ))

Уже миллионы весьма сильно тормозит на одном ядре. Хотя у нас тут сотни и тысячи простых ядер в GPU простаивают.
137 Garykom
 
гуру
12.03.19
16:40
(136)+ Например сортировка строк уже весьма сложная штука
138 Вафель
 
12.03.19
16:41
(137) весь вопрос не в сортировке, а в сравнении строк
139 Вафель
 
12.03.19
16:41
алгоритм то не меняется
140 RomanYS
 
12.03.19
16:51
(136) про сортировку никто не говорил, речь про конкретный алгоритм. И тут будет несколько миллиардов простых операций на миллиард элементов, для современных гигагерцовых процов - секунды.

Если ты этой хренью собираешься сортировку оптимизировать, забудь. Там всё уже придумано до нас.
141 Garykom
 
гуру
12.03.19
16:51
(138) В первом цикле 4 операции сравнения, во втором 3 операции.
Итого 7 операций сравнения O(n) алгоритма

Далее делим и сортируем параллельно по кол-ву подмассивов причем алгоритм сортировки O(n^2), и на каждом шаге идет операция сравнения.
В худшем случае практически тоже самое, в лучшем выигрыш от кол-ва подмассивов.

Просто сравнить 7*N+(n-X)*(n-X) и 1*n*n
142 Garykom
 
гуру
12.03.19
16:51
(140) Параллельную сортировку
143 Вафель
 
12.03.19
17:14
(141) у сортировки слиянием сложность O(n log2 n) и это лучше чем O(n^2)
144 Garykom
 
гуру
12.03.19
17:36
(143) Пофиг, в любом случае если массив сортировать не целиком а по раздельным подмассивам то это лучше.
Параллельно сортируются подмассивы и затем собираются в один.
145 Вафель
 
12.03.19
17:37
(144) тут главное вовремя остановиться плодить потоки
146 Garykom
 
гуру
12.03.19
17:47
(145) https://ru.wikipedia.org/wiki/OpenCL
https://ru.wikipedia.org/wiki/GPGPU

И стандартные характеристики нынешней самой дешевой видяхи:
"Количество универсальных процессоров - 192"
147 Garykom
 
гуру
12.03.19
17:49
(146)+ Видеокарта чуть получше типа GT 1050 ti
Количество универсальных процессоров
768

И до нескольких тысяч у топовых видях за бешенные бабки.
148 RomanYS
 
12.03.19
18:29
(142) (144)
Во-первых это всё уже есть (если это кому-то нужно),
во-вторых это применимо очень для немногих массивов, в любом случайном массиве будет в среднем один подмассив из (0).