3.时间复杂度 + 空间复杂度

什么是好的算法?
1.满足正确性健壮性
2.根据算法编写出来的程序要有较高的效率,效率可以从 2 个方面衡量,即程序的运行时间 和 程序运行所需内存空间的大小。

程序的运行时间——时间复杂度
看一个算法所编程序运行时间的多少,用的并不是准确值,几秒或者几分什么的,而是用程序中语句总的执行次数间接表示程序的运行时间,而这个次数也不是精确到具体的几次,重在数量级。格式为:O(量级),常见复杂度大小为:O(1) < O(log2n) < O(n) < O(nlog2n) < O(n2) < O(n3) < O(2n) < O(n!) < O(nn) 。举个例子,分析一下 1+2+3+4 … +n =? 两种算法的时间复杂度

#include<stdio.h>

int main() {

	//算法一:先算1+2=3,然后算3+3=6,然后继续...
	int sum_1=0;                        //执行 1 次
	for (int i = 1; i <= n; i++) {      //执行 n+1 次
		sum_1 = sum_1 + i;              //执行 n 次
		printf("%d\n", sum_1);          //执行 n 次
	}
	// 一共执行 3n+2 次,重在量级,所以时间复杂性的量级为 O(n)

   //算法二:等差数列求和公式:Sn=n (a1+an)/2 
	int sum_2 = 100000 * (1 + 100000) / 2;   //执行 1 次
	printf("%d\n",sum_2);                    //执行 1 次 
   // 一共执行 2 次,重在量级,所以时间复杂性的量级为 O(1)
   
}

所以,明显算法二的时间复杂度小,首选算法二。

程序运行所需内存空间——空间复杂度
这个相对于时间复杂度而言,并不是太重要,了解一下。具体了解可以看 时间复杂度和空间复杂度(详解版)
格式为:S(n) = O(f(n)),其中n为问题的规模大小。

练习题

  1. 下面程序段的时间复杂性的量级为(D)
    for (i=1; i<=n; i++)
    for (j=1; j<=i; j++)
    for (k=1; k<=j; k++)
    x=x+1;
    A.O(1)        B.O(n)        C.O(n2)         D.O(n3)

  2. 下面程序段的时间复杂性的量级为(C)
    for (int i=0; i<m; i++)
    for (int j=1; j<=n; j++)
    a[i][j]=i*j;
    A.O(m3)        B.O(n2)        C.O(m * n)         D.O(m+n)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,您的问题我已经记录下来了。下面是关于c语言序列比对的编辑距离问题的详细解答。 一、问题描述 给定两个字符串s1和s2,计算将s1转换成s2所需要的最少操作次数。可以进行以下三种操作: 1. 插入一个字符 2. 删除一个字符 3. 替换一个字符 二、数学模型 为了计算s1和s2的编辑距离,我们需要定义一个二维数组dp,其中dp[i][j]表示将s1的前i个字符转换为s2的前j个字符所需的最少操作次数。那么dp[i][j]与dp[i-1][j]、dp[i][j-1]、dp[i-1][j-1]的关系如下: 1. 当s1[i]等于s2[j]时,dp[i][j] = dp[i-1][j-1],即不需要进行任何操作; 2. 当s1[i]不等于s2[j]时,dp[i][j]可以由dp[i-1][j]、dp[i][j-1]、dp[i-1][j-1]三者中的最小值加1得到。其中,dp[i-1][j]表示删除s1[i],dp[i][j-1]表示在s1[i]后面插入一个字符,dp[i-1][j-1]表示将s1[i]替换为s2[j]。 三、优化函数及标记函数设置 在计算dp[i][j]时,我们可以把dp[i-1][j-1]、dp[i-1][j]、dp[i][j-1]三个值都计算出来,然后取其中的最小值加1即可。这样可以避免重复计算,提高计算效率。 四、编码实现 1. 变量设置及存储 在实现过程中,我们可以使用一个二维数组dp来存储计算结果,用两个指针i和j来表示字符串s1和s2的位置。 2. 代码实现(关键代码) 下面是c语言的代码实现: ```c int minDistance(char* word1, char* word2) { int m = strlen(word1), n = strlen(word2); int dp[m+1][n+1]; memset(dp, 0, sizeof(dp)); for(int i=0; i<=m; i++) dp[i][0] = i; for(int j=0; j<=n; j++) dp[0][j] = j; for(int i=1; i<=m; i++) { for(int j=1; j<=n; j++) { if(word1[i-1] == word2[j-1]) dp[i][j] = dp[i-1][j-1]; else { dp[i][j] = min(dp[i-1][j], dp[i][j-1]); dp[i][j] = min(dp[i][j], dp[i-1][j-1]); dp[i][j] += 1; } } } return dp[m][n]; } ``` 五、复杂度分析 1. 时间复杂度 由于需要对两个字符串进行比较,所以时间复杂度为O(mn),其中m和n分别为两个字符串的长度。 2. 空间复杂度 由于需要使用一个二维数组dp来存储计算结果,所以空间复杂度为O(mn)。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

头疼小宇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值