|   |   | 
| 
 | подскажите пониманию задачки | ☑ | ||
|---|---|---|---|---|
| 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). | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |