P 数据结构 | 算法与数据结构



一、算法


1.1 算法

算法是独立存在的一种解决问题的方法思想
算法可以用不同的语言进行描述实现

eg:

C++描述、Python描述

1.1.1 算法的五大特性

算法的五大特性 描述
输入 算法有0个或多个输入
输出 算法至少有一个输出
有穷性 算法在有限步骤之后会自动结束而不会无限循环,并且每一个步骤可以在可接受的时间内完成
确定性 算法的每一步都有确定的含义,不会出现二义性
可行性 算法的每一步都是可行的,也就是说算法的每一步能够执行有限的次数完成

具有算法的五大特性的思路就可以称为算法


1.2 算法的时间效率

eg(算法的时间效率的引入):

a+b+c = 1000
a**2+b**2 = c**2

求出a,b,c可能的组合

  • 单靠运行的时间来比较算法的优劣并不一定是客观准确的
    运行时间 = 基本运算总数*基本运算的单位时间= 时间单位*单位时间

提示:

  • 时间单位对应基本操作数
  • 基本单位的运行时间即单位时间离不开计算机环境(软件系统和硬件系统)
  • 评价算法时需要忽略机器的环境而客观反映算法的时间效率即只考虑时间单位
  • 考虑到实际价值,时间单位只看量级,不看常量因子
    示例:基于数学的函数曲线,第一象限中不管常量因子如何,n^3始终大于n^2

1.3 算法的复杂度

算法的时间复杂度 T(n)和空间复杂度 S(n)统称为算法的复杂度

1.3.1 时间复杂度

T(n),n称为问题规模

  • T(n) = a * n^m 近似于 O(n^m)(大O记法)
    所以以后提到时间复杂度,都是T(n)中最特征的部分O(n^m),而不是整个T(n)
时间复杂度 描述
最优时间复杂度
基本不用
算法完成工作最少需要多少基本操作

1. 反映的是最乐观最理想的情况,价值不大,
最坏时间复杂度
常用
算法完成工作最多需要多少基本操作

1. 提供一种保证,表明算法在此种程度的基本操作中一定能够完成工作
平均时间复杂度 算法完成工作平均需要多少基本操作

1.对算法一个全面的评价,但衡量没有保证,不是每个计算都能够在基本操作中完成,也会因为算法的实例分布可能并不均匀而难以计算
  • 因此我们最关注的是算法的最坏情况,即最坏时间复杂度,是算法的保证

1. 时间复杂度的基本计算规则

基本计算规则 描述
基本操作 即只有几个常数项,O(1)
顺序结构 时间复杂度按加法计算
循环结构 时间复杂度按乘法计算
分支结构 时间复杂度最大值

eg:

由于程序执行if-elif-else时,只会选择基本的三个分支的一个去执行,所以选取三个分支的时间复杂度的最大值即可
  • 判断一个算法的效率时,往往只看操作数量的最高次项,其他次要项和常数项可以忽略
  • 没有特殊说明,算法的时间复杂度就是最坏时间复杂度

2. 常见的时间复杂度

执行次数函数示例 非正式语
12 O(1) 常数阶
5log_2n+12 O(logn) 对数阶
2n+12 O(n) 线性阶
2n+5nlogn+12 O(nlogn) nlogn
3n^2+2n+12 O(n^2) 平方阶
6n^3+3n^2+2n+12 O(n^3) 立方阶
2^n O(2^n) 指数阶
n! O(n!) 阶乘阶
n^n O(n^n)
  • 从上往下,时间复杂度越来越大

提示:

  • log_2n 简写为 logn

3. Python内置类型性能分析

(1) timeit模块

用来测试一小段python代码的执行速度

import timeit


timeit.Timer(stmt='pass', setup='pass')
# timeit()会重新开辟空间运行,即使用时需要导入含被测函数的包
avg_res = timeit.Timer.timeit(number=1000000)
参数 说明
Timer 测试小段代码执行速度的类
stmt 要测试的代码语句(statment)
setup 运行代码时需要的设置
timer Timer()中其他参数

1. 定时器函数,与平台有关
timeit() Timer类中测试语句的执行速度的对象方法
number 测试代码时的测试次数,默认一百万次
avg_res 执行代码的平均耗时

1. 数据类型:float类型

2. 单位:秒
  • 启动文件
    当.py自启动时,其模块名应该是__main__
    当其他.py调用某.py时,调用的模块名应该是该.py的文件名
(2) 应用

eg:

列表:
内置操作的时间复杂度

定义列表的方式:
my_list = []

  1. my_list.append()my_list.insert()
  2. [] + []
  3. [x for x in range(10000)]
  4. list(range(10000))
import timeit


def test_001():
    my_list = []
    for i in range(10000):
        my_list.append(i)


def test_002():
    my_list = []
    for i in range(10000):
        my_list = my_list + [i]


def test_003():
    my_list = [x for x in range(10000)]


def test_004():
    my_list = list(range(10000))


def test_005():
    my_list = []
    for i in range(10000):
        my_list.insert(0,i)


timer1 = timeit.Timer('test_001()', setup='from __main__ import test_001')
timer2 = timeit.Timer('test_002()', setup='from __main__ import test_002')
timer3 = timeit.Timer('test_003()', setup='from __main__ import test_003')
timer4 = timeit.Timer('test_004()', setup='from __main__ import test_004')
timer5 = timeit.Timer('test_005()', setup='from __main__ import test_005')
res1 = timer1.timeit(number=100)
res2 = timer2.timeit(number=100)
res3 = timer3.timeit(number=100)
res4 = timer4.timeit(number=100)
res5 = timer5.timeit(number=100)

print("append():%.4f" % res1)
print("[] + []:%.4f" % res2)
print("[x for]:%.4f" % res3)
print("list():%.4f" % res4)
print("insert():%.4f" % res5)

结果:

append():0.1225
[] + []:23.1820
[x for]:0.0504
list():0.0303
insert():3.0051

[]+[]> insert() > append() > [x for] > list()

字典:
内置操作的时间复杂度


1.3.2 空间复杂度

S(n)

  • 定义为该算法消耗的存储空间,它是问题规模n的函数
  • 是对一个算法在运行过程中临时占用存储空间大小的量度

二、数据结构

2.1 数据结构

重要概念 描述
数据 它是一个抽象的概念,将其进行分类后得到程序设计语言中的基本数据类型(只保存一个数据)
结构 就是各数据元素之间存在的特定关系
数据结构 指数据对象中数据元素之间的关系

Python的内置数据结构:不需要我们去定义的数据结构,如:列表、元组、字典等

Python的扩展数据结构:需要自定义实现这些数据的组织方式,如栈、队列等
  • 不同的数据结构,数据存储方式不同,就会造成算法的时间复杂度不同

三、算法与数据结构的区别

名称 描述
数据结构 数据结构只是静态地描述了数据元素之间的关系

数据结构是算法需要处理的问题载体
算法 为了解决实际问题而设计的
程序 高效地程序需要在数据结构的基础上设计和选择算法
  • 程序 = 数据结构 + 算法

3.1 抽象数据类型

ADT (Abstract Data Type)
指一个数学模型以及定义在数学模型上的一组操作
即把数学类型和数学类型上的运算捆绑在一起进行封装

常用数据运算 描述
插入
删除
修改
查找
排序

更新中......


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,172评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,346评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,788评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,299评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,409评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,467评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,476评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,262评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,699评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,994评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,167评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,827评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,499评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,149评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,387评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,028评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,055评论 2 352

推荐阅读更多精彩内容