算法与数据结构

数据结构

对计算机内存中的数据的一种安排。

算法

对结构中的数据进行各种处理

应用方面

  1. 现实世界的数据存储
  2. 作为程序员的工具
  3. 关于现实世界的建模
数据结构优点缺点
数组插入快(知道下标)

查找慢,删除慢,大小固定

有序数组比无序的数组查找快删除和 插入慢,大小固定
提供后进先出的存取方法

存取其他项很慢

队列提供先进先出的存取方法

存取其他项很慢

链表插入快 删除快

查找慢

二叉树查找 删除 插入都快(树平衡的情况下)删除算法复杂
红黑树(平衡树)插入 查找 删除 都快算法复杂
2-3-4树(平衡树)插入 查找 删除 都快算法复杂
哈希表插入快,通过关键字存取快删除慢
插入、删除快,对最大数据项的存取很快对其他项的存取慢
对现实世界建模有些算法慢并且复杂

 

 

 

 

 

 

 

 

 

 

 

 

 

 

算法效率的度量方法

  1. 算法采用的策略,方案。
  2. 编译产生的代码质量
  3. 问题的输入规模
  4. 机器执行指令的速度
  • 研究算法的复杂度,侧重的是研究算法随着输入规模扩大增长量的一个抽象,而不是精确地定位需要执行多少次。
  • 我们不关心编写程序所用的语言是什么,也不关心这些程序将跑在什么样的计算机上,我们只关心它所实现的算法。
  • 不计那些循环索引的递增和循环终止条件、变量声明、打印结果等操作。最终,在分析程序的运行时间时,最重要的是把程序看成是独立于设计语言的算法或一系列的步骤。
  • 在分析一个算法的运行时间时,重要的是把基本操作的数量和输入模式关联起来。

函数的渐进增长

判断以下两个算法A和算法B哪个更好?

假设两个算法的输入规模都是n,算法A要做2n+3次操作,算法B要做3n+1次操作,哪个更好?

规模算法A1(2n+3)算法A2(2n)算法B1(3n+1)算法B2(3n)
n=15243
n=2747

 

 

 

n=396109
n=1023203130
n=100203200301300

当n=1时,算法A1效率不如算法B1,当n=2时,两者效率相同;当n>2时,A1算法优于B1算法,随着n的继续增加,算法A!比算法B1逐步拉开差距。所以总体上算法A1比算法B1优秀。

函数的渐进增长:给定两个函数f(n)和g(n),如果存在一个整数N,使得对所有的n>N,f(n)总是比g(n)大,那么我们说f(n)的增长渐进快于g(n)。

最高

判断一个算法的效率时,函数中的常数和其他次要项常常可以忽略,而更应该关注主项(最高项)的阶数。

算法时间复杂度:

算法时间复杂度的定义:在进行算法分析时,语 句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。  算法的时间复杂度,也就是算法的时间量度 记作: T(n)= 0(f(n))。它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐近时间复杂度,简称为时间复杂度。其中f(n)是问题规模n的某个函数。

这样用大写O()来体现算法时间复杂度的记法,我们称之为大0记法。一般情况下,随着输入规模n的增大,T(n)增长
最慢的算法为最优算法。

推导大O阶方法
那么如何分析一个算法的时间复杂度呢?即如何推导大O阶呢?我们给大家整理了以下攻略:

一用常数1取代运行时间中的所有加法常数。
一在修改后的运行次数函数中,只保留最高阶项。

—如果最高阶项存在且不是1,则去除与这个项相乘
的常数。
一得到的最后结果就是大O阶。

线性阶

一般含有非嵌套循环涉及线性阶,线性阶就是随着问题规模n的扩大,对应计算次数呈直线增长。

常见的时间复杂度

例子时间复杂度 
52634O(1)常数阶
3n+4O(n)

线性阶

3n^2+4n+5O(n^2)

平方阶

3log(2)n+4O(logn)对数阶
2n+3nlog(2)n+14O(nlogn)nlogn阶
n^3+2n^2+4n+6O(n^3)立方阶
2^nO(2^n)指数阶

常用的时间复杂度所耗费的时间从小到大依次是: O(1)<O(logn) < O(n) < O(nlogn) <O(n^2) < O(n^3) < O(2^n) < O(n! ) <O(n^n)

最坏情况与平均情况

  • 平均运行时间是期望的运行时间。
  • 最坏运行时间是一种保证。在应用中,这是一种最重要的需求,通常除非特别指定,我们提到的运行时间都是最坏情况的运行时间。

算法的空间复杂度

算法的空间复杂度通过计算算法所需的存储空间实现,算法的空间复杂度的计算公式记作:S(n)=O(f(n)),其中,n为问题的规模,f(n) 为语句关于n所占存储空间的函数。
通常,我们都是用  时间复杂度”来指运行时间的需求,是用“空间复杂度”指空间需求。
当直接要让我们求“复杂度”时,通常指的是时间复杂度。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值