数据结构和算法绪论笔记整理

程序设计 = 数据结构 + 算法


数据结构:就是数据元素相互之间存在的一种或多种特定关系的集合(关系就是讲逻辑结构,集合就是将物理结构);

        a.逻辑结构
            集合:数据元素之间只有"同属于一个集合"的关系
            线性结构:数据元素之间存在一个对一个的关系
            树形结构:数据元素之间存在一个对多个关系
            图形结构或网状结构:数据元素之间存在多个对多个的关系
http://i.cnblogs.com/EditPosts.aspx?postid=3938456
        b.物理结构(存储结构)
            顺序存储:数据元素存放在地址连续的存储单元里,其数据间的逻辑关系和物理关系是一致的(数组)
            链式存储:数据元素存放在任意的存储单元里,这组存储单元可以是连续的,也可以是非连续的
 
算法:是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个活多个操作,泡妞的技巧和方式而已

        a.算法的特征:  
                 输入     参数
                 输出、   可以是打印、可以使返回值
                 有穷性、 有限步骤之后会自动结束,每一个步骤在可接受的时间内完成
                 确定性、  每一个步骤都有其确定的含义,不会出现二义性,在一定条件下
                           执行同一条执行路径,相同的输入只能有唯一的输出结果
                 可行性    每一步都能够通过执行有限次数完成
                
        b.算法设计的要求:
                正确性
                      算法程序没有语法错误
                      对于合法输入能够产生满足要求的输出
                      对于非法输入能够产生满足规格的说明
                      对于故意***难的测试输入都有满足要求的输出结果
                可读性:便于他人阅读和自己日后阅读修改
                健壮性:输入不合法时,能够做出相关处理,而不是崩溃
                时间效率高和存储量低
 高斯算法

 

 

算法效率的度量方法:

    事后统计方法:要先写好测试程序,不同的服务器,测试效率也不一样
    事前分析估算方法:在计算机程序编写前,依据统计方法对算法进行估算

    程序运行时间的影响因素:
          算法
          编译产生的代码质量
          问题的输入规模
          机器执行指令的速度
    抛开这些与计算机硬件、软件有关的因素,一个程序的运行时间依赖与算法的好坏和问题的输入规模(比如for循环的次数)

 

 

渐近增长:

此时我们给出这样的定义,输入规模n在没有限制的情况下,只要超过一个数值N,这个函数就总是大于另一个函数,我们称函数是渐近增长的。

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

 

算法复杂度:

分为时间复杂度和空间复杂度。其作用: 时间复杂度是指执行算法所需要的计算工作量;而空间复杂度是指执行这个算法所需要的内存空间。(算法的复杂性体现在运行该算法时的计算机所需资源的多少上,计算机资源最重要的是时间和空间(即寄存器)资源,因此复杂度分为时间和空间复杂度)。

 

时间复杂度:

在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。这是一个关于代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。

一般情况下,算法的基本操作重复执行的次数是模块n的某一个函数f(n),因此,算法的时间复杂度记做:T(n)=O(f(n)) 分析:随着模块n的增大,算法执行的时间的增长率和 f(n) 的增长率成正比,所以 f(n) 越小,算法的时间复杂度越低,算法的效率越高。

用大写O()来体现算法时间复杂度的记法,我们称之为大O记法

推导大O阶方法

 常数设为1,只保留最高项,去掉与最高项相乘的乘数 ( n^2/2+n/2+1000 -> 得到n的平方n^2)

 

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

通常我们都是用时间复杂度来指运行时间的需求,是用空间复杂度指空间需求。

 

 

衡量一个程序是否优质,可以从多个角度进行分析。其中,最常见的衡量标准是程序的时间复杂度、空间复杂度,以及代码的可读性、可扩展性。针对程序的时间复 杂度和空间复杂度,想要优化程序代码,需要对数据结构与算法有深入的理解,并且熟悉计算机系统的基本概念和原理;而针对代码的可读性和可扩展性,想要优化 程序代码,需要深入理解软件架构设计,熟知并会应用合适的设计模式。

java代码优化: http://developer.51cto.com/art/201305/396042.htm

http://www.ibm.com/developerworks/cn/java/j-lo-codeoptimize/

 

针对日志记录的优化

关闭日志记录,或者更改日志输出级别

对于 CPU 密集型的程序(即程序中包含大量计算),Java 程序可以达到 C/C++ 程序同等级别的速度,但是对于 I/O 密集型的程序(即程序中包含大量 I/O 操作),Java 程序的速度就远远慢于 C/C++ 程序了,很大程度上是因为 C/C++ 程序能直接访问底层的存储设备

针对数据库连接的优化

单例模式获得一个相同的数据库连接,每次数据库连接操作都共享这个数据库连接。这里没有使用数据库连接池是因为在程序只有少量的数据库连接操作,只有在大量并发数据库连接的时候才需要连接池。

针对插入数据库记录的优化

 使用预编译 SQL

 使用 SQL 批处理

针对多线程的优化

通过 java.lang.Thread 类的 join 方法控制线程执行的先后次序

笔者试着给每个任务分配两个线程执行,希望能使程序运行得更快,但是事与愿违,此时程序运行的时间反而比每个任务分配一个线程执行的慢,大约 20 秒。笔者推测,这是因为线程较多(相对于 CPU 的内核数),使得 CPU 忙于线程的上下文切换,过多的线程上下文切换使得程序的性能反而不如之前。因此,要根据实际的硬件环境,给任务分配适量的线程执行

 

针对设计模式的优化

抽象出数据访问层、代码的可读性、可扩展性大大地提高了

posted on 2014-08-26 23:27  lovebeauty  阅读(305)  评论(0编辑  收藏  举报

导航