zoukankan      html  css  js  c++  java
  • [读书笔记]-大话数据结构-2-算法

    算法(Algroithm)是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。

    算法的特性

    • 输入输出:零个或多个输入(打印hello world不需要输入),一个或多个输出
    • 有穷性:算法在执行有限的步骤之后,自动结束而不会出现无线循环,并且每一个步奏在可接受的时间内完成。
    • 确定性:算法的每一步都有确定的含义,不会出现二义性。
    • 可行性:算法的每一步都必须是可行的,也就是说,每一步都能通过执行有限次数完成。

    算法设计的要求

    1. 正确性

        正确性:算法的正确性是指算法至少应该具有输入、输出和加工处理无歧义性、能正确反映问题的需求、能够得到问题的正确答案。正确性分为以下四个层次:

    • 算法程序没有语法错误。
    • 算法程序对于合法的输入数据能够产生满足要求的输出结果。
    • 算法程序对 非法的输入数据能够得出满足规格说明的结果。(一般以此作为算法正确的标准)
    • 算法程序对于精心选择的,甚至刁难的测试数据都有满足要求的输出结果。

    2. 可读性:算法设计的另一目的是为了便于阅读、理解和交流

    3. 健壮性:当输入数据不合法时,算法也能做出相关处理,而不是产生异常或莫名其妙的结果

    4. 时间效率高和存储量低

        好的算法,应该具有正确性 读性、健壮性 高效率和低存储的特点。

    算法效率的度量方法

    1. 事后统计方法

        事后统计方法:通过设计好的测试程序和数据,利用计算机计时器对不同算法编制的程序的运行时间进行比较,从而确定算法效率的高低。

        事后统计存在的缺点:编写程序花费时间和精力、运行算法依赖软硬件和计算机环境、设计测试数据困难。一般不用此种方法度量。

    2. 事前分析估算方法

        事前分析估算方法:在编写程序前,根据统计方法对算法进行估算。一般程序在计算机上运行的时间取决于:

    • 算法采用的策略、方法
    • 编译产生的代码质量(软件支持)
    • 问题的输入规模
    • 机器执行指令的速度(硬件性能)

        也就是说,抛开软硬件因素,一个程序的运行时间,依赖于算法的好坏和问题的输入规模(输入的量是多少)

    函数的渐近增长

        函数的渐近增长:给定两个函数 f(n)和g(n) 如果存在一个整数N,使得对于所有的 n > N, f ( n )总是比 g( n )大,那么 我们说 f( n )的增长渐近快于 g( n).

        判断一个算法的效率时,函数中的常数和其他次要项常常可以忽略,而更应该关主项(最高阶项)的阶。

        如果我们可以对比几个算法的关键执行次数函数的渐近增长性,基本就可以分析出:某个算法,随着 n的增大,它会越来越优于另一算法,或者越来越差于另一算法。

    算法时间复杂度

        在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。算法的时间复杂度,也就是算法的时间度量,记作T(n)=O(f(n))。它表示岁问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐近时间复杂度,简称时间复杂度。其中f(n)是问题规模n的某个函数。

        随着n的增大,T(n)增长最慢的算法为最优算法

    推导大O阶:

    1. 用常数1取代运算时间中的所有加法常数
    2. 在修改后的运行次数函数中,只保留最高阶项
    3. 如果最高阶项存在且不是1,则去除与这个项相乘的常数。

    常见的时间复杂度

    • 常数阶 O(1) :与问题规模O无关
    • 线性阶 O(n)
    • 对数阶 O(logn)
    • 平方阶 O(n^2)
    • nlogn阶 O(nlogn)
    • 立方阶 O(n^3)
    • 指数阶 O(2^n)

        常用时间复杂度耗费时间从小到大依次是:

        O(1) < O(logn)O(n) <O(nlogn) < O(n^2)  < O(n^3) < O(2^n) < O(n!) < O(n^n)

    最坏情况与平均情况 

        最坏情况运行时间是一种保证,那就是运行时间将不会再坏了。在应用中,这是一种最要的需求,通常,除非特别指定,我们提到的运行时间都是最坏情况的运行时间。

        平均运行时间是所有情况中最有意义的,因为它是期望的运行时间。

    算法空间复杂度

        算法的空间复杂度是通过计算算法所需的存储空间实现的,算法空间复杂度的计算公式记作:S(n)=O(f(n)),其中,n为问题的规模,f(n)为关键语句关于n所占存储空间的函数。

  • 相关阅读:
    FreeCommander 学习手册
    String详解, String和CharSequence区别, StringBuilder和StringBuffer的区别 (String系列之1)
    StringBuffer 详解 (String系列之3)
    StringBuilder 详解 (String系列之2)
    java io系列26之 RandomAccessFile
    java io系列25之 PrintWriter (字符打印输出流)
    java io系列24之 BufferedWriter(字符缓冲输出流)
    java io系列23之 BufferedReader(字符缓冲输入流)
    java io系列22之 FileReader和FileWriter
    java io系列21之 InputStreamReader和OutputStreamWriter
  • 原文地址:https://www.cnblogs.com/zhaoxy/p/7716047.html
Copyright © 2011-2022 走看看