Обратите внимание, это домашнее задание.
Мне нужно найти режим массива (положительные значения) и вторично вернуть это значение, если режим больше, чем sizeof(array)/2
, доминирующее значение. Некоторые массивы не будут иметь ни того, ни другого. Это достаточно просто, но есть ограничение, что массив НЕ должен быть отсортирован до определения, кроме того, сложность должна быть порядка O(nlogn).
Используя это второе ограничение и основную теорему, мы можем определить, что временная сложность 'T(n) = A*T(n/B) + n^D', где A=B и log_B(A)=D для истинности O(nlogn). Таким образом, А=В=D=2. Это также удобно, поскольку доминирующее значение должно быть доминирующим в 1-й, 2-й или обеих половинах массива.
Используя «T (n) = A * T (n / B) + n ^ D», мы знаем, что функция поиска будет вызывать себя дважды на каждом уровне (A), делит набор задач на 2 на каждом уровне (B). Я застрял, пытаясь понять, как заставить мой алгоритм учитывать n ^ 2 на каждом уровне.
Чтобы сделать код этого:
int search(a,b) {
search(a, a+(b-a)/2);
search(a+(b-a)/2+1, b);
}
«Клей», которого мне здесь не хватает, заключается в том, как объединить эти разделенные функции, и я думаю, что это реализует сложность n ^ 2. Здесь есть некоторая хитрость, когда доминанта должна быть доминантой в 1-й или 2-й половине или в обеих, не совсем уверен, как это помогает мне прямо сейчас с ограничением сложности.
Я записал несколько примеров небольших массивов и нарисовал способы их деления. Кажется, я не могу пойти в правильном направлении, чтобы найти один единственный метод, который всегда будет возвращать доминирующее значение.
На уровне 0 функция должна вызывать себя для поиска в первой и второй половине массива. Это должно рекурсировать и вызывать себя. Затем на каждом уровне нужно выполнить n^2 операций. Таким образом, в массиве [2,0,2,0,2] он разделит его на поиск в [2,0] и поиск в [2,0,2] И выполнит 25 операций. Поиск по [2,0] вызовет поиск по [2] и поиск по [0] И выполнит 4 операции. Я предполагаю, что это должен быть поиск самого пространства массива. Я планировал использовать C++ и использовать что-то из STL для перебора и подсчета значений. Я мог бы создать большой массив и просто обновить счетчики по их индексу.
map<Value,Count>
, затем повторятьmap
, чтобы найти наибольшее количество... будетO(nlogn)
, так как это стоимость вставки карты, а итераций в любом случае меньше. - person Tony Delroy   schedule 07.02.2013