算法导论 - 函数的增长。

1.为什么我们要学习函数的增长?

  因为在计算机编程的学习中,我们需要掌握一个类似于“需求量”的东西,怎么去理解需求量呢,举个最简单的例子,你有一个双层循环,这个双层循环所需要的时间,就是一个增长量。具体一点可以这么去解释这个问题,如果你在一个循环里面的每一个步骤所需要的时间都不同的话,那么:你的需求量就是一个分布式的增长。我们需要了解一个程序的线性增长或者减少,就必须要了解一些实质性的东西。废话不多,下面开始讲解各个知识点:

2.渐进记号

  这里我还是不想照着书上讲,那样太没意思了,我就说说我个人的理解,大家可以参考,切勿全部相信我说的。Θ(n^2)=ax^2+bx+c,这个公式大家上初中的时候应该都学过了吧,就是一个一元二次方程的标准式,任何的(x+c)^2其中 C为常量,都可以化简为Θ(n^2)=ax^2+bx+c的这种形式,我个人觉得这是一种非常糟糕的形式,或者说,这种形式所造成的时间代价是最大的,虽然我经常写这种糟糕的代码。

  好了,下面我来介绍几种算法当中的记号的作用:

  1. Θ 给出了这个函数的上界和下界
  2. О 给出了上界
  3. Ω 给出了下界

  由于我们今天想做的一件事情,是要明白这3个符号的具体用处,你可以把上界或者下界理解为“参考函数”,在代码里面,你可以理解为线程,我们假设有3个不同的线程,这3个不同的线程在某个瞬间他们会有同样的消耗,也就是说效率相等,当过了这个时间以后,就会向这个被参考的函数的的上界飞去或者下界飞去,这里说的上界或者下界和区间是不同的,因为区间是一个基本数据类型,而这个上界或者下界是一个你可以理解为OBJECT的东西,也就是一个参考线程。这个参考线程的效率在平衡点以后,随着时间的推移,就会永远处于递增(效率大于被参考线程)和递减(效率小于被参考线程)这样。

  由此我们可以总结出一个公式: A<=B<=C,这是一个极其简单的不等式,但是其中蕴含了上界下界的概念,让我再来重写这个不等式。

  (A=B当且仅当2条函数相交)∪(A<B当且仅当参考线程A为下界)  (B=C当且仅当2条函数相交)∪(B<C当且仅当参考线程C为上界)

  当然了,任何的函数的变体都适合于上面的逻辑,只要符合就OK。

  就写这么多了,本来想放首页的,结果发现自己还有好多不理解,于是乎,就等下次吧,上首页这种事情不能强求的,每天有进步就行了!

时间: 2024-10-18 10:21:43

算法导论 - 函数的增长。的相关文章

【算法导论学习笔记】第3章:函数的增长

????原创博客,转载请注明:http://www.cnblogs.com/wuwenyan/ ? 当算法的输入n非常大的时候,对于算法复杂度的分析就显得尤为重要,虽然有时我们能通过一定的方法得到较为精确的运行时间,但是很多时候,或者说绝大多数时候,我们并不值得去花精力求得多余的精度,因为精确运行时间中的倍增常量和低阶项已经被输入规模本身的影响所支配.我们需要关心的是输入规模无限增加,在极限中,运行时间是如何随着输入规模增大而增加的,通常来说,在极限情况下渐进地更优的算法在除很小的输入外的所有情

《算法导论》读书笔记--第三章 函数的增长

好长时间了,继续算法导论. 当输入规模足够大时,并不计算精确的运行时间,倍增常量和低阶项被舍去.我们要研究的是算法的渐近效率,即在输入规模无限量时,在极限中,算法的运行时间如何随着输入规模的变大而增加.通常,渐近的更有效的某个算法除对很小得到输入外都是最好的选择. 3.1渐近符号 用渐近符号来刻画算法的运行时间.

算法导论中对二叉树链表中 Delete 函数的实现

上一篇博客中对 Delete 函数的实现是根据被删除节点子节点的子节点个数, 分为无子节点, 一个子节点和两个子节点的情况分别考虑的. 而这次的代码是根据算法导论的实现用 C++ 直译过来的, 代码如下: void BinarySearchTree::Delete (const int32_t& value) { auto node = Search (value); if (node == nullptr) { cerr << "There is no such value

《算法导论》中动态规划求解钢条切割问题

动态规划算法概述 动态规划(dynamic programming)1是一种与分治方法很像的方法,都是通过组合子问题的解来求解原问题.不同之处在于,动态规划用于子问题重叠的情况,比如我们学过的斐波那契数列.在斐波那契数列的求解问题中,我们经常要对一个公共子问题进行多次求解,而动态规划算法,则对每个子问题只求解一次,将其解保存在一个表格中,从而避免了大量的冗余计算量. 动态规划算法常用于寻找最优解问题(optimization problem).而其规划大概可分为四步: 1.刻画一个最优解的结构特

算法导论学习之快排+各种排序算法时间复杂度总结

快排是一种最常用的排序算法,因为其平均的时间复杂度是nlgn,并且其中的常数因子比较小. 一.快速排序 快排和合并排序一样都是基于分治的排序算法;快排的分治如下: 分解:对区间A[p,r]进行分解,返回q,使得A[p–q-1]都不大于A[q] A[q+1,r]都大于A[q]; 求解:对上面得到的区间继续递归进行快排 合并:因为快排是原地排序,所以不需要特别的合并 从上可以看出最重要的就是分解函数,其按关键值将数组划分成3部分,其具体实现的过程见代码注释. 我们一般取数组的最后一个元素作为划分比较

MIT算法导论——第五讲.Linear Time Sort

本栏目(Algorithms)下MIT算法导论专题是个人对网易公开课MIT算法导论的学习心得与笔记.所有内容均来自MIT公开课Introduction to Algorithms中Charles E. Leiserson和Erik Demaine老师的讲解.(http://v.163.com/special/opencourse/algorithms.html) 第五节-------线性时间排序 Linear Time Sort 这节课的主要内容是分析基于比较的排序能够达到的最快效率以及介绍几种

《算法导论》——数论

1 . 欧几里得算法(递归法球两个数的最大公约数) 算法比较简单就直接贴代码了: int gcd(int a , int b){     return b ==0 ? a : gcd(b , a%b); } 在这个算法的基础上可以该进,gcd(a*n , b*n)=n*gcd(a , b);这个定理给我们提供了思路:可不可以在算法中加如判断减少递归的次数呢?当然可以. int gac(int m,int n){  if(m==0 || n==0)   return (m==0) ? n : m;

算法导论——lec 12 平摊分析与优先队列

在平摊分析中,执行一系列数据结构操作所需要的时间是通过对执行的所有操作求平均得出,反映在任何情况下(即最坏情况下),每个操作具有平均性能.掌握了平摊分析主要有三种方法,聚集分析.记账方法.势能方法.掌握了平摊分析的方法以后,我们就可以利用他来分析一些优先队列. 一. 平摊分析 [问题一]对作用于一个初始为空的栈上的n个PUSH.POP和MULTIPOP组成的序列进行分析. [问题二]考虑一个由0开始向上计数的k位二进制计数器.作用于一个初始为零的计数器上的n个INCREMENT操作的时间分析.

散列表(算法导论笔记)

散列表 直接寻址表 一个数组T[0..m-1]中的每个位置分别对应全域U中的一个关键字,槽k指向集合中一个关键字为k的元素,如果该集合中没有关键字为k的元素,则T[k] = NIL 全域U={0,1,…,9}中的每个关键字都对应于表中的一个下标值,由实际关键字构成的集合K={2,3,5,8}决定表中的一些槽,这些槽包含指向元素的指针,而另一些槽包含NIL 直接寻址的技术缺点非常明显:如果全域U很大,则在一台标准的计算机可用内存容量中,要存储大小为|U|的一张表T也许不太实际,甚至是不可能的.还有