算法分析笔记

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;还有指针本身所…

.NET 6新特性试用 | PriorityQueue

前言我们常用Queue<T>类来表示先进先出(FIFO)集合&#xff0c;集合中的对象按照放入顺序检索。例如&#xff1a;var jobs new Queue<Job>();jobs.Enqueue(new Job() { Id 1 }); jobs.Enqueue(new Job() { Id 2 }); jobs.Enqueue(new Job() { Id 3 });while (jo…

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

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

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

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

对大数据知识架构的梳理

近期交接了前期的大数据项目&#xff0c;对之前的项目内容做一个总结。也算是梳理一下项目的架构&#xff0c;对前期也算是一个总结&#xff0c;为后期的学习打下一个基础。清理数据对传统行业来说&#xff0c;上来就说要搞大数据&#xff0c;一般都会是一种噱头&#xff0c;因…

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

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

C#中'??'符的使用

?? 用于判断当前对象是否为null. 语法: 对象 ?? "当前对象为null时赋的默认值". string nullString null; string Kong ""; string a nullString ?? "能判断为null"; string b Kong ?? "能判断为空"; 执行结果&#xff1…

将 iOS 应用的体积控制在 20MB 以内对于其下载量有很明显的影响吗?

分类&#xff1a;iPhone开发 标签&#xff1a;App大小、下载量、应用体积 比如&#xff0c;Angry bird 、Cut The Rope 游戏内容很丰富的应用都能将其体积控制在 20MB 。iOS 限制允许 3G 网络下载应用的体积不超过 20MB &#xff0c;通过 3G 下载的应用用户非常多吗&#xff1…

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

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

Android之线程池

http://www.trinea.cn/android/java-android-thread-pool/ 介绍new Thread的弊端及Java四种线程池的使用&#xff0c;对Android同样适用。本文是基础篇&#xff0c;后面会分享下线程池一些高级功能。 1、new Thread的弊端 执行一个异步任务你还只是如下new Thread吗&#xff…

数据库自增主键可能产生的问题

在MySQL中经常会配置自增长属性的字段作为主键&#xff0c;特别是使用InnoDB存储引擎&#xff0c;因为InnoDB的聚集索引的特性&#xff0c;使用自增长属性的字段当主键性能更好&#xff0c;但是使用自增主键也可能会带来一些问题。 举个例子&#xff0c;使用自增主键对数据库做…

js中的hasOwnProperty和isPrototypeOf方法

转自&#xff1a;http://www.cnblogs.com/jenry/archive/2010/12/08/1900150.html hasOwnProperty&#xff1a;是用来判断一个对象是否有你给出名称的属性或对象。不过需要注意的是&#xff0c;此方法无法检查该对象的原型链中是否具有该属性&#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

数据挖掘编程语言选择(Python与R的PK)

数据挖掘技术日趋成熟和复杂&#xff0c;随着互联网发展以及大批海量数据的到来&#xff0c;之前传统的依靠spss、SAS等可视化工具实现数据挖掘建模已经越来越不能满足日常需求&#xff0c;依据美国对数据科学家&#xff08;data scientist&#xff09;的要求&#xff0c;想成为…

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;内容围绕“科学、赋能、可持续发展、医疗健康、信任”五大主题展开&…

Linux命令之tree

tree功能说明&#xff1a;以树状图列出目录的内容语法&#xff1a;tree [-aACdDfFgilnNpqstux] [-l <范本样式>] [-p <范本样式>] [目录]补充说明&#xff1a;执行tree指令&#xff0c;它会列出指定目录下的所有文件&#xff0c;包括子目录里的文件参数&#xff1a…