鱼C论坛

 找回密码
 立即注册
查看: 410|回复: 1

[知识点备忘] 第003讲:算法的时间复杂度

[复制链接]
发表于 2023-10-9 04:37:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
第003讲:算法的时间复杂度


知识点回顾:

0. 本节视频




1. 算法效率的度量

通常度量一个算法的执行效率,有两种方法,一种是事前分析法,一种事后分析法。

后者很好理解,正所谓真金不怕火炼,事实胜于雄辩。直接让程序跑起来,然后对它进行计时,算法好坏咱们拿测试结果说话。

但事后分析法是不是适合算法效率的度量呢?

答案是不合适的!

算法的执行效率受到硬件性能、编程语言选择和输入数据的显著影响:

  • 高性能的计算机能够迅速处理同一算法,而性能较差的机器则可能需要更长时间
  • 使用接近底层的编程语言如 C 或汇编实现的算法,通常比使用高级语言如 Python 或 JavaScript 实现的算法执行更快
  • 算法的性能取决于输入数据的大小和特性,不同的输入对结果影响至关重要


2. 什么是时间复杂度呢?

算法的时间复杂度,是衡量算法执行时间如何随输入数据规模的增长而变化的一种度量方式。

它表达了算法执行时间的大致趋势,而不是精确的执行时间。

时间复杂度通常用大 O 符号表示,称为大 O 记法。


3. 实例演示如何计算时间复杂度

代码一:

  1. #include <stdio.h>
  2. #include <string.h>

  3. void printFirstCharacter(char* str) {
  4.     printf("%c", str[0]);
  5. }

  6. int main() {
  7.     char str[] = "FishC";
  8.     printFirstCharacter(str);
  9.     return 0;
  10. }
复制代码

游客,如果您要查看本帖隐藏内容请回复

代码二:

  1. #include <stdio.h>

  2. void printLastCharacter(char* str) {
  3.     int i = 0;
  4.     while (str[i] != '\0') {
  5.         i++;
  6.     }
  7.     printf("%c", str[i - 1]);
  8. }

  9. int main() {
  10.     char str[] = "FishC";
  11.     printLastCharacter(str);
  12.     return 0;
  13. }
复制代码

游客,如果您要查看本帖隐藏内容请回复

代码三:

  1. #include <stdio.h>

  2. // 使用迭代的方式进行二分查找
  3. int binarySearch(int arr[], int left, int right, int x)
  4. {
  5.     while (left <= right) {
  6.         int mid = left + (right - left) / 2;

  7.         // 检查x是否在中点
  8.         if (arr[mid] == x)
  9.             return mid;

  10.         // 如果x大于中点,忽略左半部分
  11.         if (arr[mid] < x)
  12.             left = mid + 1;

  13.         // 如果x小于中点,忽略右半部分
  14.         else
  15.             right = mid - 1;
  16.     }

  17.     // 在数组中不存在x
  18.     return -1;
  19. }

  20. int main(void)
  21. {
  22.     int arr[] = {2, 3, 4, 10, 40, 55, 77, 88, 99};
  23.     int n = sizeof(arr) / sizeof(arr[0]);
  24.     int x = 10;
  25.     int result = binarySearch(arr, 0, n - 1, x);
  26.     (result == -1) ? printf("数组中不存在该元素\n")
  27.                    : printf("元素在数组中的索引为 %d\n", result);
  28.     return 0;
  29. }
复制代码

游客,如果您要查看本帖隐藏内容请回复

代码四:

  1. #include <stdio.h>

  2. int main() {
  3.     int n = 100;
  4.     int x = 1;

  5.     while (x < n) {
  6.         x = x * 3;
  7.     }

  8.     return 0;
  9. }
复制代码

游客,如果您要查看本帖隐藏内容请回复

代码五:

  1. #include <stdio.h>

  2. int main() {
  3.     int n = 100;

  4.     for(int i = 1; i <= n; i++) {
  5.         int x = 1;
  6.         while (x < i) {
  7.             x = x * 2;
  8.         }
  9.     }
  10.     return 0;
  11. }
复制代码

游客,如果您要查看本帖隐藏内容请回复

代码六:

  1. #include <stdio.h>

  2. int main() {
  3.     int n = 100;

  4.     for(int i = 0; i < n; i++) {
  5.         for(int j = 0; j < n; j++) {
  6.             printf("i: %d, j: %d\n", i, j);
  7.         }
  8.     }

  9.     return 0;
  10. }
复制代码

游客,如果您要查看本帖隐藏内容请回复

代码七:

  1. #include <stdio.h>

  2. // 冒泡排序函数
  3. void bubbleSort(int arr[], int n) {
  4.     // 外层循环,遍历每一个元素
  5.     for(int i = 0; i < n-1; i++) {     
  6.         // 内层循环,从第一个元素开始,比较相邻的两个元素
  7.         for (int j = 0; j < n-i-1; j++) {
  8.             // 如果前一个元素大于后一个元素,则交换他们
  9.             if (arr[j] > arr[j+1]) {
  10.                 int temp = arr[j];
  11.                 arr[j] = arr[j+1];
  12.                 arr[j+1] = temp;
  13.             }
  14.         }
  15.     }
  16. }

  17. // 打印数组的函数
  18. void printArray(int arr[], int size) {
  19.     for (int i = 0; i < size; i++)
  20.         printf("%d ", arr[i]);
  21.     printf("\n");
  22. }

  23. int main() {
  24.     int arr[] = {64, 34, 25, 12, 22, 11, 90};
  25.     int n = sizeof(arr)/sizeof(arr[0]);

  26.     bubbleSort(arr, n);
  27.     printf("排序后的数组: \n");
  28.     printArray(arr, n);

  29.     return 0;
  30. }
复制代码

游客,如果您要查看本帖隐藏内容请回复


4. 思维导图

03 - 算法效率的度量.png


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-10-14 16:27:05 | 显示全部楼层
度量一个算法的执行效率可以用事前分析法或事后分析法。事后分析法就是执行一遍程序,用事实说话,其虽然简单,结果却会因机器性能、编程语言、输入数据的不同而出现较大差异,故算法效率的度量通常采用事前分析法,即在不执行程序的情况下分析出算法的效率。为此引出“时间复杂度”的重要概念,以衡量算法执行时间如何随输入数据规模的增长而变化,表达算法执行时间的大致趋势。时间复杂度通常用大O符号表示,称为大O记法。视频以几个较为典型的算法为例,分析了这些算法的时间复杂度。从中可以看出,计算时间复杂度并不需要求出精确的结果,只需要求出算法大致的数据规模,且通常只关注“大格局”,也即程序最耗时(随问题规模n增长最快,幂次最高)的部分。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-1 06:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表