0%

计算机基础知识(二)数据结构与算法

1、掌握程序性能分析的概念和方法,包括时间复杂性与空间复杂性分析。

一 定义

衡量一个算法的性能,除了能实现需求之外。进阶就是考虑在算法运行过程中时间和资源的消耗。
时间复杂度:执行当前算法所消耗的时间; 
空间复杂度:执行当前算法所需要占用的内存空间;

时间复杂度与空间复杂度是紧密相连的。对于我们程序开发来说:时间复杂度与空间复杂度是可以相互转化的。
1.以空间换时间:对于执行慢的程序,消耗内存来减少时间,提高效率。
2.以时间换空间:对于程序来说,增加时间,减少效率,节省内存空间。

二 计算

1 时间复杂度(使用O符号表示法,表示代码执行时间的增长变化趋势)
  T(n)=O(f(n))   // f(n)表示每行代码执行次数之和,O表示正比例关系
2 空间复杂度 S(n)

三 常用的复杂度量级

1 时间复杂度(从上往下复杂性增加)
常数阶O(1):消耗的时间并不随某个变量n变化而变化
对数阶O(logN):当数据增大n倍,耗时增大logn倍(以2为底)。如二分查找
线性阶O(n):如n决定的for循环,消耗的时间随着n的变化而变化
线性对数阶O(nlogN):将时间复杂度为O(logN)的代码循环N遍,如归并排序
平方阶O(n²):把 O(n) 的代码再嵌套循环一遍
立方阶O(n³):3层N循环
K次方阶O(n^k):k层N循环
指数阶(2^n)

2 时间复杂度
O(1):所需要的临时空间并不随某个变量n变化而变化
O(n):如new了一个大小为n的数组,int[] m = new int[n];
O(n^2)

2、掌握线性表的概念,掌握堆栈、队列、跳表和散列的描述方法与应用。

线性表

线性表是最基本、最简单、也是最常用的一种数据结构。线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。
线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的(注意,这句话只适用大部分线性表,而不是全部。比如,循环链表逻辑层次上也是一种线性表(存储层次上属于链式存储,但是把最后一个数据元素的尾指针指向了首位结点)。

堆栈

堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。在单片机应用中,堆栈是个特殊的存储区,主要功能是暂时存放数据和地址,通常用来保护断点和现场。

队列

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。

跳表

增加了向前指针的链表叫作跳表。跳表全称叫做跳跃表,简称跳表。跳表是一个随机化的数据结构,实质就是一种可以进行二分查找的有序链表。跳表在原有的有序链表上面增加了多级索引,通过索引来实现快速查找。跳表不仅能提高搜索性能,同时也可以提高插入和删除操作的性能。

散列

Hash,一般翻译做散列、杂凑,或音译为哈希,是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。

3、了解树的描述方法与应用。

定义

树是一种数据结构,它是由n(n≥1)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。

它具有以下的特点:
每个节点有零个或多个子节点;
没有父节点的节点称为根节点;
每一个非根节点有且只有一个父节点;
除了根节点外,每个子节点可以分为多个不相交的子树。

种类

无序树:树中任意节点的子结点之间没有顺序关系,这种树称为无序树,也称为自由树;
有序树:树中任意节点的子结点之间有顺序关系,这种树称为有序树;
二叉树:每个节点最多含有两个子树的树称为二叉树;
满二叉树:叶节点除外的所有节点均含有两个子树的树被称为满二叉树;
完全二叉树:除最后一层外,所有层都是满节点,且最后一层缺右边连续节点的二叉树称为完全二叉树;
哈夫曼树(最优二叉树):带权路径最短的二叉树称为哈夫曼树或最优二叉树。

4、了解图的描述方法与应用。

一个图就是一些顶点的集合,这些顶点通过一系列边结对(连接)。顶点用圆圈表示,边就是这些圆圈之间的连线。顶点之间通过边连接。

有向图

加权图