数据结构与算法

一、数据结构研究的内容:

1 逻辑结构:

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

      b、树型结构:数据元素之间存在着一对多的层次关系;

      c、图状结构:数据元素之间存在着多对多的任意关系。

2 数据结构的延伸及基本算法:

   a、串:字符串的简称;

   b、数组:数组是一种数据类型,它是一种顺序存储结构;

   c、查找:数据结构要跟算法结合起来才有意义,查找算法是数据结构在算法中的应用,在现实生活中也经常用到查找;

3 存储结构:

   存储结构(物理结构)是逻辑结构在计算机中的存储映像,是逻辑结构在计算机中的实现(存储表示),他包含数据元素的表示和关系的表示。

   逻辑结构与存储结构的关系为:存储结构式逻辑结构的映像与元素本身的映像。逻辑结构是抽象,存储结构是实现,两者综合起来建立了数据元素之间的结构关系。

   存储结构一般有顺序存储和链表存储两种方式。

4 运算集合:

   讨论数据结构是为了在计算机中实现所需的操作,施加于数据元素之上的一组操作构成了数据的运算集合,因此与运算集合是数据结构很重要的组成部分。

二、数据结构的基本概念:

1、数据

    数据是描述客观事物的数值、以及所有其他能输入到计算机中,且能被计算机处理的各种符号的集合。简言之,数据就是存储在计算机中的信息。

2、数据元素与数据项

     数据元素是组成数据的基本单位,是数据集合的个体,在计算机中通常作为一个整体进行考虑和处理。一个数据元素可由一个或多个数据项组成,数据项是有独立含义的最小单位(不可再分割)。如每一个学生的信息是一个数据项,它包含的学号、姓名等多个数据项。

3、数据对象

    数据对象是性质相同的数据元素的集合,是数据的一个子集。例如:整数数据对象是集合N={0,1,2,...},字母字符数据对象是集合C={'A','B','C',...,'Z'}。

4、数据类型

    数据类型是一组性质相同的值集合以及定义在这个值集合上的一组操作的总称。值集合确定了该类型的取值范围,操作集合确定了该类型中允许使用的一组运算。

5、抽象数据类型

    抽象数据类型是指基于一类逻辑关系的数据类型。抽象数据类型的定义取决于客观存在的一组逻辑特性,而与其在计算机内如何表示和实现无关。

三、算法及其描述

1、算法的概念和特性

    a、有穷性:一个算法在执行若干个步骤之后应该能够结束,而且每一步都在有限时间内完成;

    b、确定性:算法中的每一步都必须有确切的含义,不能产生二义性;

    c、可行性:算法中的每一个步骤都应该能有效地执行,并得到确定的结果;

    d、输入:指算法执行时从外界取得的必要数据。一个算法可以有零个或多个输入。

    e、输出:一个算法有一个或多个输出,输出时算法进行数据处理后的结果。没有输出的算法是毫无意义的。

2、算法设计的要求

    a、正确性:算法对于一切合法的输入数据都能够得到满足要求的结果;

    b、可读性:算法的可读性是指人对算法阅读理解的难易程度,可读性高的算法便于交流,有利于算法的调试和修改;

    c、健壮性:对于非法的输入数据,算法能给出相应的响应而不是产生不可预料的后果;

    d、效率与低存储量需求:效率指的是算法的执行时间。对于解决同一问题的多个算法,执行时间短的算法效率高。存储量需求指算法执行过程中所需要的最大存储空间。存储量需求越小的算法效率越高。

3、算法的分析

    a、算法的时间复杂度:一个算法的执行时间大致上等于所有语句执行时间的总和。

    b、算法的空间复杂度:采用空间复杂度作为算法所需存储空间的量度。

四、线性表

1、定义:线性表示一个含有n个节点的有限序列,表示为:(a1,a2,a3...,an);

2、特征:线性表具有均匀性和有序性两大特点:对于均匀性,同一线性表的各个数据元素必定具有相同的数据类型和长度;而有序性体现在各个数据元素在线性表中的位置只取决于他们的序号,数据元素之间的相对位置是线性的。

一个非空线性表有以下几个特征:

             a、有且仅有一个开始结点a1,没有直接前趋,而且仅有一个直接后继a2;

             b、有切仅有一个终端结点an,没有直接后继,而且仅有一个直接前趋an-1;  

             c、其余的内部结点都有切仅有一个直接前趋和一个直接后继。

3、基本运算

    a、求表长:线性表中的元素个数;

    b、遍历:从左到右(或反向)扫描(读取)表中的各元素;

    c、按编号查找:找出表中的第i个元素;

    d、按特征查找:按某个特定值查找线性表;

    e、插入:在第i个位置上(原第i个元素前)插入一新元素;

    f、删除:删除原表中的第i个元素;

    g、排序:按元素某特征值的递增(递减)排序,重排表中各元素。

五、栈和队列

    栈和队列都是特殊形式的线性表。

1、栈:栈是一种特殊的线性表,且仅在表的一端允许插入和删除,这就是栈的概念。允许插入的一端叫栈顶,另一端叫栈底,将元素插入栈顶的操作称为”进栈“,称删除栈顶元素的操作叫”出栈“。栈也被称为一种后进先出表(LIFO)。可以类比考生交试卷,后交的试卷老师会优先批阅;

     栈的基本运算:

     a、栈初始化:置栈为空栈;

     b、判断是否为空:若栈为空,则返回true,否则返回false;

     c、求栈的长度:返回栈的元素个数;

     d、进栈:将一个元素下推进栈;

     c、出栈:将栈顶的元素托出栈;

     e、读栈顶:返回栈顶元素。

2、队列:与栈一样,队列也是一种特殊的线性表,它仅允许在队首出队运算,在队尾进行入队操作,因为出队时先入队的元素先出,所以队列又被称为是一种“先进先出”表,简称为FIFO(First IN First Out)。

      队列的基本运算:

      a、队列初始化:置队列为空队;

      b、判断队列是否为空:若队列为空,则返回true,反之返回false;

      c、求队列的长度:返回队列的元素个数;

      d、读队首:返回队列元素之值;

      e、入队:将一个元素插入队尾;

      f、出队:将队首元素从队列中删除。

六、树

  树型结构的数据元素之间呈现分支、分层的特点。树型结构在客观世界中广泛存在,如家族的家谱,各种社会组织结构都可以用树形象地表示。在计算机领域中,操作系统中的目录树,数据库中信息的组织形式也用到树型结构。

1、树的基本概念:

    树由n个结点构成的有限集合T,当n=0时T为空树,否则在任一非空树T中都具备以下两个特点:

    a、有且仅有一个特定的结点,它没有前驱结点,称其为跟结点(root结点);

    b、剩下的结点可分为m个互不相交的子集T1,T2,...Tm,其中每个子集本身又是一颗树,并称其为跟的字树;

2、树的表示方法:

    a、直观表示法:树形;

    b、嵌套集合(文氏图)表示法:如图6.3(a)所示;

    c、凹入(锁进)表示法:如图6.3(b)所示;

    d、广义表(嵌套括号)表示法:如图6.3(c)所示。

  

3、树的常用术语:

   a、结点:A、B、C、D等;

   b、结点的度:结点的度指一个结点拥有的字树个数(A的度为3,C的度为1);

   c、树的度:树中结点的最大度树。

   d、叶子:度为零的结点称为叶子(E、F、K、L、H、I、J);

   e、分支结点:度不为零的结点,一般除了叶子结点外,其他都是分支结点;

   f、孩子和双亲:结点的子树称为该结点的孩子,相应地,该结点称为孩子的双亲。

   g、兄弟:同一个双亲的孩子之间互称为兄弟。

   h、祖先和子孙:结点的祖先是指从根到该结点所经分支上的所有结点。相应地,以某一结点为根的子树中的任一结点称为该结点的子孙。

   i、结点的层次:结点的层次从根开始定义,跟结点的层次为1,其海次结点的层次为2,以此类推,任意结点的层次为双亲结点层次加1。

   j、堂兄弟:双亲在同一层的结点互为堂兄弟。

   k、树的深度:树中结点的最大层次称为树的深度。6.2(b)所示的树的深度为4。

   l、有序树和无序树:将树中每个结点的各子树看成是从左到右有次序的,则称该树为有序树,否则为无序树;

   m、森林:森林是m颗互不相交的树的有限集合。对树中每个结点而言,其子树的集合即为森林;反之,若给森林中的每颗树的跟结点都赋予同一个双亲结点,便得到一颗树。

4、树的基本操作:

   a、初始化:将树T初始化为一颗树;

   b、判断树空:判断一颗树是否为空,为空返回true,否则返回false;

   c、求根结点:返回树的根结点;

   d、求双亲结点:返回x的双亲结点,如果x为根结点,返回空;

   e、求孩子结点:求结点x的第i各孩子结点,若结点x是叶子结点,活着无第i各孩子结点,则返回空;

   f、插入子树:将根为y的子树置为树T中结点x的第i颗子树;

   g、删除子树:删除树T中结点x的第i颗子树;

   h、遍历树:从根结点开始,按照一定的次序访问树中的所有结点;

5、树的存储结构

   为了要存储树中各结点本身的数据信息,还要能唯一地反映树中各结点之间的逻辑关系。常用的数组存储树的方式:双亲(数组)表示法。

   双亲(数组)表示法是树的一种顺序存储结构,这种表示法用一维数组来存储树的相关信息,将树中的结点按照从上到下、从左到右的顺序存放在一个一维数组中,每个数组元素中存放一个结点的信息,包含该结点本身的信息和该结点双亲的位置信息,即双亲的下标值。

   a、二叉树:n个结点的有限集合,它或者是空寂,或者由一个根结点和两颗分别为左子树和右子树的互不相交的二叉树组成;

       其特点是每个结点至多有两颗子树(度<=2),二叉树的子树有左右之分,次数不能颠倒。

       二叉树的基本操作:初始化、判断二叉树是否为空、求根结点、求双亲结点、求二叉树的高度、求结点的左孩子、求结点的右孩子、遍历二叉树;

       二叉树的存储结构:可用一维数组实现,即将完全二叉树上编号为i的结点元素存储在一位数组下标为i的元素中。

       二叉树的遍历:先跟次数(前序、先序)遍历【DLR】,中跟次序(中序)遍历【LDR】和后跟次序(后序)遍历【LRD】。

  c、二叉树应用---哈夫曼树:

      哈夫曼树又称为最优二叉树,是一类带权路径长度最短的二叉树。

      相关算法的效率不仅取决于元素在二叉树中的位置,还与元素的访问频率有关。若能使访问频率高的元素右较少的比较次数,则可提高算法的效率,这正是哈夫曼树要解决的问题。

      几个基本概念:

      1、路径:树中一个结点到另一个结点之间的分支构成的两个结点的路径。并不是树中所有结点都有路径,如兄弟结点之间就没有路径,但从根结点到任意一个结点之间都有一条路径;

      2、路径长度:路径上的分支数目称为两结点之间的路径长度;

      3、树的路径长度:从根结点到树中每一结点的路径长度之和;

      4、结点的权:给树中结点赋予了一个有某种意义的数,称为该结点的权;

      5、结点的带权路径长度:从该结点到树根之间的路径长度与结点上权的乘积;

      6、树的带权路径长度:树中所有叶子结点的带权路径长度之和;

      7、哈夫曼树(最优二叉树):在权为w1,w2,...,wn的n个叶子结点的所有二叉树中,带权路径长度WPL最小的二叉树称为最优二叉树或哈夫曼树;

七、查找

     查找算法:顺序查找,折半查找,分块查找,二叉树排序树查找,哈希表查找。

     1、顺序查找算法:时间复查度为O(n);

     2、折半查找算法:也叫二分查找。最大特点:被查找表是一个有序的表,程序每次都可以排除一半不符合条件的数据。时间复杂度:O(log2n),折半查找的效率比顺序查找高很多;

     3、分块查找算法:又称索引顺序查找,是介于顺序查找和折半查找之间的一种折中的查找方法,它不要求表中所有记录有序,但要求表中记录分块有序,基本思想是:首先从查找索引表,索引表是有序表,可采用二分查找或顺序查找,以确定待查的结点在哪一块,然后在已确定的块中进行顺序查找,由于块内无序所以只能用顺序查找。分块查找的效率介于顺序查找和折半查找之间。

     4、哈希表的查找:哈希表查找是通过在数据与其内存地址之间建立的关系进行查找的方法。哈希函数是指将数据和物理地址之间建立的对应关系,利用这样的函数可使查找次数大大减少,提高查找效率。

         构造哈希函数原则:a、函数本身计算简单;b、对关键字集合中的任意一个关键字k,H(k)对应不同地址的概率是相等的,即任意一个记录的关键字通过哈希函数的计算得到的存储地址的分布要尽量均匀,目的是为了尽可能减少冲突。

         哈希查找必须解决两个主要问题:a、构造一个计算简单而且冲突尽量少的哈希函数;b、给出处理冲突的方法。

         哈希函数的构造方法:

         a、直接定址法;

         b、平方取中法;

         c、数子分析法;

         d、除留余数法;

         e、随机数法。

         处理冲突的方法:

         a、开放定址法;

         b、拉链法。

八、排序

     插入排序:直接插入排序和希尔排序;

     交换排序:冒泡排序和快速排序;

     选择排序:直接选择排序

     归并排序。

    1 直接插入排序:将关键字插入有序序列后依然有序,时间复杂度:O(n2);

    2 折半插入排序:可以减少关键字的比较次数,关键字的比较次数最多n/2次,移动记录的次数和直接插入排序相同,故时间复杂度仍为O(n2);

    3 希尔排序:分组后进行插入排序。时间复杂度为O(n1.3);

    4 冒泡排序:对排序序列的相邻记录的关键字进行比较,使较小的关键字的记录往前移,二较大关键字的记录往后移。时间复杂度为O(n2);

    5 快速排序:i,j两个指针,以第一个数字为基准,j指针从右至左快速扫描序列,扫描到小于基准的前移到i指针位置,然后换i指针从左至右快速扫描碰到大于基准的移动到j指针所在位置,如此交替,直到i=j为止,此时i左边的都小于基准,i右边的都大于基准,然后将基准放入i位置,完成排序,时间复杂度:O(nlog2n);

    6 直接选择排序:在n个记录中找到最小的与第一个记录交换位置,然后在剩下的n-1个记录中找出一个关键字最小的记录与第2个记录交换位置,时间复杂度:O(n2);

    7 归并排序:将n个有序子序列合并为一个有序序列,算法的时间复杂度为:O(nlog2n)。 

   

posted @ 2017-05-29 14:31  sky_wild  阅读(329)  评论(0编辑  收藏  举报