Там это множество способов, которыми вы можете это сделать, каждый из которых имеет разные компромиссы производительности.
Во-первых, вы можете просто выполнить двойной цикл над массивом и для каждого элемента подсчитать, сколько раз оно появляется. Это займет время O (n), где n - количество элементов массива. Однако для этого требуется только пространство O (1).
Во-вторых, вы можете отсортировать массив в порядке возрастания, который будет группировать одинаковые элементы. Оттуда легко увидеть, сколько раз каждый элемент появляется, поскольку вы можете перебирать массив по одному и подсчитывать, сколько раз подряд появляется каждый элемент. Используемое время выполнения и пространство зависят от того, как вы сортируете массив. Если вы используете heapsort, время выполнения будет O (n log n), а использование пространства будет только O (1). Если вам известны все элементы в диапазоне массивов от 0 до U включительно, вы можете использовать сортировку подсчета во времени O (n + U) и пробел O (U) или сортировку по методу Radix во времени O (n log U) и пробел На).
В-третьих, вы можете создать вспомогательную таблицу, в которой хранятся частоты каждого элемента, и заполнить ее, итерации по массиву один раз, заполняя записи по мере их поступления. Если вы используете хэш-таблицу, ожидаемая продолжительность выполнения будет O (n), а использование пространства будет равно O (n). Если вы знаете, что элементы массива находятся в диапазоне от 0 до U, включительно, вы можете просто использовать частотный массив и решить это во времени O (n + U) и пространстве O (U) (что, по сути, будет считаться сортировкой!)
Здесь нет явного победителя. У Heapsort лучшая временная сложность для использования O (1). Хешинг имеет лучшую общую временную сложность, но плохое использование пространства. Подсчет или сортировка по методу radix может быть лучше всего в зависимости от того, насколько велики цифры.
Основываясь на вашей ситуации, посмотрите, каковы ваши фактические параметры и, надеюсь, вы можете выбрать, какое именно решение вам лучше всего подходит в данный момент.
Да, думал я. Я не согласен с тобой, что это глупый вопрос. Подумайте, например, о проблеме голландского национального флага – lampa
, где вы видели, что я сказал, что это глупый вопрос? Как проблема с вашим флагом имеет какое-либо отношение к этому? –
Ваша декламация была очень ироничной. Проблема с флагом - очень простой способ решения проблемы, и я хотел бы знать, есть ли эффективный алгоритм для решения моего вопроса. просто – lampa