Интервью Q: Поиск режима массива

0

Недавно я был в интервью, и интервьюер задал мне следующий вопрос:

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?

Я не знал, как ответить на этот вопрос, и он оставил это для меня как упражнение позже. Это были дни, и я до сих пор не знаю, как это сделать.

Кто-нибудь знает, как это сделать?>

  • 0
    -1 для слова f
  • 0
    Как вы можете отсортировать массив в постоянной памяти? Постоянная память означает, что предметы не могут быть перемещены. Вы должны либо сделать копию и отсортировать копию, либо использовать массив указателей и отсортировать массив указателей по их целевым значениям.
Показать ещё 7 комментариев
Теги:
arrays
algorithm

1 ответ

0

Если числа находятся в пределах разумного диапазона, вы вычисляете режим линейно, используя массив, который имеет размер диапазона значений.

Значение в массиве будет индексом в массиве режимов. Увеличьте значение. Сохраняйте две другие переменные, которые являются наибольшей частотой и индексом значения, которое имеет наибольшую частоту.

#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) или меньше.

  • 0
    Значит, это не то же самое, что решение hashmap от user3735521?
  • 0
    Нет, немного по-другому. Я не использую hash . Насколько я понимаю, хеш - это результат применения функции к индексируемому значению, чего я еще не сделал.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню