Другие языки программирования и технологии

Простая задачка для программистов: Как найти самый частый элемент массива?

Есть массив, о котором известно, что больше половины его элементов равны друг другу. Как за один проход по массиву выяснить чему же они равны? Дополнительные массивы создавать нельзя.
Да не реккурентный там алгоритм. O(n) сложность, процесс итеративный. Решали уже. Код на C#, стопудняк рабочий.

// Интерфейсный метод
public static T GetDominant<t>(T[] source)
{
T[] items = (T[]) source.Clone();
if (ProcessPairs(items, items.Length) == 0)
throw new Exception("No dominant");

return items[0];
}

// Рабочий метод
static int ProcessPairs<T>(T[] items, int count)
{
while (count > 1)
{
int newcount = 0;
for (int i = 0; i < count - 1; i += 2)
{
T left = items[ i ];
T right = items[i + 1];

if (left.Equals(right)) // same as left == right
{
items[newcount] = left;
newcount++;
}
}

if (count % 2 != 0 && newcount % 2 == 0)
{
items[newcount] = items[count - 1];
newcount++;
}

count = newcount;
}
return count;
}

Суть: если исключить половину повторяющихся элементов из массива, то самый частовстречающийся элемент по-прежнему будет всречаться чаще других. Выкладки из теории могу дать по просьбе в коментариях.

P.S. Ёманый парсер сожрал половину кода. На всякий, выслал на гель для душа.
Леонид Игнатьев
Леонид Игнатьев
9 617
Лучший ответ
int massive[20] ={1,3,4,43,8,9,...};

int solv (int value,int pos) {
int val=massive[pos];
static int count = solv(massive[++pos],++pos);
return (massive[++pos]==value) ? 1<< 8 | 16 << val : 0 << 8 | 16 << val;
}

void main() {
int _result = solv(0,0);

int value = _result & 8 + 0x0F; // значение которого больше всего в массиве
int count = _result & 16; // количество.
}

Рекурентный алгоритм ...не уверен что работает
фором пробегись и сравни ифом ф [i,j]=h[i,j] и делай действие типо я: =я+1; потом размерность массива разделиш на я
и получишь сумму равных элементов ну еше надо округлить раундом
Станислав V
Станислав V
2 066

Похожие вопросы