数据结构考研:大O表示法最浅显易懂且详细深入的解释及与小o表示法的区别(十分钟必懂)

大O表示法的背景

作为软件工程专业的学生,在我们学习数据结构的时候,总是会碰见对各种算法时间复杂度和空间复杂度的大O表示法的描述。我们只是将信将疑的用着,并不知道大O表示法的准确含义,今天博主李同学在查阅各方资料后进行详细地讲解。

大O表示法的定义

根据Big O notation(大O表示法)维基百科的描述:

大O表示法的字母O是函数的增长率,也被称为函数的阶数,即字母O代表Order(阶数)。用大O符号描述函数通常只提供函数增长率的一个上界。
设f是实或复值函数,g是实值函数,它们都定义在实正数的无界子集上,使得g(x)对于所有足够大的x都为正数,那么我们称:当x趋向于无穷大时,f(x)=O(g(x))。
另外,对于所有足够大的x值,f(x)的绝对值最多是g(x)的正常数倍。即f(x) = O(g(x))有且仅有一个实数M和一个实数x0使得:对于所有x≥x0的x,|f(x)|≤Mg·(x)恒成立。

在典型的用法中,O符号是渐近的,也就是说,它指的是非常大的x。因此,可以应用以下简化规则:如果f(x)是几个项的和,如果有一个增长率最大的项,它可以保留,其他项都可以省略。
如果f(x)是几个因子的乘积,任何常数(乘积中不依赖于x的项)都可以省略。
例如,让f(x) = 6x4 - 2x3 + 5,假设我们想要简化这个函数,用大O表示法来描述x趋于无穷时的增长率。这个函数是三项的和:6x4, 2x3和5。在这三项中,增长率最高的是指数最大的x,即6x4。现在我们可以应用第二个规则:6x4是6和x4的乘积,其中第一个因子不依赖于x,省略这个因子就得到了简化形式x4。因此,我们说f(x)是(x4)的Big O。数学上,我们可以写成f(x) = O(x4)可以用形式定义来确认这个计算:令f(x) = 6x4-2x3 + 5, g(x) = x4。应用一个正式定义,f(x) = O(x4)等于它的展开式|f(x)|≤MX4,其中M是一个常数。对于某些合适的x0和M以及所有的x >x0。为了证明这一点,令x0 = 1, M = 13。然后,对于所有的x > x0
在这里插入图片描述
因此,我们说:|6x4-2x3 + 5|≤13x4
而这个表达式用大O表示法,可写成:(6x4-2x3 + 5)=O(x4)

大O表示法与小o表示法的区别

如果你上过高等数学的课程,你一定对小o表示法不陌生,下面是高阶无穷小,也就是小o表示法的定义:

设为an和bn为两个序列的数,而且都是n趋近于无穷时的无穷小量。虽然它们在n趋近于无穷时都趋于零,但趋于零的速度是有区别的。
可以用如下方式比较它们的速度:
若对于任意正实数c>0,存在正整数N,在k>N时,使得ak<c·bk总是成立,则称:当n趋近于无穷时,an=o(bn),即an是bn的高阶无穷小。
在上述定义中,也可以说无穷小量an的阶要比bn的要高,或者说an比bn更快地趋于零,尽管在此时“阶”或者“速度”本身其实都没有明确的定义。

通过上述我对小o表示法的讲解后,我们再看看维基百科中对大O表示法与小o表示法区别的描述:

符号名字描述公式定义
在这里插入图片描述大O表示法f渐近地以g为界在这里插入图片描述
在这里插入图片描述小o表示法f渐近地被g控制公式定义

由这个对比表格,我们可以清楚地知道:
大O表示法f(n)=O(g(n))中的f(n)是g(n)的等阶无穷大或者是同阶无穷大。
小O表示法f(n)=o(g(n))中的f(n)是g(n)的高阶无穷小。

STM32F103C8T6是一款常见的STM32系列单片机PA13PA14是该单片机的两个IO口引脚。在STM32使用这两个引脚进行中断可以通过以下步骤实现: 1. 首先需要使能GPIO的时钟,在代码中添加如下语句: RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); 这样就使能了GPIOA的时钟。 2. 然后需要配置PA13PA14的工作模式。这里我们选择将它们配置为输入模式,代码如下: GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); 这样就将PA13PA14配置成了输入模式,并且不使用上拉或下拉电阻。 3. 接下来需要使能EXTI中断,并将PA13PA14对应的EXTI线路使能,代码如下: EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource13); GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource14); EXTI_InitStructure.EXTI_Line = EXTI_Line13 | EXTI_Line14; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; // 下降沿触发 EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); 4. 最后,在中断服务函数中添加具体的处理代码。例如,如果要在PA13产生中断时向串口输出一段文本,则可以编写如下的中断服务函数: void EXTI15_10_IRQHandler(void) { if (EXTI_GetITStatus(EXTI_Line13) != RESET) { printf("PA13 interrupt occurred!\r\n"); EXTI_ClearITPendingBit(EXTI_Line13); } if (EXTI_GetITStatus(EXTI_Line14) != RESET) { printf("PA14 interrupt occurred!\r\n"); EXTI_ClearITPendingBit(EXTI_Line14); } } 以上就是在STM32F103C8T6上使用PA13PA14引脚进行中断的基本步骤。如果您还有其他问题,请随时提出。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

快乐李同学(李俊德-大连理工大学)

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

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

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

打赏作者

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

抵扣说明:

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

余额充值