Функция пика в последовательности - оптимизировать код для ускорения его работы - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Я написала функцию для поиска пика, но программа выполняется примерно 14 сек. Как возможно оптимизировать функцию unsigned long peak(unsigned long nel, int (*less)(unsigned long i, unsigned long j)), чтобы программа выполнялась за 1 сек. Вот мой код:
Листинг программы
  1. #include <stdio.h>
  2. int less(unsigned long i, unsigned long j)
  3. {
  4. if (i == j) return 0;
  5. if (i < j) {
  6. if (j <= 11241155978086311589UL) return 1;
  7. if (i >= 11241155978086311589UL) return 0;
  8. return (11241155978086311589UL-i) < (j-11241155978086311589UL);
  9. }
  10. if (i <= 11241155978086311589UL) return 0;
  11. if (j >= 11241155978086311589UL) return 1;
  12. return (11241155978086311589UL-j) < (i-11241155978086311589UL);
  13. }
  14. unsigned long peak(unsigned long nel, int (*less)(unsigned long i, unsigned long j)) {
  15. int i,r,b;
  16. for (i=0;i<nel-1;i++) {
  17. b=i++;
  18. r=less(b,i);
  19. if (r != 1)
  20. break;
  21. b=i--;
  22. }
  23. return i-1;
  24. }
  25. int main(int argc, char **argv)
  26. {
  27. unsigned long i = peak(13356955260197607378UL, less);
  28. if (i == 11241155978086311589UL) {
  29. printf("CORRECT\n");
  30. } else {
  31. /* Если функция peak работает правильно,
  32. сюда никогда не будет передано
  33. управление! */
  34. printf("WRONG\n");
  35. }
  36. return 0;
  37. }

Решение задачи: «Функция пика в последовательности - оптимизировать код для ускорения его работы»

textual
Листинг программы
  1. unsigned long fast_peak(unsigned long nel, int (*less)(unsigned long i, unsigned long j)) {
  2.     unsigned long l = 0, r = nel - 1, m;
  3.     for (;l < r;) {
  4.         m = (l / 2 + r / 2);
  5.         if (less(m, m + 1)) {
  6.             l = m + 1;
  7.         } else if (less(m, m - 1)) {
  8.             r = m - 1;
  9.         } else {
  10.             return m;
  11.         }
  12.     }
  13.     return l;
  14. }

Объяснение кода листинга программы

  1. Входные данные функции: nel - количество элементов в последовательности; less - функция, сравнивающая два элемента последовательности и возвращающая значение типа int (меньше, равно или больше).
  2. Создаются три переменные: l - левая граница текущего интервала; r - правая граница текущего интервала; m - середина текущего интервала.
  3. Начинается цикл, который продолжается до тех пор, пока левая граница интервала меньше правой.
  4. Вычисляется значение переменной m как сумма делителей на 2 от l и r.
  5. Если элемент с индексом m меньше следующего за ним элемента (m + 1), то правая граница интервала уменьшается на 1.
  6. Если элемент с индексом m больше предыдущего элемента (m - 1), то левая граница интервала увеличивается на 1.
  7. Если элемент с индексом m равен элементам с индексами m-1 и m+1, то функция возвращает значение m.
  8. Если после цикла значение переменной l остается меньше значения r, то функция возвращает значение l.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы