2012-04-07 2 views
0

У меня есть таблица рейтингаагрегировать точек

  • row1 = (V1, К1, 5);
  • строка2 = (V2, K2, 7);
  • строка2 = (V1, K1, 3);

мне нужно агрегировать очков в таблице AggregateRating таким образом, что таблица содержит

  • ROW1 = (V1, K1, 8);
  • строка2 = (V2, K2, 7);

I цикл один раз через рейтинговую таблицу и создать карту с помощью [ключ = (Col1, Col2), значение = Points] Если ключ существует добавить точки в другом месте создать новую запись на карту. Таблица рейтинга может содержать около 100+ записей, поэтому я хотел избежать нескольких проходов.

Это самый эффективный способ обойти это?

+0

Если '+' в '100 +' не означает миллиарды, вы должны придерживаться чистой и эффективной реализации, как вы предложили. ** ** наиболее эффективные решения редко необходимы. – Howard

+0

@Howard, какое более эффективное решение вы имеете в виду? Btw, если запрос сделан в миллиард раз, может оказаться важным уменьшить его сложность в 100 раз. –

+0

@Boris Точно, что я имел в виду. Существует разница между «наиболее эффективными» и «эффективными в реальном мире». В игру вступают все виды «грязных» вещей, таких как предварительная выборка, размеры строк кеша. И имеет значение, если у вас есть данные в миллиардном диапазоне, но не для '100 +'. В этом регионе вы должны держать решение простым и понятным, то есть эффективным для кодера и всех остальных, читающих ваш код (конечно, без ущерба для производительности системы). – Howard

ответ

0

Это зависит от того, какую структуру данных вы используете для хранения карты. Если вы используете хеш-карту, чем сохранение и чтение из нее, она будет постоянной по сложности (O(1)). Затем вы делаете один проход с одним запросом и не более одной вставкой для каждой записи в массиве. Это означает, что вся сложность вашего алгоритма будет O(n).

Однако вход только O(n), что означает, что вы не можете сделать лучше.

Имейте в виду, что если вы выбрали различную реализацию карты, например, дерева, сложность изменится, и вы не получите наиболее эффективное решение.

+0

Спасибо, yup Я использую HashMap – Oliver