【数据结构与算法Python版学习笔记】算法分析
什么是算法分析
- 算法是问题解决的通用的分步的指令的聚合
 - 算法分析主要就是从计算资源的消耗的角度来评判和比较算法。
 
计算资源指标
- 存储空间或内存
 - 执行时间
 
影响算法运行时间的其他因素
- 分为最好、最差和平均情况,平均状况体现主流性能
 
累计求和案例
import time
def sumOFN2(n):
    start=time.time()
    theSum=0
    for i in range(1,n+1):
        theSum+=i
    end=time.time()
    return theSum,end-start
def sumOFN3(n):
    start=time.time()
    theSum=(n*(n+1))/2
    end=time.time()
    return theSum,end-start
if __name__ == "__main__":
    for i in range(5):
        print("sum is %d required %10.7f seconds" % sumOFN2(100000))
    print("--------")
    for i in range(5):
        print("sum is %d required %10.7f seconds" % sumOFN3(100000))
-----------
sum is 5000050000 required  0.1255534 seconds
sum is 5000050000 required  0.1245010 seconds
sum is 5000050000 required  0.1389964 seconds
sum is 5000050000 required  0.1279476 seconds
sum is 5000050000 required  0.1276410 seconds
--------
sum is 5000050000 required  0.0000000 seconds
sum is 5000050000 required  0.0000000 seconds
sum is 5000050000 required  0.0000000 seconds
sum is 5000050000 required  0.0000000 seconds
sum is 5000050000 required  0.0000000 seconds
“大O” 表示法
数量级函数用来描述当规模 n 增加时, T(n)函数中增长最快的部分。
常见大O表示法


变 位 词 检 测
如果一个字符串是另一个字符串的重新排列组合,那么这两个字符串互为变位词。比如, ”heart”与”earth”互为变位词, ”python”与”typhon”也互为变位词。
- 逐字检查法 O(n²)
 - 排序比较法 O(nlogn)
 - 暴力匹配算法 O(n!)
 - 字母计数比较法 O(n)
 
#变位词判断问题
#逐字检查
def anagramSolution(s1,s2):
    alist=list(s2)
    pos1=0
    stillOK=True
    while pos1<len(s1) and stillOK:#循环s1中的每一个字符
        pos2=0
        found=False
        while pos2<len(alist) and not found:
            if s1[pos1]==alist[pos2]:
                found=True
            else:
                pos2=pos2+1
        if found:
            alist[pos2]=None
        else:
            stillOK=False
        pos1=pos1+1
    return stillOK
#print(anagramSolution('abcd','dcba'))
#排序解法
def anagramSolution2(s1,s2):
    alist1=list(s1)
    alist2=list(s2)
    alist1.sort()
    alist2.sort()
    pos=0
    matches=True
    while pos<len(s1) and matches:
        if alist1[pos]==alist2[pos]:
            pos=pos+1
        else:
            matches=False
    return matches
print(anagramSolution2('abcd','dcba'))
#计数器解法
def anagramSolution3(s1,s2):
    c1=[0]*26
    c2=[0]*26
    for i in range(len(s1)):
        pos=ord(s1[i])-ord('a')#把a-z转化为0-25   ps:感谢m0_47550366的提醒,此处错误已改正
        c1[pos]=c1[pos]+1#计数
    for i in range(len(s2)):
        pos = ord(s2[i]) - ord('a')  # 把a-z转化为0-25
        c2[pos] = c2[pos] + 1  # 计数
    j=0
    stillOK=True
    while j<26 and stillOK:
        if c1[j]==c2[j]:
            j=j+1
        else:
            stillOK=False
    return stillOK
print(anagramSolution3('abcd','dcba'))
python数据类型
List 列表
```python
import timeit # 运行时间测量模块
from timeit import Timer
# 循环连接
def test1():
    l=[]
    for i in range(1000):
        l=l+[i]
# append添加
def test2():
    l=[]
    for i in range(1000):
        l.append(i)
# 列表推导式
def test3():
    l=[i for i in range(1000)]
# range转列表
def test4():
    l=list(range(1000))
if __name__ == "__main__":
    t1=Timer("test1()","from __main__ import test1")
    print("concat %f second" % t1.timeit(number=1000)) # number指定程序被执行的次数
    t2=Timer("test2()","from __main__ import test2")
    print("append %f second" % t2.timeit(number=1000)) 
    t3=Timer("test3()","from __main__ import test3")
    print("comprehension %f second" % t3.timeit(number=1000)) 
    t4=Timer("test4()","from __main__ import test4")
    print("list range %f second" % t4.timeit(number=1000))
-------
concat 1.979591 second
append 0.811599 second
comprehension 0.375291 second
list range 0.024658 second
```

dict 字典

【数据结构与算法Python版学习笔记】算法分析的更多相关文章
- 【数据结构与算法Python版学习笔记】引言
		
学习来源 北京大学-数据结构与算法Python版 目标 了解计算机科学.程序设计和问题解决的基本概念 计算机科学是对问题本身.问题的解决.以及问题求解过程中得出的解决方案的研究.面对一 个特定问题,计 ...
 - 【数据结构与算法Python版学习笔记】查找与排序——散列、散列函数、区块链
		
散列 Hasing 前言 如果数据项之间是按照大小排好序的话,就可以利用二分查找来降低算法复杂度. 现在我们进一步来构造一个新的数据结构, 能使得查找算法的复杂度降到O(1), 这种概念称为" ...
 - 【数据结构与算法Python版学习笔记】基本数据结构——列表 List,链表实现
		
无序表链表 定义 一种数据项按照相对位置存放的数据集 抽象数据类型无序列表 UnorderedList 方法 list() 创建一个新的空列表.它不需要参数,而返回一个空列表. add(item) 将 ...
 - 【数据结构与算法Python版学习笔记】目录索引
		
引言 算法分析 基本数据结构 概览 栈 stack 队列 Queue 双端队列 Deque 列表 List,链表实现 递归(Recursion) 定义及应用:分形树.谢尔宾斯基三角.汉诺塔.迷宫 优化 ...
 - 【数据结构与算法Python版学习笔记】递归(Recursion)——定义及应用:分形树、谢尔宾斯基三角、汉诺塔、迷宫
		
定义 递归是一种解决问题的方法,它把一个问题分解为越来越小的子问题,直到问题的规模小到可以被很简单直接解决. 通常为了达到分解问题的效果,递归过程中要引入一个调用自身的函数. 举例 数列求和 def ...
 - 【数据结构与算法Python版学习笔记】图——最短路径问题、最小生成树
		
最短路径问题 概念 可以通过"traceroute"命令来跟踪信息传送的路径: traceroute www.lib.pku.edu.cn 可以将互联网路由器体系表示为一个带权边的 ...
 - 【数据结构与算法Python版学习笔记】图——骑士周游问题 深度优先搜索
		
骑士周游问题 概念 在一个国际象棋棋盘上, 一个棋子"马"(骑士) , 按照"马走日"的规则, 从一个格子出发, 要走遍所有棋盘格恰好一次.把一个这样的走棋序列 ...
 - 【数据结构与算法Python版学习笔记】图——词梯问题 广度优先搜索 BFS
		
词梯Word Ladder问题 要求是相邻两个单词之间差异只能是1个字母,如FOOL变SAGE: FOOL >> POOL >> POLL >> POLE > ...
 - 【数据结构与算法Python版学习笔记】树——利用二叉堆实现优先级队列
		
概念 队列有一个重要的变体,叫作优先级队列. 和队列一样,优先级队列从头部移除元素,不过元素的逻辑顺序是由优先级决定的. 优先级最高的元素在最前,优先级最低的元素在最后. 实现优先级队列的经典方法是使 ...
 
随机推荐
- 手写 lodash/get、lodash/set 方法
			
动机:平时写js代码时经常遇到要使用 lodash 中 _.get 和 _.set 的情况,每次使用都要引用 lodash,总感觉很烦,能不能自己实现一个简单的方法来实现一样的功能呢? get 方法实 ...
 - CSP-J&S 2020挂分记
			
应该是退役记 OI 是一门玄学--考后有感 Day -inf 找各科老师请假备考,看着我倒一倒二的好成绩分纷劝我放弃竞赛,成功请到了假. Day -1 怎么莫名其妙大家都在学些奇怪的东西? 跟风写了一 ...
 - Java关键字-static汇总
			
1.静态变量(被static修饰的成员变量) 1-静态变量 运行时,Java虚拟机只为静态变量分配一次内存(加载类的过程中完成静态变量的内存分配) 类的内部可以在任何方法内直接访问静态变量 其他类中可 ...
 - 如何在win10中Java中JDK的安装和path,classpath的环境配置
			
1,第一步,不用说肯定是去下一个java JDK了.目前最新版本的java JDK应该是JDK 7.0,这个就自己去百度一下了,好多网站都可以找到.2,第二步就是安装JDK虚拟机了,按照它里面的提示一 ...
 - 反转链表middle
			
eg: 输入:head = [1,2,3,4,5], left = 2, right = 4 输出:[1,4,3,2,5]相关解法:图解: /** * Definition for singly-li ...
 - PHP的zlib压缩工具扩展包学习
			
总算到了我们压缩相关扩展的最后一篇文章了,最后我们要学习的也是 Linux 下非常常用的一种压缩格式:.gz 的压缩扩展.作为 PHP 的自带扩展,就像 zip 一样,zlib 扩展是随着 PHP 的 ...
 - 一起搞懂PHP的错误和异常(二)
			
上回文章中我们讲到了错误是编译和语法运行时会出现的,它们与逻辑无关,是程序员在码代码时不应该出现的,也就是说,这些错误应该是尽量避免带到线上环境的,他们不能通过try...catch捕获到.而异常则正 ...
 - 阿里云短信功能php
			
1. 引入文件: https://help.aliyun.com/document_detail/53111.html?spm=a2c1g.8271268.10000.99.5a8ddf25gG0wW ...
 - Linux系列(7) - 链接命令
			
硬链接 拥有相同的i节点和存储block块,可以看做事同一个文件 可通过i节点识别 不能跨分区 不能针对目录使用,只能针对文件 软链接 类似Windows快捷方式 软链接拥有自己的i节点和block块 ...
 - javascript 面向对象 模块
			
* module 完成函数 createModule,调用之后满足如下要求:1.返回一个对象2.对象的 greeting 属性值等于 str1, name 属性值等于 str23.对象存在一个 say ...