zoukankan      html  css  js  c++  java
  • s数据结构,算法,算法时间复杂度

    数据结构:

     

    (1)逻辑结构(2)存储结构(3)数据的运算

    从逻辑上讲,数据结构有,线性结构和非线性结构

    线性表是一个典型的线性结构。栈、队列、串等都是线性结构

    数组、广义表、树和图等数据结构都是非线性结构。

    从存储上有:顺序存储,链式存储,索引存储方法,散列存储方法

    顺序存储。该方法把逻辑上相邻的结点存储在物理位置上相邻的存储单元里,结点间的逻辑关系由存储单元的邻接关系来体现。

    链式存储,该方法不要求逻辑上相邻的结点在物理位置上亦相邻,结点间的逻辑关系由附加的指针字段表示。由此得到的存储表示称为链式存储结构(Linked Storage Structure),通常借助于程序语言的指针类型描述。

    索引存储方法,该方法通常在储存结点信息的同时,还建立附加的索引表

    散列存储方法该方法的基本思想是:根据结点的关键字直接计算出该结点的存储地址。 

    存储结构和数据的运算是数据结构不可缺少的方面:同一逻辑结构的不同存储结构或不同的运算可冠以不同的数据结构名称来标识。 
        【例】线性表是一种逻辑结构,若采用顺序方法的存储表示,可称其为顺序表;若采用链式存储方法,则可称其为链表;若采用散列存储方法,则可称为散列表。
        【例】若对线性表上的插入、删除运算限制在表的一端进行,则该线性表称之为栈;若对插入限制在表的一端进行,而删除限制在表的另一端进行,则该线性表称之为队列。

        更进一步,若线性表采用顺序表或链表作为存储结构,则对插入和删除运算做了上述限制之后,可分别得到顺序栈或链栈,顺序队列或链队列。

    算法

     

    非形式地说,算法是任意一个良定义的计算过程。它以一个或多个值作为输入,并产生一个或多个值作为输出。

    算法时间复杂度

    算法时间复杂度总是和问题规模对应的。记做T(n)

    比如T(n)=3n^3+n+5

    如果某个函数fn,使t(n)/f(n)当无穷大时,趋向一个常数。如f(n)=n^3 .t(n)/f(n)=>3.

    那么t(n)=3n^3+n+5=O(f(n))=O(n^3),称O(f(n))为算法的渐进时间复杂度。这里的“O”表示量级 (order),

    数学还给老师了。先复习一下。

    一个等式:2^3=8

    乘方

    2^3=x,

    x=8

    求n个相同因数乘积的运算,叫做乘方,乘方的结果叫做幂(power)。
    其中,a叫做底数(base number),n叫做指数(exponent),当aⁿ看作a的n次方的结果时,也可读作“a的n次幂”。
     
    开根
    开根(rooting),也叫开方,指求一个数的方根的运算,为乘方的逆运算.
     3/----
     / 8    =x. 
    x=2        简单说就是求底数
     
     
     
    对数
    如果a的x次方等于N(a>0,且a不等于1),那么数x叫做以a为底N的对数(logarithm),记作x=logaN。其中,a叫做对数的底数,N叫做真数。
    log     8=x.  
         2
     
    x=3       简单说就是求指数
     
    阶乘
    3*2*1=6
     
    一个正整数的阶乘(英语:factorial)是所有小于及等于该数的正整数的积,并且0的阶乘为1。自然数n的阶乘写作n!。1808年,基斯顿·卡曼引进这个表示法。
     
     
    求时间复杂度的其中有一个方法是:递归思路。
    1)写出复杂度n和算法下一步的复杂度的等式。
    2)把次数为x。正确代入右边表达式。
    3)根据零界点,一般是1(复杂度1是确定的步骤),算出x和n的关系。
    4)右表达式用n和T(1)表示。而 T(1) 又是确定的。所以结果句出来了,只有n为变数的一个表达式。
    如循环,
    T(N)=T(N-1)+1
    T(N)=T(N-X)+X
    T(1)=1
    设置x=n-1.
    T(N)=T(1)+n-1=n
     
    如二分法“
    t(n)=t(n/2)+1
    t(n)=t(n/2^x)+x
    n/2^x=1
    x=logN.
    t(n)=t(1)+logN.=logN
     
    如含洛坦:
    T(N)=2(T(N-1))+1
    T(N)=2^x ( (T(N-x)))+2^x-1 +1
     
    x=n-1
    T(N)=2^(n-1)  *T(1)+2^n-2 +1
    T(N)=2^(N-1)*1+2^(N-2)+1
    =O(2^n)
     
    快排
    T(N)=2(T(N/2))+N
     
    T(N)=2^x * T(N/2^X)+XN
    X= lngn
    T(N)=2^x * T(N/2^X)+XN=n+nlogn
    =O(nlogn)
     
    娃哈哈,终于会了。
     
    非常直观的看下差距到底是多大。
    10000次为基准。
    n:1万次。
    n^2=10亿。
    logn=14次。
    nlog=14万次。
    2^n=1T.
     
    非常明显,大数据查找,必须先排序,再用2分法。14次比1w的差距。
     
     

    回想一下,首先程序中经常对问题用复杂度n表示。

    1)  1次循环,n的1次方。我们说复杂度是1次方阶。常叫线性阶。T(N)=T(N-1)+1===>T(0)+n

           2次循环,n的2次方。我们说复杂度是2次方阶。也叫平方阶。T(N)=T(N-1)+n===>T(0)+n^2

           3次循环,n的3次方。我们说复杂度是3次方阶。也叫立方阶。

    2)  一般查找是1次循环,

           二分法查找,每次把问题缩小为问题n的一半为n/2,我们的查找量变为2为底,n的对数,也就是问题复杂度每次都除以2.,就叫对数阶

      如果能把问题,一次缩小为1/3.那复杂度就是3为底,n的对数.简单理解就是求指数本身。

          注意,程序中我们基本不会出现说,8个数字,3次查询完。要怎样,怎样。所以基本不出出现开根的符号出现在时间复杂度上。

    具体求解过程。

    t(n)=t(n/2)+1

    T(N)=T(N/2^X)+X

    当n/2^x=1时,有确定解。

    T(N)=T(1)+longn=longn.

    3)递归的时间复杂度,计算要注意下。

       递归的复杂度,本身还要借助递归思想来求。

      如汉诺塔是指数阶

        T(N)=2(T(N-1))+1

       开始递归算时间了:

        T(N)=2×(2(T(N-2))+1)+1  注意:2(T(N-2))+1= T(N-1)

      所以:T(N)=2^K*T(N-K)+2^(K-1)+1

    设置递归最小有解点。就是k=n-1的时候。因为T(1)是有解的。
    T(N)=2^K*T(1)+2^(K-1)+1
    =2^(N-1)*1+2^(N-2)+1
    近视于2^n。
    网络文章都说是2的n次方。感觉应该是近视吧。难道是我算错了?
     

     

  • 相关阅读:
    eclipse中误删tomcat后,文件都报错,恢复server时无法选择tomcat7.0解决办法
    java web多组件协作实现用户登录验证
    设计模式--享元模式
    设计模式--中介者模式
    设计模式--职责链模式
    设计模式--观察者模式与命令模式
    设计模式--桥接模式
    设计模式--迭代器模式
    设计模式--组合模式
    设计模式--备忘录模式
  • 原文地址:https://www.cnblogs.com/lsfv/p/6260215.html
Copyright © 2011-2022 走看看