算法分析笔记

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

定义


定义:

  1. 若存在正常数 c 和 n<sub>0</sub> 使得当 N ≥ n<sub>0</sub> 时 T(N) ≤ cf(N),则记为 T(N) = O(f(N))
  2. 若存在正常数 c 和 n<sub>0</sub> 使得当 N ≥ n<sub>0</sub> 时 T(N) ≥ cf(N),则记为 T(N) = Ω(f(N))
  3. T(N) = θ(h(N)) 当且仅当 T(N) = O(h(N))T(N) = Ω(h(N))
  4. T(N) = O(p(N))T(N) != θ(p(N)), 则 T(N) = o(p(N))

法则:

  1. 若 T<sub>1</sub>(N) = O(f(N)) 且 T<sub>2</sub>(N)=O(g(N)),则:

    a. T<sub>1</sub>(N) + T<sub>2</sub>(N) = max(O(f(N)), O(g(N)))b. T<sub>1</sub>(N) * T<sub>2</sub>(N) = O(f(N) * g(N))
    
  2. 若 T(N) 是一个 k 次多项式,则 T(N) = Θ(N<sup>k</sup>)

  3. 对任意常数 k,log<sup>k</sup>N = O(N)

注意:

  1. 不要将常数或低阶项放入 O() ,在 O 分析中,低阶项和常数一般可以忽略。
  2. 总能够通过计算 n→∞ 时 f(N)/g(N) 的极限来确定这两个函数的相对增长率。

最大子序列问题


可以分段读入数据并处理问题的算法称为 online algrithm,与之相对,在运算开始时就需要读入全部数据做运算的算法称为 offline algrithm。仅需要常量内存空间并以线性时间运行的算法几乎是完美的算法。如下例最大子序列问题:

lang:python
data = list(range(-10, 10))
random.shuffle(data)# 算法
def foo(data):this_sum = max_sum = 0for i in data:this_sum += iif this_sum < 0:this_sum = 0elif this_sum > max_sum:max_sum = this_sumreturn max_sum

对数


如果一个算法用常数时间(O(1) )将问题的大小削减为其一部分(通常是 1/2),那么该算法就是 O(logN)

如果一个算法可以用常数时间把问题减小一个常数,那么他就是 O(N) 的。

对数复杂度的一个典型例子是:二分法查找 (binary search)

def bin_search(numbers, x):"""假设 numbers 已排序"""start = 0end = len(numbers) - 1while start < end:middle = (start + end) / 2if numbers[middle] < x:start = middle + 1elif numbers[middle] > x:end = middle - 1else:return middlereturn -1		

欧几里得算法


计算最大公因数:

def gcd(a, b):while b > 0:a = a % ba, b = b, areturn a

定理:

若 M > N, 则 M mod N < M/2

推得:gcd 函数的时间复杂度是 O(log N) 的

幂运算


优化算法的一个原则是:不要做重复的运算

因此对于幂运算 x<sup>n</sup>,相较于进行 n-1 次乘法,下面的算法效率更高:

def pow(x, n):if n == 0:return 1if n == 1:return nif n % 2 == 0:return pow(x * x, n / 2)else:return x * pow(x * x, (n-1) / 2)

检验算法时间


python 中可以用 timeit.timeit 函数方便的检验算法时间

timeit(stmt='pass', setup='pass', timer=<built-in function perf_counter>,number=1000000, globals=None)

其中:

* stmt statement 是一个字符串表达式
* setup 是一个执行前置语句,如 import
* globals 是一个字典,存放你要使用的全局变量

如,我们要测试 gcd 函数,则

import timeit
timeit.timeit('gcd(15, 234)', globals={'gcd': gcd})

转载于:https://my.oschina.net/lionets/blog/704924

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

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

相关文章

C++指针详解

C指针详解指针的概念 指针是一个特殊的变量&#xff0c;它里面存储的数值被解释成为内存里的一个地址。要搞清一个指针需要搞清指针的四方面的内容&#xff1a;指针的类型&#xff0c;指针所指向的类型&#xff0c;指针的值或者叫指针所指向的内存区&#xff0c;还有指针本身所…

数字效率Evernote超效率数字笔记术

文章结束给大家来个程序员笑话&#xff1a;[M] 每日一道理 古人云&#xff1a;“海纳百川&#xff0c;有容乃大。”人世间&#xff0c;不可能没有矛盾和争吵&#xff0c;我们要以磊落的胸怀和宽容的微笑去面对它 。哈伯德也曾说过&#xff1a;“宽恕和受宽恕的难以言喻的快乐&a…

千万别让爸妈帮你P图......

1 如何把外来称呼本土化&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 奇奇怪怪的知识又增加了&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 好家伙&#xff01;洪世贤家烛台上插的是火腿肠▼4 妨碍公务的下场&#xff08;素材来源网络&#xff0c…

WPF 不遮挡任务栏最大化和全屏显示

在窗体不去边框的情况下&#xff0c;不遮挡任务栏最大化MainWindow.xaml.csusing System; using System.Windows; using System.Windows.Threading;namespace thzSoftware {/// <summary>/// MainWindow.xaml 的交互逻辑/// </summary>public partial class MainWi…

看完后震惊!清华“姚班”创始人的老师究竟有多牛?他说孩子最应该培养这几个思维……...

▲ 点击查看相信很多人都挺听说过清华有个“姚班”&#xff0c;致力于培养与美国麻省理工学院等世界一流高校本科生具有同等、甚至更高竞争力的计算机科学人才。“姚班”是我国著名科学家姚期智所创&#xff0c;因此得名“姚班”。姚期智教授是2000年图灵奖得主&#xff0c;也是…

2021,我在枯燥乏味中寻找坚持下去的理由

这是头哥侃码的第248篇原创2021年&#xff0c;因为疫情和工作变更的关系&#xff0c;不仅我的工作方式被彻底改变&#xff08;居家远程办公&#xff09;&#xff0c;而且还在健身房悟出一个心得体会。啥心得&#xff1f;啥体会&#xff1f;那就是觉得人生逐渐变得没有意思。不知…

OM 延交訂單

如訂單扣數後要延交, 請按以下步驟: 1) 先取消要延交的ITEM 的DELIVERY NO. ACTION: Unassign from Dlivery 2) 要重新給DELIVERY NO ACTION: Auto-create Trip 3) 延交訂單item - Ship confirm - 選backorder all - OK 已完成延交, 可重新取move order

Android之内存机制分析-Android堆和栈

1、dalvik的Heap和Stack 这里说的只是dalvik java部分的内存&#xff0c;实际上除了dalvik部分&#xff0c;还有native。这个以后再说。 下面针对上面列出的数据类型进行说明&#xff0c;只有了解了我们申请的数据在哪里&#xff0c;才能更好掌控我们自己的程序。 2、对象实例…

这部纪录片带你重新认识中华神州大地,领略你不知道的中国

你对自己的祖国熟悉嘛&#xff1f;你是否真正的去了解过自己祖国的各个省份呢&#xff1f;今天小编带来的这部纪录片《你所不知道的中国》&#xff0c;带你认识一个你从未了解的中国&#xff0c;让你从纪录片的视角去认识自己的祖国&#xff0c;重新认识哺育自己多年的神州大地…

B-树特征

在m阶B-树的定义中&#xff0c;要求&#xff1a; 1、树中每个节点至多有m棵子树。 2、若根节点不是叶子节点&#xff0c;则至少有两棵子树。 3、除根之外的所有非终端节点至少有棵子树。转载于:https://www.cnblogs.com/tonglingliangyong/p/3740964.html

首届微软研究峰会视频上线,快来查收你的独家观看指南!

由微软全球八大研究院携手倾力打造的首届微软研究峰会 Microsoft Research Summit 2021 已于此前在线上成功举办。来自世界各地的 300 余位顶尖科学家和技术领导者为大家带来了 150 场精彩分享&#xff0c;内容围绕“科学、赋能、可持续发展、医疗健康、信任”五大主题展开&…

关于用函数指针参数申请动态内存的问题

今天在写一个Binary Search Tree的程序时&#xff0c;发现其插入有问题&#xff0c;下面是插入程序&#xff0c;每次插入完成后&#xff0c;节点还是NULL。 template<typename Object>void CMyTree<Object>::insert(const Object& element, BinaryNode<Obje…

当全家人一起看电影,播到羞羞镜头时......

1 我看你好眼熟哦&#xff08;via.松鼠少儿&#xff0c;侵删&#xff09;▼2 妹妹&#xff1a;有没有想过我感受&#xff1f;&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 遇见五步蛇怎么办&#xff08;via.阿森不是妖怪&#xff0c;侵删&#xff09;▼4 一年级…

网站分析常用方法

本篇文章我们介绍4种网站分析中最常用&#xff0c;也是最有效的分析方法。他们分别是细分分析&#xff0c;对比分析&#xff0c;对比分析&#xff0c;质与量分析。这些分析方法在实际工作中经常组合使用。我们先来看下细分分析。 1&#xff0c; 细分分析 单一的指标数据或大维度…

vscode中vue项目报错

当在vscode中写代码时&#xff0c;报错报错报错......... 已经头大&#xff0c;还没写就报错&#xff0c; 这是因为eslint对语法的要求太过严格导致的编译时&#xff0c;出现各种语法格式错误 我们打开vue.config.js&#xff0c;加上这句代码&#xff0c;就OK啦 lintOnSave:…

nginx连接uwsgi使用web.py框架构造pythonweb项目

2019独角兽企业重金招聘Python工程师标准>>> 相关页面&#xff1a;http://webpy.org/installhttp://uwsgi-docs.readthedocs.org/en/latest/WSGIquickstart.htmlhttp://projects.unbit.it/uwsgi/wiki/Example uwsgi的安装需要python-devel&#xff0c;可以使用yum s…

.NET WinForm程序中给DataGridView表头添加下拉列表实现数据过滤

转&#xff1a;http://www.cnblogs.com/jaxu/archive/2011/08/04/2127365.html 我们见过Excel中的数据过滤功能&#xff0c;可以通过点击表头上的下拉列表来实现数据的过滤&#xff0c;这个功能很实用&#xff0c;省去了我们需要在程序中单独设计数据的查询过滤模块&#xff0c…

Hadoop示例程序WordCount详解及实例

2019独角兽企业重金招聘Python工程师标准>>> 1.图解MapReduce MapReduce整体流程图 并行读取文本中的内容&#xff0c;然后进行MapReduce操作 Map过程&#xff1a;并行读取三行&#xff0c;对读取的单词进行map操作&#xff0c;每个词都以形式生成 reduce操作是对ma…