Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Мера неупорядоченности линейного массива и некоторые вопросы
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Раздел "Различные структуры данных. Реализация" предназначен скорее для теоретических вопросов в контексте С++. Потому я решил не продолжать в нём дискуссию по данному конкретному вопросу. Спасибо Дмитрию и другим кто высказал своё мнение ранее. Постановка задачи 1. Для любого линейного непрерывного индексного массива T a[], размером n введём норму/меру неупорядоченности/measure по следующему правилу , где . Необходимо разработать алгоритм с асимптотической сложностью. Приведу пример: Пусть A задано следующим множеством чисел А = { 17, 5, 18, 1, 3, 4, 7, 11, 85, 8, 9 }. Тогда его мера равна: . Постановка задачи 2. Пусть в постановке 1 исходный индексный массив содержит в себе только уникальные элементы. Мне, вообще говоря, интересна 2 постановка. Ниже представлено решение асимптотика которого представима в виде суперлинейной функции. Попозже попробую решить используя сбалансированные деревья, и сравню со своим первым решением и с вариантом Дмитрия(n^2) на конкретных данных. Данный вариант работает правильно(судя по моим проверкам), но на мой взгляд реализован(с точки зрения проектирования и реализации типов данных) не очень хорошо(скорее всего плохо). Код: 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. 1. measure лучше выделить в отдельный класс 2. Перегруженный деструктор(если можно так сказать) почему-то не работает так как должен работать. Потому я его убрал пока 3. и др Подскажите пожалуйста в чём главные ошибки по реализации программы в оос. И может быть у кого-то есть ещё соображения по реализации алгоритма (с линейной скоростью или с лучшей организацией дерева за исключением вопросов балансировки(на данный момент)) PS Я ещё не прочитал статью о различиях между malloc и new потому пока использую malloc, вы в своих программах на С++ используете только new ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2015, 10:06 |
|
||
|
Мера неупорядоченности линейного массива и некоторые вопросы
|
|||
|---|---|---|---|
|
#18+
SashaMercuryЯ ещё не прочитал статью о различиях между malloc и new потому пока использую malloc, вы в своих программах на С++ используете только new ? malloc выделяет неинициализированный кусок памяти, new создаёт объект. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2015, 10:15 |
|
||
|
Мера неупорядоченности линейного массива и некоторые вопросы
|
|||
|---|---|---|---|
|
#18+
RWolfSashaMercuryЯ ещё не прочитал статью о различиях между malloc и new потому пока использую malloc, вы в своих программах на С++ используете только new ? malloc выделяет неинициализированный кусок памяти, new создаёт объект. Дефолтный new это вызов p = malloc... и вызов конструктора для p == this. В случае new [N], выделяется память под N объектов и для каждого вызывается конструктор. Дефолтный delete, вызывает деструктор, потом free. В случае delete [], вызывается деструктор для каждого элемента массива, потом free для всего массива. Нужно заметить, что в процессе конструирования и разрушения объекта происходит инициализация не только атрибутов, но и таблицы виртуальных методов (если они применяются). Прямого доступа к таблицам виртуальных методов у программиста нет. Можно создать собственные new и delete и использовать в них иной менеджер памяти, отличный от стандартной кучи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2015, 10:55 |
|
||
|
Мера неупорядоченности линейного массива и некоторые вопросы
|
|||
|---|---|---|---|
|
#18+
SashaMercuryЯ ещё не прочитал статью о различиях между malloc и new потому пока использую malloc, вы в своих программах на С++ используете только new ? Для создания объектов динамически -- new. Для выделения просто памяти -- можно и malloc. new в С++ выделяет память и инициализирует в этой памяти объект с помощью конструктора. malloc про объекты вообще ничего не знает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2015, 11:32 |
|
||
|
Мера неупорядоченности линейного массива и некоторые вопросы
|
|||
|---|---|---|---|
|
#18+
Eсть еще вариант обойтись и без new и без malloc в своем коде, на стандартных контейнерах, make_unique и make_shared. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2015, 12:09 |
|
||
|
Мера неупорядоченности линейного массива и некоторые вопросы
|
|||
|---|---|---|---|
|
#18+
Саша. Что такое СУПЕР ЛИНЕЙНАЯ функция? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2015, 13:30 |
|
||
|
Мера неупорядоченности линейного массива и некоторые вопросы
|
|||
|---|---|---|---|
|
#18+
Сделал по этому алгоритму 18266267 Работает побыстрее перебора. На 100 тыс. элементов перебор 6.2 сек. этот 0.04 сек Вот замеры ЭлементовВремя1 млн.0.52 сек.2 млн.1.4 сек.3 млн.2.5 сек.4 млн.3.78 сек.8 млн.10.4 сек. Попробовал сложность оценить, если сравнить с O(n * log2(n)) то вроде как даже чуть быстрее. Например 8*log(8) = 24, у меня 10.4 / 0.52 = 20. Исходник Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2015, 16:46 |
|
||
|
Мера неупорядоченности линейного массива и некоторые вопросы
|
|||
|---|---|---|---|
|
#18+
Может быть я не так перевожу, но в англоязычной литературе встречается термин superlinear function. Скорость роста данной функции выше чем у линейной функции, например, асимптотика quick sort принадлежит классу superlinear function, и составляет . Так и тут ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2015, 02:00 |
|
||
|
Мера неупорядоченности линейного массива и некоторые вопросы
|
|||
|---|---|---|---|
|
#18+
Спасибо, мне кажется он работает. Почему вывод времени реализован так как он реализован ? Можно ли упростить реализацию with_counter() не меняя алгоритм ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2015, 04:05 |
|
||
|
Мера неупорядоченности линейного массива и некоторые вопросы
|
|||
|---|---|---|---|
|
#18+
SashaMercuryПочему вывод времени реализован так как он реализован ? Что конкретно интересует? Максимально упростил использование. Для замера достаточно создать объект, а в конце получить его состояние. SashaMercuryМожно ли упростить реализацию with_counter() не меняя алгоритм ? Думаю что нет. Разве что в начале подбор шага переделать на формулу. Там идет поиск минимума step / 2 + TEST_SIZE / (step * 2) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2015, 05:37 |
|
||
|
Мера неупорядоченности линейного массива и некоторые вопросы
|
|||
|---|---|---|---|
|
#18+
Сделать вывод временив одном формате независимо от того какое у нас время(1 секунда или 10) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2015, 06:01 |
|
||
|
Мера неупорядоченности линейного массива и некоторые вопросы
|
|||
|---|---|---|---|
|
#18+
Просто не понял почему вывод времени сделан именно так. Можно было вывести в одном формате ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2015, 06:01 |
|
||
|
Мера неупорядоченности линейного массива и некоторые вопросы
|
|||
|---|---|---|---|
|
#18+
SashaMercuryПросто не понял почему вывод времени сделан именно так. Можно было вывести в одном формате Для читабельности. Чтобы лишнего не было. Время надо для сравнительной оценки. Точности в 0,1% вполне достаточно, т.е. надо 3 первых десятичных знака. Поэтому зачем писать лишнее если можно не писать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2015, 06:45 |
|
||
|
Мера неупорядоченности линейного массива и некоторые вопросы
|
|||
|---|---|---|---|
|
#18+
ДмитрийДумаю что нет. Разве что в начале подбор шага переделать на формулу. Там идет поиск минимума step / 2 + TEST_SIZE / (step * 2) Этим минимумом будут либо значения на границах, либо в точке. Если я правильно понял. Разве не так ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2015, 07:14 |
|
||
|
Мера неупорядоченности линейного массива и некоторые вопросы
|
|||
|---|---|---|---|
|
#18+
Вроде так, только надо еще округлить до ближайшей степени двойки. Я специально так сделал, чтобы исключить деление и остатки от деления. т.е. для 1 млн должно получиться 1024, для 100 млн. - 8192. Можно попробовать точное значение брать, делений не так уж и много будет. Поправлю попозже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2015, 07:49 |
|
||
|
Мера неупорядоченности линейного массива и некоторые вопросы
|
|||
|---|---|---|---|
|
#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. Время точно такое же как тут 18278951 Но кода меньше и он читабельнее. PS Я так и не вспомнил как вывести что минимум это корень от TEST_SIZE. Математика забыта напрочь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2015, 08:42 |
|
||
|
Мера неупорядоченности линейного массива и некоторые вопросы
|
|||
|---|---|---|---|
|
#18+
Спасибо, теперь у меня есть с чем сравнивать свой алгоритм :) PS И теперь нужно подставить в исходную функцию, и получим значение функции ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2015, 08:54 |
|
||
|
Мера неупорядоченности линейного массива и некоторые вопросы
|
|||
|---|---|---|---|
|
#18+
Больше мы её(реализацию) никак не сократим/оптимизируем ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2015, 08:55 |
|
||
|
Мера неупорядоченности линейного массива и некоторые вопросы
|
|||
|---|---|---|---|
|
#18+
SashaMercuryМожет быть я не так перевожу, но в англоязычной литературе встречается термин superlinear function. Скорость роста данной функции выше чем у линейной функции, например, асимптотика quick sort принадлежит классу superlinear function, и составляет . Так и тут Возможно ее так назвали из-за внешней схожести с линейной. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2015, 09:05 |
|
||
|
Мера неупорядоченности линейного массива и некоторые вопросы
|
|||
|---|---|---|---|
|
#18+
Я думаю что её так назвали потому что такой класс функций очень хорош, очень. Особенно на фоне O(n^2). А может быть тут super в смысле "выше", "больше", "сверх". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2015, 09:10 |
|
||
|
Мера неупорядоченности линейного массива и некоторые вопросы
|
|||
|---|---|---|---|
|
#18+
SashaMercuryБольше мы её(реализацию) никак не сократим/оптимизируем ? В плане алгоритма нечего сокращать. Можно return`ы поубирать, сделать вложенные if(), пару строк убавится, но имху предыдущий вариант читабельнее Код: 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. Можно комментарии и скобки {} поубирать кое-где. Типа Код: plaintext 1. Но так вообще нечитаемый изврат получится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2015, 09:35 |
|
||
|
Мера неупорядоченности линейного массива и некоторые вопросы
|
|||
|---|---|---|---|
|
#18+
Версия 2.0 с деревом счетчиковИсходные данные не портит. Код: 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. Ломал я голову как добавить дерево, пришел к мысли что массив счетчиков надо заменить на дерево счетчиков. Смысл такой: Строим дерево счетчиков: 0-й уровень один счетчик на 2 элемента, 1-й на 4, 2-й на 8 и т.д. пока на последнем не останется один счетчик. В итоге суммарно счетчиков столько же сколько элементов. Вставляем на места по одному элементу исходных в порядке возрастания и по счетчикам определяем сколько уже вставлено. Затем Увеличиваем на 1 счетчики всех уровней соответствующие данному элементу. Таким образом для подсчета с одного уровня читается не более двух счетчиков и переход на следующий уровень. По сложности: в среднем на один элемент 1.5*log2(N/2) чтений счетчиков и log2(N/2) инкрементов. Время расчета ЭлементовВерсия 1.0Версия 2.01 млн.0.52 сек.0.21 сек.2 млн.1.4 сек.0.44 сек.3 млн.2.5 сек.0.66 сек.4 млн.3.78 сек.0.89 сек.8 млн.10.4 сек.1.84 сек. Сложность улучшилась - скорость возросла. PS Упрощать код дальше некуда. Взял <vector> чтобы читабельнее было. Если заменить на обычные массивы - будет быстрее работать в 1.5 раза, но кода для инициализации будет заметно больше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2015, 13:17 |
|
||
|
Мера неупорядоченности линейного массива и некоторые вопросы
|
|||
|---|---|---|---|
|
#18+
Дмитрий, спасибо. А можно пожалуйста для особо одаренных описать алгоритм по пунктам. Я не очень хорошо его понял. PS попытался свой алгоритм замерить по скорости, на больших значениях не получается. Вероятно что-то не так с памятью ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2015, 14:35 |
|
||
|
Мера неупорядоченности линейного массива и некоторые вопросы
|
|||
|---|---|---|---|
|
#18+
Там две части: 1. Элементы добавляются по возрастанию их значения. Т.е. сначала минимальный, затем следующий и т.д. Для этого надо знать в каком порядке они идут. Для этого массив idx из указателей. Массив сортируется в порядке значений по указателям. Код который касается порядка обхода Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Результат на твоем набореinsert data[3] = 1 insert data[4] = 3 insert data[5] = 4 insert data[1] = 5 insert data[6] = 7 insert data[9] = 8 insert data[10] = 9 insert data[7] = 11 insert data[0] = 17 insert data[2] = 18 insert data[8] = 85 Дальше исходим из аксиомы: если мы вставили значение в ячейку X то ячеек от начала с большим значением всего X-1 - количество заполненных, т.к. заполнены только с меньшими значениями. Т.к. нумерация с нуля, то res[pos] = pos; это и есть X-1 и остается посчитать сколько уже заполнено. Тут и нужны счетчики чтобы не делать перебора до начала. До этого места понятно расписал? Со счетчиками хз как объяснить попроще, сейчас соображу и распишу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2015, 15:24 |
|
||
|
Мера неупорядоченности линейного массива и некоторые вопросы
|
|||
|---|---|---|---|
|
#18+
Про счетчики. Давай на твоем примере из 11 значений. Получается три уровня счетчиков. 0й 6 счетчиков, 1й - 3, 2й - 2. Таблица как счетчики соотносятся с конкретными элементами исходного массива. Уровень012345678910000112233445100001111222200000000111 Колонки - номера исходных элементов, строки - уровни счетчиков, тело таблицы номер счетчика данного уровня. Если приглядишься, то увидишь что каждый счетчик нижнего уровня включает в себя ровно два счетчика верхнего. Это и есть дерево. Значения (переменная pos) обрабатываются по одному, поэтому сначала подсчет сколько до него, затем вставка его для последущей обработки. Наоборот нельзя (вставка потом подсчет), т.к. 0й уровень для двух значений. Так же будет неправильно работать если исходный набор будет содержать повторы. Это можно полечить сделав 0й уровень для одного элемента. В нашем случае это лишняя трата памяти. Дальше в обратном порядке чтобы понятнее было. Вставка значения: Код: plaintext 1. 2. 3. 4. cnt_levels количество уровней. Перебираем все слои и в каждом увеличиваем счетчик на 1. Например для вставки data[3] будут увеличены счетчики cnt_tree[0][1], cnt_tree[1][0], cnt_tree[2][0] т.е. в общем виде номер счетчика на уровне определяется по формуле pos/2^(Уровень+1) Получения количества вставленных с начала: Код: plaintext 1. 2. 3. 4. 5. 6. 7. берем pos-1 находим для него счетчик нулевого уровня, если начало счетчика не совпадает с началом счетчика следующего уровня, то берем предыдущий счетчик, начала уровней совпало - переходим на уровень выше и берем там предыдущий и т.д. Например для подсчета сколько перед data[7] складываем cnt_tree[0][3]+cnt_tree[0][2]+cnt_tree[1][0] для data[8] можно сразу взять cnt_tree[2][0], но у меня посчитается cnt_tree[0][3]+cnt_tree[0][2]+cnt_tree[1][0] data[9] будет cnt_tree[0][4]+cnt_tree[1][1]+cnt_tree[1][0] хотя можно было cnt_tree[0][4]+cnt_tree[2][0] Небольшой задел для оптимизации есть :) Принцип понятен? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2015, 16:01 |
|
||
|
|

start [/forum/topic.php?fid=57&fpage=42&tid=2018790]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
50ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
| others: | 294ms |
| total: | 447ms |

| 0 / 0 |
