|   |   | 
| 
 | подскажите пониманию задачки | ☑ | ||
|---|---|---|---|---|
| 0
    
        DES 08.03.19✎ 16:59 | 
        "Дан массив из n чисел. 
 Нужно разбить массив на макимальное количество непрерывных подмассивов так, чтобы после сортировки элементов внутри каждого подмассива весь массив стал отсортированным." Разве можно сортирнуть массив, например, разбив массив на два куска, отсортировать каждый кусок и получить весь массив отсортированным? Или я не понимаю задачу? | |||
| 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). | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |