Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Тяпничная пирамида
|
|||
|---|---|---|---|
|
#18+
ДмитрийИнтересно есть ли какие-то алгоритмы сортировки заточенные на почти отсортированные массивы? В том случае, если число неотсортированных элементов значительно меньше размера исходного массива, то подойдет сортировка вставками. Попробуй её на своих данных, если у тебя будет время) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2017, 21:07 |
|
||
|
Тяпничная пирамида
|
|||
|---|---|---|---|
|
#18+
При этом в качестве структуры данных вероятно стоит организовать дерево, вставка будет за ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2017, 21:09 |
|
||
|
Тяпничная пирамида
|
|||
|---|---|---|---|
|
#18+
Dima TЯ время меряю std::sort() и своего цикла. На сортированном массиве. этого мало, иногда сравнение дорого, иногда перемещение ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2017, 22:15 |
|
||
|
Тяпничная пирамида
|
|||
|---|---|---|---|
|
#18+
Dima T Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Может быть эта проверка... кхм... слишком пессимистична? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2017, 00:45 |
|
||
|
Тяпничная пирамида
|
|||
|---|---|---|---|
|
#18+
maytonMasterZiv, давай Чего вам давать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2017, 05:58 |
|
||
|
Тяпничная пирамида
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)Dima TЯ время меряю std::sort() и своего цикла. На сортированном массиве. этого мало, иногда сравнение дорого, иногда перемещение Согласен, надо поискать реализации QuickSort и счетчики туда вставить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2017, 08:50 |
|
||
|
Тяпничная пирамида
|
|||
|---|---|---|---|
|
#18+
maytonМожет быть эта проверка... кхм... слишком пессимистична? Проверка корректна, постановка задачи слишком строгой оказалась. Не учел что есть такая хрень как Unicode Collation Algorithm где 5 видов сравнения и все правильные. Поэтому получив отсортированное извне, моя проверка считает его несортированным. Например сортировка от MSSQL не совпадает с сортировкой в ASCII MSSQLASCIIa/ba+ba+ba-baaaa/ba-baaaabcabc Думаю надо подход менять: Первый проход запоминание элементов стоящих не на своих местах, при количестве >N считаем массив несортированным и сортируем алгоритмом со стабильной сложностью O(n log(n)) (std::sort() и т.п.). При <N облегченная сортировка, например вставками, как Саша предлагает, можно свой велосипед поизобретать с использованием запомненного на первом проходе. Тут надо с размером N определиться. Тупо в процентах не вариант, т.к. исходим из того что выбираем между алгоритмом стабильно дающим O(n log(n)) и нестабильным где от O(n) в случае сортированного до O(n 2 ) в случае обратноотсортированного. С первым проходом тоже неясно как быть, например последовательность Код: plaintext 1. тут можно посчитать что 9 не на месте, а можно 2,3,4,5,6,7,8 Как вариант сразу начинать сортировать вставками и останавливаться при каком-то количестве перестановок и/или сравнений. Немного конкретики: я этим в C# занимаюсь, в массиве ссылка на объект хранится, сравниваются строки до 100 символов, совпадение начал соседних строк до 30 символов частое явление. Думаю тут сравнение значительно тяжелее чем перестановка. Думаю можно перестановки не учитывать для упрощения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2017, 09:00 |
|
||
|
Тяпничная пирамида
|
|||
|---|---|---|---|
|
#18+
Тест на реальных данных со встроенным алгоритмом сортировки. Вставил счетчик в функцию сравнения. Сортировал реальные, почти сортированные данные. Сортировка - вызовов при сортировке, Повтор - сортировка сортированного. ЭлементовСортировкаПовтор812569456265526579885491862476695563590633866454630181456117681816065114757181573161943 Сравнений в 10-12 раз больше чем элементов. Если сортировать в обратную сторону до 15 раз доходит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2017, 11:13 |
|
||
|
Тяпничная пирамида
|
|||
|---|---|---|---|
|
#18+
maytonMasterZiv, давай Up. Есть новости? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2017, 00:43 |
|
||
|
Тяпничная пирамида
|
|||
|---|---|---|---|
|
#18+
Сортировка вставками почти отсортированного массива ускорила сортировку в 10 раз. Как и предполагалось. Я туда двоичный поиск добавил для поиска места вставки. Без него особого ускорения не было. Стоимость сравнения и перестановки в моем случае оказались примерно одинаковы, поэтому повесил все на общий счетчик и ограничил количество операций сортировки вставками 3-мя размерами массива, т.е. если не хватило 2N операций, то запуск стандартной сортировки. Цифра выбрана методом научного тыка :) Итого: получилась сортировка сложностью от O(n) до O(n (log(n) + 3)) А ту задачу 20151862 (добавление в сортированный массив) вообще по другому решил, в один проход. Исходники Писал на C#, но если кому надо на С переписать не сложно Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2017, 09:08 |
|
||
|
Тяпничная пирамида
|
|||
|---|---|---|---|
|
#18+
Dima T, для "почти сортированного" хорошо подходит merge-sort. В первую фазу мы детектируем границы суб-последовательностей а во вторую - действуем согласно каноническому слиянию. Но возможно для тебя "почти отсортированный" определяется как-то иначе... и возможно стоит уточнить или даже привести пример генератора почти-* последовательностей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2017, 18:13 |
|
||
|
Тяпничная пирамида
|
|||
|---|---|---|---|
|
#18+
maytonНо возможно для тебя "почти отсортированный" определяется как-то иначе... и возможно стоит уточнить или даже привести пример генератора почти-* последовательностей. Вот писал 20156048 , почти сортированный, это сортированный с другим пониманием юникода. Как-то поднимал топик про эти грабли . Т.е. из-за этих нюансов строка немного не на своем месте оказывается. Так-то пофиг, но есть второй вариант - вообще не сортированный, его надо сортировать. Что у меня на входе я не знаю, поэтому надо было максимально быстрый алгоритм решения этой проблемы. Началось все с того что у меня разбор XML в 200 Мб занимает 3.5 сек вместе с записью обратно на диск, а промежуточная сортировка сожрала 5+ сек., я ее запараллелил, но все равно она тормозит. Сейчас 0.5 сек. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2017, 18:31 |
|
||
|
Тяпничная пирамида
|
|||
|---|---|---|---|
|
#18+
Dima T, про Unicode я не очень понял. Мне кажется это - должно конфигурироваться извне или подключаться как плагин к сортировке. Ну... я-бы забил болт и сортировал байты. Далее. По поводу последовательности Код: plaintext 1. Я-бы выделил в ней две под-последовательности Код: plaintext 1. Они - монотонные. Неубывающие. И хорошо проходят через merge-sort. В противоположность. Если на вход пойдет белый шум длиной N элементов - то нужно эвристически принять решение о его НЕПРИГОДНОСТИ к частичным методам даже если случайно в нем будут меньше чем N подпоследовательностей. Ну в общем надо исходить из какой-то разумной пропорции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2017, 21:57 |
|
||
|
Тяпничная пирамида
|
|||
|---|---|---|---|
|
#18+
maytonDima T, про Unicode я не очень понял. Мне кажется это - должно конфигурироваться извне или подключаться как плагин к сортировке. Ну... я-бы забил болт и сортировал байты. Данные из разных источников, разным софтом генерятся. Например тот софт сортирует {aaa, a-b, abc} а мой считает что "a-b" < "aaa", т.е. должно быть так {a-b, aaa, abc}. В C# вообще отличились с дефолтной сортировкой, например это отсортировано по их мнению {ИГРА, Й ОГА, ИРА}. Как бы пофиг, можно забить, мне надо чтобы в итоге было отсортировано, без разницы как, главное чтобы все одинаковые были рядом друг с другом, для группировки в один проход. Но иногда данные приходят вообще не сортированные и тут возникла проблема как отличить первое от второго, т.к. в первом случае для сортировки надо сдвинуть 5-10 элементов на 1-10 позиций, во втором - полноценная сортировка. Всегда делать полноценную сортировку оказалось медленно. Отсюда вопрос и родился. Сортировка вставками очень даже к месту пришлась для первого случая. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 09:52 |
|
||
|
Тяпничная пирамида
|
|||
|---|---|---|---|
|
#18+
А ну ОК. Вообще я смотрю тема сортировок не на шутку возбудила сообщество. Думаю поднять тяпничный топик на тему merge. И, помнится Илья хвастался дескыть есть у него в тайные рукописи... чего-то там дженерик и на сях. У меня тоже есть мысли по поводу внешних сортировок. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 10:00 |
|
||
|
Тяпничная пирамида
|
|||
|---|---|---|---|
|
#18+
Dima TmaytonНо возможно для тебя "почти отсортированный" определяется как-то иначе... и возможно стоит уточнить или даже привести пример генератора почти-* последовательностей. Вот писал 20156048 , почти сортированный, это сортированный с другим пониманием юникода. Как-то поднимал топик про эти грабли . Т.е. из-за этих нюансов строка немного не на своем месте оказывается. Так-то пофиг, но есть второй вариант - вообще не сортированный, его надо сортировать. Что у меня на входе я не знаю, поэтому надо было максимально быстрый алгоритм решения этой проблемы. Началось все с того что у меня разбор XML в 200 Мб занимает 3.5 сек вместе с записью обратно на диск, а промежуточная сортировка сожрала 5+ сек., я ее запараллелил, но все равно она тормозит. Сейчас 0.5 сек. Сочуствую , но сортировки в разных кодировках везде аццкий треш. Особенно когда кодировка в БД одна , а на клиентах другие и разные обязательно где то вылаят какие то бока. Я каждый раз когда сталкиваюсь всегда вспоминаю и перечитаваю http://utf8everywhere.org/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 14:48 |
|
||
|
Тяпничная пирамида
|
|||
|---|---|---|---|
|
#18+
maytonА ну ОК. Вообще я смотрю тема сортировок не на шутку возбудила сообщество. Думаю поднять тяпничный топик на тему merge. И, помнится Илья хвастался дескыть есть у него в тайные рукописи... чего-то там дженерик и на сях. У меня тоже есть мысли по поводу внешних сортировок. Это естественно, мы так привыкли пользоваться библами, которые в реализации довольно сложны, что многие и не могут адекватную сортировку написать. Вот затыки на казалось бы вполне понятных местах и вызывают желание разобраться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 15:23 |
|
||
|
Тяпничная пирамида
|
|||
|---|---|---|---|
|
#18+
А я подумал что ты не будешь пробовать inserting sort. Дмитрий, а почему на C#, тут какое-то преимущество для данного конкретного случая? По коду вроде бы не очевидно. maytonDima T, для "почти сортированного" хорошо подходит merge-sort. В первую фазу мы детектируем границы суб-последовательностей а во вторую - действуем согласно каноническому слиянию. Но возможно для тебя "почти отсортированный" определяется как-то иначе... и возможно стоит уточнить или даже привести пример генератора почти-* последовательностей. Честно говоря я не очень понимаю, каковы все-таки преимущества merge sort в данном случае. Insertion sort выглядит прозрачным и логичным решением. А в качестве метрики неупорядоченности массива можно использовать, например, количество элементов местоположение которых нужно изменить для того, чтобы массив стал упорядоченным. Где-то об этом читал, но уже не помню где ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 20:48 |
|
||
|
Тяпничная пирамида
|
|||
|---|---|---|---|
|
#18+
SashaMercuryА я подумал что ты не будешь пробовать inserting sort. Дмитрий, а почему на C#, тут какое-то преимущество для данного конкретного случая? По коду вроде бы не очевидно. Задача у меня реальная, написана на C#, поэтому C#. Переписать на С/С++ не сложно. Я тоже не думал что буду пробовать :) читал вскользь вики - не понял, но ты упомянул, я перечитал - понял что это то что надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 21:08 |
|
||
|
Тяпничная пирамида
|
|||
|---|---|---|---|
|
#18+
SashaMercuryЧестно говоря я не очень понимаю, каковы все-таки преимущества merge sort в данном случае. Insertion sort выглядит прозрачным и логичным решением. А в качестве метрики неупорядоченности массива можно использовать, например, количество элементов местоположение которых нужно изменить для того, чтобы массив стал упорядоченным. Где-то об этом читал, но уже не помню где Сложность O(n) - O(n log(n)) против O(n) - O(n 2 ) вот и вся разница. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 21:13 |
|
||
|
Тяпничная пирамида
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)Dima T, довольно примечательная сортировка J-сортировка её можно ещё немного оптимизировать Сомневаюсь что на больших массивах будет работать. Автор честно сознался авторЧем длиннее массив, тем чаще такие вырожденные узлы будет возникать. А значит, в средней полосе длинных массивов сортировке вставками придётся изрядно потрудиться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 19:12 |
|
||
|
Тяпничная пирамида
|
|||
|---|---|---|---|
|
#18+
Запилил тест Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217. 218. 219. 220. 221. 222. 223. 224. 225. 226. 227. 228. 229. 230. 231. 232. 233. 234. 235. 236. 237. 238. 239. 240. 241. 242. 243. 244. 245. 246. 247. 248. 249. 250. 251. 252. 253. 254. 255. 256. 257. 258. 259. 260. 261. 262. 263. 264. 265. 266. 267. 268. 269. 270. 271. 272. 273. 274. 275. 276. 277. 278. 279. 280. 281. 282. 283. 284. 285. 286. 287. 288. 289. 290. 291. 292. 293. 294. 295. 296. 297. 298. 299. 300. 301. 302. 303. 304. Результат 5-ти видов сортировки на массиве в 10 млн. элементов. Места ставил по времени. Несортированный АлгоритмВремя мсКопированийСравненийПримечаниеmerge_sort()1 990243 222 784230 068 109из инетаstd::sort()2 035338 720 497375 556 538MSVC2015insert_sort()2 049363 169 751376 875 415моя поделкаquick_sort()2 510168 421 944389 659 279из инетаqsort()3 045н/д277 090 450MSVC2015 Сортированный АлгоритмВремя мсКопированийСравненийinsert_sort()520 19 999 998std::sort()48017 415 788220 483 043quick_sort()5526 465 373243 606 228merge_sort()827243 222 784129 428 083qsort()1 054н/д237 187 025 Выводы: 1. qsort() тормозит из-за того что функция сравнения не инлайнится, в остальном относительно неплохо. Количество копирований неизвестно, т.к. замерить можно только вызовы сравнений. 2. merge_sort() (скопипащено из вики ) показала неплохой результат на несортированном массиве, но заявленные O(n) на сортированном не айс, копирует много и рекурсия. Может реализация не лучшая, но пробовал несколько, остальные еще тормознее. 3. insert_sort() моя поделка комбинация сортировки вставками и std::sort() ИМХО надо merge_sort() скрещивать с сортировкой вставками, как mayton предложил 20159478 . Должно взлететь. Есть мысли в этом направлении. PS Не довелось тему сортировок изучить, образование не программистское, в фокспро все на таблицах, т.е. SQL, т.е. order by и готово. "Удивило" что log 2 (15000) = 14, просто никогда не задумывался об этом, поэтому интересно побыть студентом :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 19:48 |
|
||
|
Тяпничная пирамида
|
|||
|---|---|---|---|
|
#18+
Dima TСомневаюсь что на больших массивах будет работать. Автор честно сознался авторЧем длиннее массив, тем чаще такие вырожденные узлы будет возникать. А значит, в средней полосе длинных массивов сортировке вставками придётся изрядно потрудиться. ага, фигня получилась: Код: plaintext 1. 2. 3. 4. 5. 6. 7. но где проблемы с HeapSort он правильно подметил ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 22:22 |
|
||
|
Тяпничная пирамида
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)Dima T, довольно примечательная сортировка J-сортировка её можно ещё немного оптимизировать Спасибо. Интересная статья. Жаль что автор не расчитал среднюю оценку O(n). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2017, 23:51 |
|
||
|
|

start [/forum/topic.php?fid=57&startmsg=39393498&tid=2018242]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
58ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
| others: | 12ms |
| total: | 180ms |

| 0 / 0 |
