【算法设计与分析】03 算法及其时间复杂度

在学习算法的时间复杂度之前,需要了解下面5条概念

  • 什么是算法的时间复杂度? 针对指定基本运算,计数算法所做的运算次数。
  • 什么是基本运算?比较、加法、乘法、置指针、交换…
  • 什么是输入规模?输入串的编码长度,通常是数组元素的多少、调度问题的任务个数、图的顶点数与边数等。
  • 算法的基本运算次数可以表示为输入规模的函数。
  • 给定问题和基本运算,就决定了一个算法类

文章目录

    • 1 算法的两种时间复杂度
      • 1.1 例子:检索问题
        • (1)顺序检索算法
        • (2)改进顺序检索算法
    • 2 总结

1 算法的两种时间复杂度

对于相同输入规模的不同实例,算法的基本运算次数也不一样,所以定义了两种时间复杂度。

  1. 最坏情况下的时间复杂度W(n):算法求解输入规模为n的实例所需要最长的时间
  2. 平均情况下的时间复杂度A(n): 在给定同样规模为n的实例的概率分布下,算法求解这些实例所需要的平均时间。

平均情况下的时间复杂度求解公式为:

A(n)=∑I∈SPItIA(n) = \sum_{I{\in}S} P_It_IA(n)=ISPItI

其中:S为规模为n的实例集,实例I∈SI\in SIS的概率为PI .算法对实例I执行的基本运算次数为:tI

在某些情况下,可以假定每个输入实例的概率相等。

1.1 例子:检索问题

  • 输入:非降序排列的数组L,元素个数n,需要检索的数x。
  • 输出:j。如果x在数组L中,j是x首次出现的下标。否则j=0.
  • 基本运算:x与L中的元素比较。

(1)顺序检索算法

j=1, 将x与L[j]比较. 如果 x=L[j],则算法停止,输出 j;如果不等,则把 j 加1,继续x与L[j]的比较,如果 j>n,则停机并输出0。

实例:1 2 3 4 5
x=4,需要比较4次
x=2.5 ,需要比较5次

  1. 最坏情况时间复杂度

不同的输入有:2n+1个,分别对应:
在这里插入图片描述

  • 最坏情况下时间:W(n)=n;
  • 最坏的输入:x不在L中,或者x=L[n](还没有接触到数据结构中的数组,下表不是从0开始的,是从1开始的)。此时要做n次比较。
  1. 平均情况的时间估计

输入实例的概率分布:假设x在L中的概率是P,且每个位置的概率相等。则由上文的公式得:

A(n)=∑i=1nipn+(1−p)n=p(n+1)2+(1−p)nA(n) = \sum_{i=1}^n i\frac{p}{n} + (1-p)n = \frac{p(n+1)}{2}+(1-p)nA(n)=i=1ninp+(1p)n=2p(n+1)+(1p)n

当p=1/2时,A(n)=n+14+n2≈3n4A(n)=\frac{n+1}{4}+\frac{n}{2} \approx \frac{3n}{4}A(n)=4n+1+2n43n

注意:上述求解公式中,注意理解(1-p)n 代表如果元素不存在数组中,比较的次数是从头到尾。即n次,不存在的概率是1-p。

(2)改进顺序检索算法

j=1, 将 x与L[j]比较. 如果 x=L[j],则算法停止,输出 j;如果 x >L[j],则把 j 加1,继续 x与 L[j]的比较;如果 x < L[j],则停机并输出0. 如果 j >n,则停机并输出 0。

之所以可以优化成这样是因为该算法的输入是:非降序排列的数组

实例:1 2 3 4 5
x = 4,需要比较 4 次
x = 2.5,需要比较 3 次

  1. 最坏情况时间复杂度:W(n) = n
  2. 平均情况时间复杂度

输入实例的概率分布:假设x在数组L中的每个位置与空隙的概率都相等。设在数组中的概率是p,不在数组L中的概率是1-p。则pn=1−pn+1\frac{p}{n}=\frac{1-p}{n+1}np=n+11p

则由公式,计算平均时间复杂度为:

A(n)=∑i=1nipn+1−pn+1n=∑i=1nipn+pnnA(n) = \sum_{i=1}^n i\frac{p}{n} + \frac{1-p}{n+1}n =\sum_{i=1}^n i\frac{p}{n} + \frac{p}{n}n A(n)=i=1ninp+n+11pn=i=1ninp+npn
=p(1+n)2+p=\frac{p(1+n)}{2}+p=2p(1+n)+p

当p=1/2时:

A(n)=n4+34≈n4A(n)=\frac{n}{4}+\frac{3}{4} \approx \frac{n}{4}A(n)=4n+434n

很明显,改进后的检索算法,时间复杂度减小了很多。算法的性能有所提升。

2 总结

  • 本文的学习并不是来学习检索这个算法也不是来提升它的性能。
  • 而是根据检索算法这个例子,来学习时间复杂度的定义,学会计算时间复杂度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/422713.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用单片机测量流体流速的_影响超声波流量计(热量表)测量精度的主要因素

1、上下游直管段的影响由于时差式超声波流量计标定系数K值是雷诺数函数&#xff0c;所以当流体从层流过渡到紊流时&#xff0c;其流速分布不均匀&#xff0c;标定系数K值将产生较大的变化&#xff0c;从而影响测量准确度。根据设计要求换能器应安装在上游直管段为10倍管径、下游…

c语言头文件和源文件_C语言头文件防卫式声明

C语言一般提供三种预处理功能&#xff1a;宏处理、文件包含、条件编译。头文件防卫式申明中会用到条件编译中 #ifndef、#define、#endif 的用法。所以&#xff0c;首先价绍下条件编译。1 条件编译一般情况下&#xff0c;在生成可执行文件的过程中&#xff0c;源程序文件中的所有…

Firebug控制台详解

作者&#xff1a; 阮一峰 日期&#xff1a; 2011年3月26日 Firebug是网页开发的利器&#xff0c;能够极大地提升工作效率。 但是&#xff0c;它不太容易上手。我曾经翻译过一篇《Firebug入门指南》&#xff0c;介绍了一些基本用法。今天&#xff0c;继续介绍它的高级用法。 Fi…

标签 href 怎么拼接_【微信】用户-标签的兴趣建模

这一篇分享的是CIKM2020微信的learning to build user-tag profile&#xff0c;主要介绍了微信看一看&#xff08;"Top Stories"&#xff09;中&#xff0c;如何进行用户-标签的兴趣建模&#xff0c;提升推荐效果。1、背景看一下微信看一看场景下的推荐流程&#xff…

【算法设计与分析】05 有关函数的渐进的界的定理

上一篇文章学习了函数的渐近的界定义&#xff0c;本篇文章继续学习函数渐近的界定理。这些定理的证明&#xff0c;用到了函数渐近的界的定义。点击查看上一篇文章&#xff1a;【算法设计与分析】04 函数的渐进的界 文章目录1. 定理11.1 证明定理11.2 估计函数的阶1.3 一些重要的…

一般窗体的设计方式

一般窗体的设计方式&#xff1a; 包含有&#xff08;搜索框、数据列表框、分页框&#xff09;、由搜索返回的数据列表中是否包含“当前页码”、“页数量”的名称来决定显示分页功能。 如果你的搜索框经常性出现大于10个字段的搜索的话&#xff0c;那么应该采用HashTable的参数传…

hive 如何将数组转成字符串_教你如何将Power Logic的原理图转成Orcad的原理图

1、使用Power Logic软件打开pads的原理图(此处使用的是PADS9.5版本的)&#xff1b;2、执行菜单命令&#xff1a;File->Export->在弹出的对话框中点击“保存”按钮&#xff0c;然后选择“Select All”&#xff0c;并选择PADS Logic2005的版本输出&#xff0c;最后点击“OK…

【算法设计与分析】06 几类重要的函数

本篇文章中会用到上一篇文章的定理&#xff1a;【算法设计与分析】05 有关函数的渐进的界的定理 主要学习常见的一些函数的阶 1. 基本函数类 以下按阶的高低排序&#xff1a; 至少指数级&#xff1a; 2n, 3n, n!, …多项式级&#xff1a; n, n2, nlogn, n1/2, …对数多项式级…

【算法设计与分析】07 算法的数学基础

接下来的几篇文章将是学习算法的数学基础内容。 具体的文章包括&#xff08;持续更新&#xff09;&#xff1a;

【算法设计与分析】08 序列求和的方法

本篇文章学习数列求和的一些方法。这些方法对后面学习算法的时间复杂度非常有帮助。 文章目录1. 数列求和公式1.1 二分搜索的时间复杂度求解2 估计和式上届的放大法3 估计和式渐近的界4 总结1. 数列求和公式 下面这几个数列求和公式都是高中学过的公式。 等差、等比数列和调和…

【算法设计与分析】10 差消法化简高阶递推方程

上一篇文章使用递推方程的方法求解了插入排序和二分归并的时间复杂度&#xff0c;本文来求解快速排序的时间复杂度&#xff0c;同样是利用了递推方程法&#xff0c;但是求解该递推方程的方法与以前不一样&#xff1a;差消法 文章目录1. 快速排序的时间复杂度求解2. 总结1. 快速…

python xpath定位打印元素_python基础教程:8种selenium元素定位的实现

前言selenium是一个非常厉害的爬虫利器,不,简直是神器了,它可以自动的控制浏览器,但是你得告诉浏览器,你想干嘛,爬哪里,这时候就要用到元素定位了,在HTML中都有着不同的标签和属性,selenium根据它们来确定你的意图,每个方式都对应两个方法8种方式1.通过 id 定位2.通过 name 定位…

【算法设计与分析】11 递归树

当前面所学习的迭代法、差消法等不太好解决的问题&#xff0c;可以使用递归树&#xff0c;来很方便的解决。 文章目录1. 递归树的概念1.1 迭代在递归树中的表示2. 递归树的生成规则2.1 递归树生成实例2.2 递归树应用实例3. 总结1. 递归树的概念 递归树是迭代计算的模型递归树的…

【算法设计与分析】12 主定理及其应用

主定理是一个非常有用的定理&#xff0c;前面我们学习的所有知识都可以用主定理来求解&#xff0c;而不必要使用复杂的计算方法来求解 文章目录1. 主定理1.1 主定理的应用背景1.2 主定理内容2. 主定理的应用2.1 求解递推方程 例12.2 求解递推方程 例22.3 求解递推方程 例33. 总…

迪普交换机清空配置_交换机环路详解

“ The more you know the more you know you dont know”背景近期在交换机配置中发生了一次接线错误导致交换机环路&#xff0c;从而引发广播风暴的一个例子。所以特意花时间了解一下交换机产生广播风暴的原理&#xff0c;并整理了此篇文章&#xff0c;一来可以梳理自己的知识…

前端学习(342):进制只能介于2-36之间Uncaught RangeError: toString() radix argumen

The error is: Uncaught RangeError: toString() radix argument must be between 2 and 36 Just trying to format the date 只能介于2-36之间

1400协议是什么和28181区别_1400张拆解案例,够你PPT拆解学习好几遍了!

本文作者&#xff1a;执生若梦简介&#xff1a;「拆P教室」小伙伴、个人公众号「君梦幻灯」指导&#xff1a;优卡优卡大大前段时间开启了一个新栏目&#xff0c;图解计划。拆解一张图片&#xff0c;向其中学习PPT制作技巧。我一直在收集音乐banner图&#xff0c;现在已经达到了…

【算法设计与分析】13 分治策略的设计思想

算法中很多方法都是可以采用分治策略进行设计与优化&#xff0c;那么什么是分治策略&#xff1f;如何使用分治策略进行算法的设计与分析&#xff1f; 文章目录1. 分治策略的基本思想1.1 二分检索的设计思想1.2 二分归并排序的设计思想1.3 Hanoi塔的递归算法2 小结1. 分治策略的…

字段 新增hive_Hive分区表 | 每日五分钟学大数据

数据分区的一般概念存在已久。其可以有多种形式&#xff0c;但是通常使用分区来水平分散压力&#xff0c;将数据从物理上转移到和使用最频繁的用户更近的地方&#xff0c;以及实现其他目的。Hive中有分区表的概念。我们可以看到分区表具有重要的性能优势&#xff0c;而且分区表…