【NCRE学习笔记002】二级公共基础知识----数据结构与算法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014576936/article/details/88745170

目录

1、算法复杂度

2、数据结构

3、逻辑结构和存储结构

4、线性结构和非线性结构

5、栈

6、队列

7、链表

8、二叉树

9、二叉树概念及其基本性质

10、二叉树遍历

11、查找

12、顺序查找

13、二分法查找

14、排序



1、算法复杂度

  • 算法基本特征:
    • 可行性;
    • 确定性;
    • 有穷性;
    • 拥有足够的情报。
  • 算法的基本运算和操作:
    • 算术运算;
    • 逻辑运算;
    • 关系运算;
    • 数据传输。
  • 算法的基本控制结构:
    • 顺序结构;
    • 选择结构;
    • 循环结构。
  • 算法的基本设计方法:
    • 列举法、归纳法、递归、递推、减半递推技术、回溯法。
  • 指令系统:
    • 指的是计算所系统能够执行的所有指令的集合。
  • 算法复杂度:
    • 时间复杂度;
    • 空间复杂度。

2、数据结构

  • 数据结构:
    • 指的是相互有关联的数据元素的集合。
  • 数据结构研究:
    • 数据集合中各数据元素之间所固有的逻辑关系,即数据的逻辑结构;
    • 在对数据进行处理时候,各数据元素在计算机中的存储关系,即数据的存储结构;
    • 对各种数据结构进行的运算。

3、逻辑结构和存储结构

  • 逻辑结构:是对数据元素之间逻辑关系的描述。
  • 两个要素:数据元素的集合D、D上面的关系R。
  • 因此一个数据结构可看成:B = (D,R)。
  • 二元组表示:
    • D = {春,夏,秋,冬}
    • R = {(春,夏),(夏,秋),(秋,冬)}
  • 存储结构:数据的逻辑结构在计算机存储空间中的存放形式。也成为数据的物理结构。
  • 分类:
    • 顺序:用于线性的数据结构,把逻辑上相邻的数据元素存储在物理上相邻的存储单元里,节点之间的关系有存储单元的邻接关系来体现。
    • 链接:在每个节点中至少包含一个指针域,用指针来体现数据元素之间逻辑上的联系。

4、线性结构和非线性结构

  • 数据结构中各元素之间的前后间关系的复杂程度。
  • 线性结构:(线性表)(栈、队列、串)
    • 有且只有一个根节点;
    • 每一个节点最多有一个前件,最多有一个后件
  • 非线性结构(数组、广义表、树和图)
  • 线性表的顺序写存储结构基本特点:
    • 线性表中所有元素所占的存储空间是连续的。
    • 线性表中各数据元素在存储空间中是按照逻辑顺序依次存放的。
  • 元素ai的存储地址为:ADR(ai)=ADR(a1)+(i-1)k。就是第一个元素的地址加上k每个元素站的字节数乘以i-1.
  • 顺序表的运算有:
    • 查找、插入、删除。

5、栈

  • 特殊的线性表。,只限定在一段进行插入和删除。
  • 栈顶、栈底。表中么有元素是称为空栈。先进后出,后进先出。子弹盒。FIFO。
  • 栈的顺序存储及其运算。
    • 入栈:在栈顶位置插入一个新的元素。
    • 退栈:取出栈顶元素并赋值给一个指定的变量。
    • 读栈顶元素:将栈顶元素赋值给一个指定的变量。

6、队列

  • 允许插入的是队尾。允许删除的是队头。LILO。
  • 先进先出原则。后今后出。火车进隧道。Q=(q1、q2、q3、q4.....qn)
  • 排头元素、队头:q1,队尾元素:qn。先来先服务。
  • 队列运算:
    • 入队:在队列的队尾插入一个数据元素。
    • 退队:在队头删除一个数据元素。
  • 队列的顺序存储结构一般采用队列循环的形势。循环队列s=0表示队列空。s=1且front=ear表示队列满。计算循环队列的元素个数:尾指针减头指针。若为负数,再加上其容量即可。

7、链表

  • 节点的一部分用于存放数据元素值:数据域。另一部分用于存放指针,指针域。指针用来指向该节点的前一个或者后一个节点(前件或后件)。
  • 链式存储结构既可以用来表示线性结构、也可以表示非线性结构。
  • (1)线性链表;
    • 线性表的链式存储结构。
    • 对线性链表的每个节点设置两个指针,一个称为左指针,用来指向其前一个节点。另一个是右指针,用来指向其后一个节点。成为双向链表。
    • 线性链表中个数据元素节点的存储空间可以是不连续的,并且各数据元素的存储顺序与逻辑顺序可以不一致。
    • 在线性链表中进行插入与删除,不需要移动链表中的元素。
  • (2)带链的栈:
    • 栈也是线性表,也可以采用链式存储结构。
    • 带链的栈可以用来搜集计算机存储空间中所有空闲的存储节点,这种带链的栈称为可利用栈。

8、二叉树

  • 二叉树是一种很有用的非线性结构,具有以下两个特点:
  • ① 非空二叉树只有一个根结点;
    ② 每一个结点最多有两棵子树,且分别称为该结点的左子树和右子树。
  • 在二叉树中,每一个结点的度最大为 2,即所有子树(左子树或右子树)也均为二叉树。另外,二叉树中的每个结点的子树被明显地分为左子树和右子树。
  • 在二叉树中,一个结点可以只有左子树而没有右子树,也可以只有右子树而没有左子树。当一个结点既没有左子树也没有右子树时,该结点即为叶子结点。

9、二叉树概念及其基本性质

  • 似乎一种很有用的非线性结构。
  • 特点:
    • 非空二叉树只有一个根节点。
    • 每一个节点最多有两颗子树,且分别成为该节点的左子树和右子树。
  • 在二叉树中,每一个节点的度最大为2,即所有子树也均为二叉树。另外,二叉树的每个节点的子树被明显的分为左子树和右子树。
  • 在二叉树中,一个节点可以只有左子树没有右子树,也可以只有右子树没有左子树。
  • 当一个节点既没有左子树,也没有右子树,那么,该节点即为  叶子节点。
  • 例如,一个家族中的族谱关系如图 1-1 所示:
    A 有后代 B, C; B 有后代 D, E; C 有后代 F。
    典型的二叉树如图 1-1 所示:
    详细讲解二叉树的基本概念,见表 1-2。
  • 基本性质:
    • 在二叉树的第K层上,最多有2的K-1次方个节点,K>=1;
    • 深度为M的二叉树最多有2的M次方-1个节点;
    • 在任意一颗二叉树中,度为0的节点(即叶子节点)总是比度为2的节点多一个;
    • 具有n个节点的二叉树,其深度至少为(log2n)+1.其中long2n表示取long2n的整数部分。
  • 满二叉树是指这样的一种二叉树:出最后一层外,每一层上所有的节点都有两个子节点,在满二叉树中,每一层上的节点数都达到最大值,即在满二叉树的第K层上有2的K-1次方个节点,且深度为m的满二叉树有2的m次方-1个节点。
  • 完全二叉树:是指除最后一层外,每一层上的节点数军达到最大值,在最后一层上只缺少右边的若干节点。
  • 对于完全二叉树来讲,叶子节点只可能在层次最大得两层上出现:对于任何一个节点,若其右分支下的子孙节点的最大层次为P,则其左分支下的子孙节点的最大层次或为P,或为P+1.
  • 性质:

10、二叉树遍历

  • 在遍历二叉树的过程中,一般先遍历左子树,再遍历右子树。在先左后右的原则下,根据访问根结点的次序,二叉树的遍历分为三类:前序遍历、中序遍历和后序遍历。
  •  1)前序遍历
    先访问根结点,然后遍历左子树,最后遍历右子树;并且在遍历左、右子树时,仍需先访问根结点,然后遍历左子树,最后遍历右子树。例如,对图 1-1 中的二叉树进行前序遍历的结果(或称为该二叉树的前序序列)为: A, B, D, E,C, F。
  • ( 2)中序遍历
    先遍历左子树、然后访问根结点,最后遍历右子树;并且,在遍历左、右子树时,仍然先遍历左子树,然后访问根结点,最后遍历右子树。例如,对图 1-1中的二叉树进行中序遍历的结果(或称为该二叉树的中序序列)为: D, B, E,A, C, F。
  • ( 3)后序遍历
    先遍历左子树、然后遍历右子树,最后访问根结点;并且,在遍历左、右子树时,仍然先遍历左子树,然后遍历右子树,最后访问根结点。例如,对图 1-1中的二叉树进行后序遍历的结果(或称为该二叉树的后序序列)为: D, E, B,F, C, A。

11、查找

  • 查找是指在一个给定的数据结构中查找某个指定的元素。

12、顺序查找

  • 从线性表的第一个元素开始,依次将线性表中的元素与被查找的元素相比较,若相等则表示查找成
    功;若线性表中所有的元素都与被查找元素进行了比较但都不相等,则表示查找失败。
  • 在下列两种情况下也只能采用顺序查找:
    • ① 如果线性表为无序表,则不管是顺序存储结构还是链式存储结构,只能用顺序查找;
    • ② 即使是有序线性表,如果采用链式存储结构,也只能用顺序查找。
       

13、二分法查找

  • 二分法查找,也称拆半查找,是一种高效的查找方法。
  • 能使用二分法查找的线性表必须满足用顺序存储结构和线性表是有序表两个条件。
  • “有序”是特指元素按非递减排列,即从小到大排列,但允许相邻元素相等。下一节排序中,有序的含义也是如此。
  • 对于长度为 n 的有序线性表,利用二分法查找元素 X 的过程如下:
    • 步骤 1:将 X 与线性表的中间项比较;
    • 步骤 2:如果 X 的值与中间项的值相等,则查找成功,结束查找;
    • 步骤 3:如果 X 小于中间项的值,则在线性表的前半部分以二分法继续查找;
    • 步骤 4:如果 X 大于中间项的值,则在线性表的后半部分以二分法继续
      查找。
    • 例如,长度为 8 的线性表关键码序列为: [6, 13, 27, 30, 38, 46, 47, 70],被查元素为 38,首先将与线性表的中间项比较,即与第 4 个数据元素 30 相比较,38 大于中间项 30 的值,则在线性表[38, 46, 47, 70]中继续查找;接着与中间项比较,即与第 2 个元素 46 相比较, 38 小于 46,则在线性表[38]中继续查找,最后一次比较相等,查找成功。
    • 顺序查找法每一次比较,只将查找范围减少 1,而二分法查找,每比较一次,可将查找范围减少为原来的一半,效率大大提高。
    • 对于长度为 n 的有序线性表,在最坏情况下,二分法查找只需比较 log2n 次,而顺序查找需要比较 n 次。

14、排序

  • 1. 交换类排序法
    • ( 1)冒泡排序法
      • 首先,从表头开始往后扫描线性表,逐次比较相邻两个元素的大小,若前面
        的元素大于后面的元素,则将它们互换,不断地将两个相邻元素中的大者往后移
        动,最后最大者到了线性表的最后。
      • 然后,从后到前扫描剩下的线性表,逐次比较相邻两个元素的大小,若后面
        的元素小于前面的元素,则将它们互换,不断地将两个相邻元素中的小者往前移
        动,最后最小者到了线性表的最前面。
      • 对剩下的线性表重复上述过程,直到剩下的线性表变空为止,此时已经排
        好序。
      • 在最坏的情况下,冒泡排序需要比较次数为 n(n-1)/2。
    • ( 2)快速排序法
      • 任取待排序序列中的某个元素作为基准(一般取第一个元素),通过一次排
        序,将待排元素分为左右两个子序列,左子序列元素的排序码均小于或等于基准
        元素的排序码,右子序列的排序码则大于基准元素的排序码,然后分别对两个子
        序列继续进行排序,直至整个序列有序。
  • 2. 插入类排序法
    • ① 简单插入排序法,最坏情况需要 n(n-1)/2 次比较;
    • ② 希尔排序法,最坏情况需要 O(n1.5)次比较。
  • 3. 选择类排序法
    • ① 简单选择排序法,最坏情况需要 n(n-1)/2 次比较;
    • ② 堆排序法,最坏情况需要 O(nlog2n)次比较。
  • 相比以上几种(除希尔排序法外),堆排序法的时间复杂度最小。
     

end

猜你喜欢

转载自blog.csdn.net/u014576936/article/details/88745170