Недавно я был в интервью, и интервьюер задал мне следующий вопрос:
Given an unsorted array, how do you calculate the mode in O(N)?
Я ответил вдоль линий использования хэшмапа, O (N) цикла через массив и O (1) поиска.
Затем он сказал:
If you had to use constant memory but were allowed more processor time, how would you do it?
Я ответил: "Сортируйте массив и найдите самый длинный запуск, runtime = O (nlgn)
Следующий вопрос, который он задал, трахнул меня.
If you had to use constant memory and linear time how would you do it?
Я не знал, как ответить на этот вопрос, и он оставил это для меня как упражнение позже. Это были дни, и я до сих пор не знаю, как это сделать.
Кто-нибудь знает, как это сделать?>
Если числа находятся в пределах разумного диапазона, вы вычисляете режим линейно, используя массив, который имеет размер диапазона значений.
Значение в массиве будет индексом в массиве режимов. Увеличьте значение. Сохраняйте две другие переменные, которые являются наибольшей частотой и индексом значения, которое имеет наибольшую частоту.
#include <stdio>
int main(void)
{
unsigned int frequencies[11] = {0}; // Assume range 1..10, inclusive.
const unsigned int values[] =
{1, 8, 4, 8, 7, 3, 2, 8, 5};
const unsigned int value_quantity =
sizeof(values) / sizeof(values[0]);
unsigned int greatest_frequency = 0;
unsigned int value_of_greatest_frequency = 0;
for (unsigned int i = 0; i < value_quantity; ++i)
{
// Calculate new frequency.
const unsigned int frequency_index = values[i];
++frequencies[frequency_index];
// Update "running" variables
if (frequencies[frequency_index] > greatest_frequency)
{
greatest_frequency = frequencies[frequency_index];
value_of_greatest_frequency = frequency_index;
}
}
std::cout << "Mode is " << value_of_greatest_frequency
<< ", with frequency of " << greatest_frequency
<< "\n";
return 0;
}
Один проход, много переменных. Это будет работать, только если диапазон значений является разумным.
Другое предложение - использовать std::map</*value*/,/*frequency*/>
.
Этот алгоритм не является постоянным временем, но O (N) или меньше.
hash
. Насколько я понимаю, хеш - это результат применения функции к индексируемому значению, чего я еще не сделал.