数据结构和算法分析python数据结构

0.基本概念 算法的代价及度量!!!

2019-04-11  本文已影响0人  那是个好男孩

先看思维导图

思维导图
零.四个基本概念

一.算法的5大性质

二.算法的描述(最常用的两种)

三.算法的设计模式

四.算法的代价及度量

首先明确,对于算法的研究,人们主要关注算法的最坏情况代价

1. 时间代价(时间复杂度)

举个栗子:对于同一个问题,算法A要做 2n+3 次操作、算法B要做 3n+1 次操作、算法c要做 2n^2+1 次操作,哪个算法好???

答:很明显随着n的增长(N趋近于无穷大),总体来说 A<B<C

(要知道对于不同阶的表达式(比如 线性阶3n+10 平方阶2n^2 2n^2+3n+1) 随着n的增长(趋近于无穷大),第二种算法趋近于第三种算法,而第1种算法远小于其余两种算法)

(因而得出结论 对于不同阶的表达式的比较 算法执行次数表达式的常数项和与最高次数相乘的常数乃至于次要项都不能起决定作用)

第一步:用常数1取代运行时间中的所有加法常数

第二步:再修改后的运算次数函数中,只保留最高阶项

第三步:如果最高阶项存在且不是1,则去除与这个项相乘的常数

行次数函数举例 非正式术语
左对齐 中间对齐 右对齐
12 O(1) 常数阶
2n+3 O(n) 线性阶
3n2+2n+1 O(n2) 平方阶
5log2n+20 O(logn) 对数阶
2n+3nlog2n+19 O(nlogn) nlogn阶
6n3+2n2+3n+4 O(n3) 立方阶
2n O(2n) 指数阶

注意,经常将log<sub>2</sub>n(以2为底的对数)简写成logn!!

所消耗的时间从小到大

O(1) < O(logn) < O(n) < O(nlogn) < O(n2) < O(n3) < O(2n) < O(n!) < O(nn)

我们举个栗子,推导下对数阶

count = 1
while count < n:
    count = count * 2 # 这行代码时间复杂度为O(1)</pre>

问:上述代码的时间复杂度为多少?

答:由于每次count*2后就会更接近于n,所以我们就要算 有多少个2相乘后大于n,使其退出循环。由2^x = n得到 x = logn.这个循环的时间复杂度为O(logn)

2. 空间代价(空间复杂度)

时间复杂度指运行时间的需求,空间复杂度指空间需求。现目前,不必考虑。所以不准备怎么了解,先放放。


五.数据结构及分类

1. 组成

数据结构:是相互之间存在一种或者多种特定关系的数据元素的集合.由逻辑结构和物理结构.

2. 逻辑结构

3. 物理结构

内存是CPU可以直接访问的存储设备,与其对应的是外存(磁盘、光盘、磁带等)

内存的基本结构是线性排列的一批存储单元(存储单元具有唯一的编号,称为单元地址或简称地址)。每个单元的大小相同,可以保存一个单位大小的数据.
举个例子:目前常见的64位操作系统,一次可以读取8个单元的数据,现在由一个float64的数据,我们可以得知float64 = 8字节 = 8个单元 = 64位二进制数

当一个对象不再使用的时候,存储管理系统会设法回收其占用的存储,以便于用于存储其它对象

对于一个组合对象,其中包含了一组元素,这些元素被安排到了一组连续的存储单元里,我们现在知道其起始地址位P,每个元素的大小相等为a,那么我们可以得知第K个元素的地址 loc(k) = p + k*a;

还有一种情况,每个元素的大小不相等,那么我们就可以计算这类对象里的各个元素相对于起始地址的相对位置,称为元素的存储偏移量

python语言是引用语义,C语言是值语义。简单来说,有一个值3.1415存储在内存的中,地址为p,那么 a = 3.1415,a变量里保存的是p,同样的我们再把3.1415赋值给b,b变量里保存的同样是p,a和b的同时指向了3.1415这一数据所在的地址,即a和b变量的存储区里保存的都是p。而C语言是吧变量的值直接保存在变量的存储区里。

上一篇 下一篇

猜你喜欢

热点阅读