数据结构与算法

1、数据结构研究的内容:算法

1 逻辑结构:数据库

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

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

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

2 数据结构的延伸及基本算法:操作系统

   a、串:字符串的简称;设计

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

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

3 存储结构:对象

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

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

   存储结构通常有顺序存储和链表存储两种方式。

4 运算集合:

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

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

一、数据

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

二、数据元素与数据项

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

三、数据对象

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

四、数据类型

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

五、抽象数据类型

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

3、算法及其描述

一、算法的概念和特性

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

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

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

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

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

二、算法设计的要求

    a、正确性:算法对于一切合法的输入数据都可以获得知足要求的结果;

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

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

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

三、算法的分析

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

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

4、线性表

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

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

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

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

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

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

三、基本运算

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

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

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

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

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

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

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

5、栈和队列

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

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

     栈的基本运算:

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

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

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

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

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

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

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

      队列的基本运算:

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

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

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

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

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

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

6、树

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

一、树的基本概念:

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

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

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

二、树的表示方法:

    a、直观表示法:树形;

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

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

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

  

三、树的经常使用术语:

   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颗互不相交的树的有限集合。对树中每一个结点而言,其子树的集合即为森林;反之,若给森林中的每颗树的跟结点都赋予同一个双亲结点,便获得一颗树。

四、树的基本操做:

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

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

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

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

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

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

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

   h、遍历树:从根结点开始,按照必定的次序访问树中的全部结点;

五、树的存储结构

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

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

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

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

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

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

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

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

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

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

      几个基本概念:

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

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

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

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

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

      六、树的带权路径长度:树中全部叶子结点的带权路径长度之和;

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

7、查找

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

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

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

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

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

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

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

         哈希函数的构造方法:

         a、直接定址法;

         b、平方取中法;

         c、数子分析法;

         d、除留余数法;

         e、随机数法。

         处理冲突的方法:

         a、开放定址法;

         b、拉链法。

8、排序

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

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

     选择排序:直接选择排序

     归并排序。

    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)。 

相关文章
相关标签/搜索