Как можно выполнить следующую простую реализацию sum
?более быстрая реализация суммы (для теста Codility)
private long sum(int [] a, int begin, int end) {
if(a == null ) {
return 0;
}
long r = 0;
for(int i = begin ; i < end ; i++) {
r+= a[i];
}
return r;
}
РЕДАКТИРОВАТЬ
фона в порядке.
Чтение последней записи о ужасе кодирования, я пришел на этот сайт: http://codility.com, у которого есть этот интересный тест на программирование.
В любом случае, я получил 60 из 100 в своем представлении, и в основном (я думаю) это потому, что эта реализация суммы, потому что те части, где я потерпел неудачу, являются частями производительности. Я получаю TIME_OUT_ERROR's
Итак, мне было интересно, возможна ли оптимизация в алгоритме.
Таким образом, никакие встроенные функции или сборка не будут разрешены. Это будет сделано на C, C++, C#, Java или почти в любом другом.
EDIT
Как обычно, mmyers был прав. Я сделал профиль кода, и я видел, что большая часть времени была потрачена на эту функцию, но я не понимал, почему. Так что я сделал, чтобы выбросить свою реализацию и начать с новой.
На этот раз я получил оптимальное решение [в соответствии с San Jacinto O (N) -смом комментариев к MSN ниже -]
На этот раз я получил 81% на Codility который я думаю, достаточно хорошо. Проблема в том, что я не занимал 30 минут. но около 2 часов. но я думаю, это оставляет меня еще хорошим программистом, поскольку я мог бы решить проблему до тех пор, пока не найду оптимальное решение:
Вот мой результат.
my result on codility http://img534.imageshack.us/img534/6804/codility.png
Я никогда не понимал, что эти "комбинации ...", ни как проверить "extreme_first"
Вы разрешаете ассемблерные в C++? –
Никто не может комментировать скорость, если вы не объясните, какой язык и платформа вы используете. Как говорит mmyers, если это C++, вы можете встроить некоторую сборку. Если это C#, встроенный метод Enumerable.Sum() может быть быстрее, кто знает. Я уверен, что у Java тоже есть свои трюки. –
@mmyers: Не так много. Скорее всего, в оптимизации используется часть алгоритма, а не часть реализации: -/(если это даже имеет смысл) – OscarRyz