数据结构与算法之“概念及复杂度分析”学习笔记

一、数据结构与算法的概述:

     什么数据结构:

       一般说来,计算机解决一个具体的问题时,大致需要经过下列几个步骤:

          首先,从具体的问题抽象出一个适当的数学模型;

          然后,设计一个解此数学模型的算法;

          最后。编出程序,进行测试调整直至得到最终解答。

      寻求数据模型的实质是分析问题,从中提取操作的对象。并找出这些操作对象之间含有的关系,然后用数学的语言加以描述。       

    2.基本概念和术语:

       数据(data):是对客观事物的符号表示,在计算科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称。

       数据元素(data element):是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理,一个数据元素可由若干个数据项(data item)组成。数据项是数据的不可分割的最小单位。

       数据对象(data object):是性质相同的数据元素的集合,是数据的一个子集。

       数据结构(data structure):是互相之间存在一种或多种特定关系的数据元素的集合。根据数据元素之间关系的不同特性可分为---------

             集合:结构中的数据元素之间除了“同属一个集合”的关系外别无其他关系;

             线性结构:结构中的数据元素之间存在一个对一个的关系;

             树形结构:结构中的数据元素之间存在一个多个的关系;

             图状结构或网状结构:结构中的数据之间存在多个对多个的关系。

     数据结构在计算机中的表示(又称映像)称为数据的物理结构,又称存储结构。它包括数据元素的表示和关系的表示。 

     数据元素之间的关系在计算机中有两种不同的表示方法:顺序映像和非顺序映像,并由此得到两种不同的存储结构:顺序存储结构链式存储结构

     数据类型(data type);是一个值的集合和定义在这个值集上的一组操作的总称。

    抽象数据类型(Abstract Data Type):是指一个数据模型以及定义在该模型上的一组操作。抽象数据类型的定义仅取决于它的一组逻辑特性,而与其在计算机内部如何表示和实现无关,及不论其内部结构如何变化,只要他的数据特性不变,都不影响其外部使用。一个含抽象类型的软件模块通常应包含定义、表示和实现三个部分。

         抽象数据类型的定义由一个值域和定义在该值域的一组操作组成,按值域的不同特性可分为:

            原子类型(atomic data type):属原子类型的变量的值是不可分解的。

            固定聚合类型(fixed-aggregate data type)属改类型的变量,其值由确定数目的成分按照某种结构组成。

            可变聚合类型(variable-aggregate data type):和固定聚合类型相比较,构成可变聚合类型“值”的成分的数目不确定。

 

     多形数据类型(polymorphic data type):是指其值的成分不确定的数据类型。

二.算法概述:

   1.算法(algorithm)是对特定问题求解步骤的一种描述,它是指令的有限序列,其中每一条指令表示一个或多个操作。

   算法还具有5个重要特性:

     有穷性:一个算法必须总是(对任何合法的输入值)在执行有穷步之后结束,且每一步都可以在有穷时间内完成。

     确定性:算法中每一条指令必须确切的含义,在任何条件下,算法只有唯一的一条执行路径,即对相同的输入智能得出相同的输出。

     可行性:一个算法是能行的,在算法描述中操作都是可以通过已经证实的基本运算执行有限次实现的。

     输入:一个算法有零个或多个的输入,这些输入取决于某个特定的对象的集合。

     输出:一个算法有一个或者多个的输出,这些输出是同输入有着某种特定关系的量。

  2.算法设计要求:

     正确性:算法应当满足具体问题的需求。

     可读性:算法主要是为了人的阅读与交流,其次才是机器执行。

     健壮性:当输入数据非法时,算法也能适当地做出反应或进行处理,而不会产生莫名的输出结果。

    效率与低存储量需求:

三.算法分析:

   算法是由控制结构(顺序、分支和循环3种)和原操作(指的是固有数据类型的操作)构成,则算法时间取决于两者的综合效果。为了便于比较同一个问题的不同算法;通常,从算法中选取一种对于所研究的问题(或算法类型)来说是基本操作的原操作。以该基本操作重复执行的次数作为算法的时间度量。

   1.时间复杂度:

    一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,算法的时间度量记做:

它表示随问题规模n的增大,算法执行时间的增长率和函数的增长率相同,称作算法的渐近时间复杂度(asymptotic time complexity),简称时间复杂度。

   2.时间复杂度分析:

       只关注循环执行次数最多的一段代码

          我们在分析一个算法,臆断代码的时间复杂度的时候,也只关注循环执行次数最多的那一段代码就可以了。

       加法法则:总复杂度等于量级最大的那段代码的复杂度。

       乘法法则:嵌套代码的复杂度等于嵌套内外代码复杂度的乘积。

   3.几种常见时间复杂度示例分析:

       

          常量阶O(1):代码的执行时间不随着n的增大而增长,这样的代码的时间复杂度我们记做O(1)。

          O(logn)、O(nlogn)

 i=1;
 while (i <= n)  {
   i = i * 2;
 }

    4.空间复杂度:

       空间复杂度全称渐近空间复杂度(asymptotic space complexity),表示算法的存储空间与数据规模之间的增长关系。

 

    5.最好情况时间复杂度(best case time complexity):在最理想的情况下,执行这段代码的时间复杂度。

    6.最坏情况时间复杂度(worst case time complexity):在最糟糕的情况下,执行这段代码的时间复杂度。

    7.平均情况下时间复杂度(average case time complexity):将每种情况发生的概率考虑进去,引入加期望值。求出期望时间复杂度。

    8.均摊时间复杂度(amortized time complexity):

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值