数据结构与算法复习提纲(详细版)

数据结构与算法复习提纲(详细版)
数据结构与算法复习提纲(详细版)

数据结构与算法复习提纲

第一章引论

一、数学知识复习

1、对数(重要公式:X A=B当且仅当A=log X B;关键思路:将对数转化成为指数分析)

2、级数(重要公式:∑A i和∑i A;关键思路:同时乘上某个系数再相减)

3、证明方法(数学归纳法和反证法:三个关键步骤(归纳基础、归纳假设、归纳证明))

二、C++类

1、构造函数(使用默认参数的构造函数;初始化列表)

2、访问函数和修改函数(关键字const)

3、接口与实现的分离(声明与实现必须精确匹配,两个例外:默认参数和explicit)

三、C++细节

1、参数传递(一般情形:单向传递/引用:双向传递/常引用:避免大对象的拷贝)

2、★三大函数(当数据成员含有指针类型,三大函数必须显式给出;避免浅复制)

⑴、析构函数(形式:~类名()/作用:释放资源)

⑵、复制构造函数(形式:类名(const 类名&rhs)/作用:利用已有对象复制一个新对象)

⑶、operator=(形式:const 类名&operator=(const 类名&rhs)/作用:赋值)

四、模板

1、★函数模板定义(template 通用函数定义)

2、★类模板⑴、定义(template class 类模板名)

⑵、调用(class 类模板名<实际参数> 对象名(参数))

3、函数对象(定义一个包含零个数据成员和一个成员函数的类,然后传递该类的实例)

五、矩阵

1、基本思想(矩阵利用向量的向量来实现,即vector array)

2、典型代码分析(包括构造函数和operator[]重载)

第二章算法分析

一、数学基础

1、重要定义

⑴、f(N)=Ο(g(N))(若存在正常数C和n0,使得当N≥n0时,有f(N)≤Cg(N))

⑵、f(N)=Ω(g(N))、f(N)=Θ(g(N))和f(N)=ο(g(N)))

2、★重要工具

⑴、性质:log k N=O(N)

⑵、洛比塔法则:判断两个函数的相对增长率

二、最大子列和问题

1、算法Ⅰ

⑴、算法思想(i表示序列起点,j表示序列终点,k从i扫描到j)

⑵、★时间复杂度分析(注意分析方法:∑(i:0~N-1)∑(j:i~N-1)∑(k:i~j))

⑶、★算法的缺陷(重复计算)

2、算法Ⅱ

算法思想(i表示序列起点,j表示序列终点(省略辅助变量k))

3、算法Ⅲ

⑴、★分治策略(递归程序:传递数组和左右边界,后者界定了数组要被处理的范围

/单行驱动程序:传递数组和0,N-1而启动递归程序)

⑵、算法思想(递归出口分析;最大子序列和的三种可能情况)

⑶、★时间复杂度分析(重要公式:T(N)=2T(N/2)+N)

4、算法Ⅳ(任何负的子序列不可能是最优子序列的前缀)

三、折半搜索

1、概念:折半查找(在已排好序的队列中查找数X)

2、算法思想(关键是分析low、high和mid)

第三章表、栈和队列

一、STL中的向量和表(STL,Standard Template Library,标准模板库)

1、STL定义了vector(向量)和list(双向链表)两个类模板

2、★★迭代器(iterator)

⑴、迭代器的作用(位置标记)

⑵、迭代器的声明(典例:vecto r::iterator)

⑶、迭代器的重要方法(STL定义了一对方法:iterator begin()、

iterator end()(返回最后一项的后面位置)、*itr(返回itr所指位置的对象的引用))

⑷、const_iterator(保证*itr返回常引用)

二、★向量的实现

1、数据成员(theSize:元素个数/theCapacity:容量/objects:基本数组)

2、构造函数和三大函数(重点分析operator=;复制构造函数与operator=的区别与联系)

3、两个基本操作(reserve(改变容量)和resize(改变大小))

4、重要操作(push_back和pop_back)

三、表的实现

1、Node类(数据成员:data、prev和next/重点:构造函数)

2、const_iterator类(数据成员:current/运算符重载:operator*,前后置++,==和!=)

3、iterator类(const_iterator的子类;注意两者唯一的区别)

4、list类

⑴、数据成员(theSize,头结点和尾结点(注意指向的位置))

⑵、构造函数和三大函数(关键:利用init例程,创建空双向链表)

⑶、基本操作(insert和erase操作)

⑷、重要操作(push_front、push_back、pop_front和pop_back)

四、栈ADT

1、栈的顺序实现

⑴、★重要概念:base和top(base:始终指向栈底位置/top:指向栈顶元素的下一个位置)

⑵、★重要条件(栈空条件:top=base;栈满条件:top-base>=stackSize)

2、栈的应用(分析算法思想:首先创建一个空栈并顺序读入符号)

⑴、平衡符号(关键:三种出错情况)

⑵、后缀表达式(遇见数则压栈;遇见操作符则连续两次弹栈,计算后再压栈)

⑶、中缀到后缀的转换(遇见数输出/遇见操作符,级别高则入栈,否则一直弹栈直到遇见级别更低的操作符/遇见(,入栈,直到遇见),则将()之间的所有操作符弹栈)

五、队列ADT(循环队列)

1、★重要概念:头指针和尾指针(front:指向对头元素;rear:指向队尾元素下一个位置)

2、★重要操作:入队和出队(入队rear++;出队front++)

3、★重要条件(队空条件:front=rear;队满条件:front=(rear+1)%maxSize

一、二叉查找树

1、二叉查找树的概念(对于每个结点X,左子树中的所有结点的值X)

2、二叉查找树结点类BinaryNode(element、left和right)

3、★二叉查找树的类模板

⑴、数据成员(根结点root)

⑵、析构函数和operator=(分别采用makeEmpty和clone例程)

⑶、基本操作(contains、findMIn和findMax操作)(分别利用递归和非递归方式实现)

⑷、重要操作(insert和remove操作)

二、A VL树(平衡二叉树)

1、★A VL树的概念和性质(空树的高度为-1)

⑴、概念:A VL树(双重条件:二叉查找树,且每个结点的左右子树高度差至多为1)

⑵、性质(高度h的A VL树,最少结点数s(h)=s(h-1)+s(h-2)+1))

2、★★A VL树的四种基本旋转(关键:作图分析)

⑴、理论分析:(当插入一个新结点时,通过旋转可以保持这棵树仍然是AVL树)

⑵、实际分析:(一字形:使用单旋转;Z字形:使用双旋转)

⑶、典例分析:(P107:倒序插入10~16)

3、★★A VL树的插入算法

⑴、A VL树的结点类AvlNode(同标准BinaryNode相比,增加一个height字段)

⑵、A VL树的插入操作(利用height()例程和四种基本旋转)

⑶、基本操作(右旋转(rotateWithLeftChild);左右旋转(doubleWithLeftChild))

三、伸展树

1、伸展树的基本思想(当一个结点被访问以后,它就要通过一系列旋转被推至根)

2、伸展树的效率(平均摊还时间为O(logN))

3、基本操作(一字形旋转和Z字形旋转)(通过P114典例分析)

四、树的遍历(使用递归实现)

1、中序遍历二叉查找树

2、利用后序遍历计算树的高度

五、B树(M叉查找树的一种实现方式;磁盘的访问代价太高)

1、重要概念:M阶B树(叶结点:数据;非叶结点:键/根、非根和叶结点的限制)

2、基本操作(插入:分裂方式/删除:领养和合并方式)

六、标准库中的set和map(了解内容)

1、set(排序后的,没有重复值的容器)

2、map(排序后的,由键和值组成的项的集合)

(典例:map>::const_iterator itr;)

一、★★链地址法

1、基本思想(将hash值相同的所有记录保存在同一个线性链表中)

2、实现链地址法的HashTable类模板

⑴、数据成员(thelists(链表数组)和currentsize(已存储结点个数))

⑵、核心操作:myhash()(散列到合适位置)

⑶、基本操作:makeEmpty()和contains()(关键:利用find例程)

⑷、重要操作:insert()和remove()

二、★★探测法

1、基本思想(hi(x)=(hash(x)+f(i))mod TableSize;其中f为冲突解决函数)

2、线性探测法和平方探测法(f(i)=i;f(i)=i2)

3、实现探测法的HashTable类模板

⑴、数据成员(HashEntry(通过HashType)定义;数组array和currentsize)

⑵、核心操作:findPos()(若x存在,返回位置;否则返回待插入位置)

⑶、基本操作:makeEmpty()(关键:打上EMPTY标记)

⑷、重要操作:insert()和remove()

三、★再散列(3个基本步骤:备份;增容并初始化;拷贝)

1、链地址法的再散列

2、探测法的再散列

第六章优先队列(堆)

一、★★二叉堆

1、基本概念:二叉堆(双重条件:完全二叉树;且堆序(任意结点小于它的所有后裔))

2、二叉堆的类模板(BinaryHeap)

⑴、数据成员(数组array;currentSize(当前堆的大小))

⑵、基本操作:(插入和删除操作必须考虑特殊情况)

Ⅰ、insert操作(关键:上滤)

Ⅱ、deleteMin操作(两种格式)(关键:下滤;调用percolateDown例程)

⑶、重要操作:buildHeap操作(从而得出构造函数)

3、重要定理:高为h的满二叉树的结点的高度和为2h+1-1-(h+1)(分析证明)

4、基本概念:d堆(二叉堆的简单推广)

二、★★左式堆

1、★★基本概念和性质

⑴、概念:零路径长npl(null path length,the shortest path from x to a node with null point)Ⅰ、重要性质:结点X的npl=min(左右孩子的npl)+1

Ⅱ、初值分析:npl(null)=0;npl(叶结点;度为1的结点)=1

⑵、重要概念:左式堆(双重条件:堆序;且npl(左孩子)>=npl(右孩子))

⑶、定理:在右路径上有r个结点的左式堆至少有2r-1个结点(左侧全部铺满)

2、★★左式堆的类模板(LeftistHeap)

⑴、数据成员(LeftistNode *root;左式堆结点LeftistNode增加一个npl字段)

⑵、关键操作:merge操作(驱动程序加两个merge完成;思想:大的合并到小的右子树)

⑶、重要操作:insert操作和deleteMin操作

3、斜堆(斜堆与左式堆的关系,类似伸展树与A VL树的关系)

⑴、概念:斜堆(具有堆序性质的二叉树)(即左式堆去掉npl限制)

⑵、基本操作:merge(除右路径上最后一个结点,每次合并都必须交换)

三、★★二项队列

1、基本概念和性质

⑴、概念:二项树(双重条件:堆序;Bk的递归定义)

⑵、重要概念:二项队列(由若干棵二项树构成)

⑶、重要性质(二项队列的两个性质:每个高度上至多有一棵二项树;可以用二项树的集合唯一表示任意大小的优先队列)

2、★★二项队列的类模板(BinomialQueue)

⑴、结点类BinomialNode(孩子兄弟表示法:leftchild指向结点最多的子树;rightsibling)

⑵、数据成员(指针数组theTrees;currentSize(按递减方式存放))

⑶、核心操作:combineTrees(同等高度的合并;保持堆序性质)

⑷、基本操作:merge(三个步骤:resize、carry和whichcase、清空(currentSize的作用))

⑸、重要操作:findMinIndex(寻找最小项)和deleteMin(H2:deletedTree和deletedQueue)

第七章排序

一、★插入排序

1、算法思想(插入到前面有序序列)

2、插入算法(关键:分析清楚边界情况(i控制插入趟数,j控制每趟中的插入位置))

二、一些简单排序算法的下界

1、逆序的概念、性质(一次相邻结点的交换,逆序改变1;逆序数=插入算法比较次数))

2、定理:N个互异元素的数组,其平均逆序数为N(N-1)/4

3、定理:通过交换相邻元素进行排序的任何算法平均需要Ω(N2)时间

三、希尔排序(ShellSort,缩减增量排序)

1、算法思想(由若干趟Hk排序构成;每趟Hk排序使用插入算法)

2、使用希尔增量的希尔排序(关键:三重循环(gap表Shell增量,i和j作用同插入排序)

3、定理:使用希尔增量的希尔排序的最坏运行时间为Ω(N2)(注意构造和严格证明)

四、★堆排序(heapSort)

1、算法思想(两个步骤:创建大堆;首尾交换并下滤)

2、堆排序算法(关键:基于二叉堆的buildHeap和percolateDown(修改为大堆))

五、★★归并排序(mergeSort)

1、算法思想(分治算法;合并两个已排序的表)

2、归并算法(由驱动程序、mergeSort和merge构成;关键:tempArray临时数组;而merge 包含三个while和一个拷贝)

3、★算法分析(关键公式:T(N)=2T(N/2)+N,叠缩求和法)

六、★★快速排序(quickSort)

1、算法思想(分治算法:选取枢纽元素pivot;将S分割S1和S2;对S1和S2递归调用)

2、快速算法(median3(关键:3元素中值法选取枢纽元素);quickSort(关键:i向右搜索第一个≥pivot的结点,j相反操作(注意i和j起始位置);还原pivot并从i处分割)

3、★★算法分析(关键公式:T(N)=T(i)+T(N-i-1)+CN)(i为S1中元素个数)

七、其它

1、间接排序(解决comparable对象复制代价太高的问题)

2、定理:只使用元素间比较的任何排序算法需要Ω(NlogN)次比较

3、桶排序(前提条件(正整数)和算法思想)

4、外部排序

⑴、外部排序的概念(大文件的排序,排序过程中需要进行多次的内、外存之间的交换)

⑵、基本思想(归并算法)

一、基本操作

1、find(x)操作(查找操作:返回x所属的集合)

2、unionSets(S1,S2)操作(求并操作:求集合S1和S2的并)

二、DisjSets类(不相交集类)

1、基本思想(利用树表示每个集合,根表示这个集合的名称;整个集合表示为一颗森林)

2、基本数据结构(关键:双亲表示法)

⑴、数据成员(数组S:(S[i]为i的双亲,其中-1表示根))

⑵、构造函数(数组S全部初始化为-1)

⑶、基本操作:find()操作和unionSets()操作

3、算法分析(unionSets操作为O(1),find操作的最坏情形为O(1))

三、灵巧求并算法

一、基本概念

1、关系R:A Relation R is defined on a set S is for every pair (a,b),a,b∈S,either True or False.

2、等价关系:满足自反、对称和传递等三条性质的关系

3、等价类(更准确的名称为:集合S上的R关系等价类)

等价类的作用:形成对集合S的一个划分

(即:根据关系R将集合S划分为S1,S2,S3……等等)

二、基本操作

1、find(x)操作:Return the name of set containing a given element.

2、unionSets(S1,S2)操作:(求并操作)Union two disjoint sets S1,S2

(对两个不相交的非空集合S1和S2求并)

三、不相交集类的基本数据结构

1、数据结构的表示

⑴、Use a tree to represent each set,the root can be used to name the set.

(利用树来表示每一个集合,而且利用该树的根结点来表示这个集合的名称)

⑵、这样,整个集合S可表示为一颗森林

2、数据结构的实现

采用双亲表示法实现(注意:双亲表示法是利用数组来存贮一棵树)

其中:

⑴、S[i]表示元素i的双亲结点

⑵、若i是根结点,则S[i]=-1

3、★★不相交集类的算法实现

(包括类的定义、构造函数的实现以及两个基本操作find和unionSets的实现)

4、★算法分析

⑴、unionSets操作的时间复杂度为O(1)

⑵、find操作的最坏时间复杂度为O(N)

Ⅰ、unionSets操作和find操作在算法效率上是一对矛盾的操作

Ⅱ、连续的求并操作,在最坏情况下会建立起一棵深度为N-1的树

Ⅲ、一般情况下,运行时间使针对连续混和使用M个指令来计算的

在这种情况下,M次连续操作在最坏情形下可能花费O(MN)时间

四、算法的改进

1、union Sets操作的改进

⑴、按大小求并(与按高度求并非常类似)

⑵、按高度求并(保证将比较浅的子树并入比较深的子树)

思路1:可利用每个根的数据元素来存贮整颗子树高度的负值

思路2:为了同原算法类定义和构造函数实现的兼容,我们假定只有一个根结点的树的高度为-1,依此类推

⑶、★算法分析

两种算法都将find操作的时间复杂度改进为O(log N)

(给出详细的证明)

(另外的一个结论是:对于连续M个指令,平均需要O(M)时间,

但最坏情形还是O(M log N))

2、find操作的改进-路径压缩(Path compression)

⑴、路径压缩的概念:

Every node on the path from x to the root has its parent changed to the root.

(从x到根的路径上每一个结点都使它的父结点变成根)

⑵、★路径压缩的算法实现

⑶、结论:路径压缩与按大小求并完全兼容,与按高度求并部分兼容

五、按秩求并和路径压缩的最坏情形

1、秩(rank)的概念:一个结点的秩,是指以该结点为根结点的子树的高度

2、几个重要引理

⑴、引理1:当执行一系列union指令以后,一个秩为r的结点必然至少有2r个后裔结点(包括它自己)

⑵、引理2:秩为r的结点至多有N/2r个

⑶、引理3:在求并查找算法的任意时刻,从树叶到根结点路径上的结点的秩单调增加

3、★重要定理:

当使用求并探测法和路径压缩时,算法在最坏情况下需要的时间为O(α(M,N))

其中,α(M,N)是Ackermann函数的逆

(推论:任意次序的M=Ω(N)次union/find操作花费的总运行时间为O(M log*N))

六、迷宫问题

1、算法思想:对于随机选中的一堵墙,使用union/find操作

2、算法分析:时间复杂度为O(N log*N)

第九章图论算法

一、图的表示

1、邻接矩阵(adjacent matrix)表示法(分析优缺点)

2、★邻接表(adjacency list)

Ⅰ、对每一个顶点,使用一个链表来存放与之邻接的所有顶点

Ⅱ、图的邻接表的一种简单的表示方式:Vector array

(使用一个数组来存放所有的顶点)

二、拓扑排序

1、概念:拓扑排序是对有向无环图的顶点的一种排序

2、★★拓扑排序的算法思想(可以使用Stack或者Queue来实现)

⑴、计算每一个顶点的入度

⑵、将所有入度为0的顶点放入一个初始为空的队列中

⑶、若队列非空,则v出队,且所有与v邻接的顶点的入度减1

⑷、若有顶点的入度降为0,则该顶点入队

3、★拓扑排序的算法(使用伪码描述)(注意:利用一个辅助变量来判断是否出现回路)

4、★算法分析:时间复杂度为O(|E|+|V|)

三、最短路径

1、无权最短路径(加权最短路径的特殊情形)

⑴、采用广度优先搜索(Breadth –First Search)的策略(层次遍历的推广)

⑵、★Vertex的数据结构

Ⅰ、known:当一个顶点被访问以后,其known置为true

Ⅱ、dist:从s到该顶点的距离

Ⅲ、path:引起dist变化的最后顶点(通过追溯path,可以得到s到该顶点的完整最短路径)⑶、★无权最短路径的算法思想和算法

(关键:使用一个队列来实现)

⑷、算法分析:时间复杂度为O(|E|+|V|)

2、加权最短路径

⑴、贪心算法(greed algorithm)

Ⅰ、Solve the problem in stages(分阶段进行)

Ⅱ、每个阶段都把出现的方案当成最优的解决方案

⑵、、★★Dijkstra算法思想和算法

Ⅰ、对所有结点初始化

Ⅱ、在所有known标记为false的结点中,寻找一个其dist值最小的结点

Ⅲ、扫描与v邻接的所有known标记为false的结点w,分析是否有必要update其dist值Ⅳ、更新w的path

⑶、★★Dijkstra的算法分析

Ⅰ、常规方法:通过扫描存放顶点的数组来寻找最小值,时间是O(|E|+|V|2)

Ⅱ、使用优先队列的deleteMin方法寻找最小值:,其时间是O(|E|log|V|+|V|log|V|)

3、具有负边值的图

⑴、★算法思想和算法:

综合了无权最短路径(采用队列)和Dijkstra算法(需要update)的思想

Ⅰ、不需要再设置known来判断结点是否已经被访问过

Ⅱ、扫描与v邻接的所有结点w,分析是否有必要update其dist值,再分析w是否入队⑵、★算法分析:时间是O(|E|×|V|)(给出详细证明)

4、无环图

⑴、★算法思想

以Dijkstra算法作为基础,但是顶点的选取采用拓扑原则(而不是寻找dist值最小的顶点)

⑵、基本概念:动作结点图和事件结点图(注意:两者的转换方法)

⑶、基本概念:最早完成时间,最晚完成时间,松弛时间(分析其计算公式)

⑷、基本概念:关键路径-由零松弛边组成的路径

四、网络流问题

1、概念:最大流问题

设有向图G=(V,E)的每条边表示边容量,求从给定的源点s到汇点t可通过的最大流量

2、算法思想

⑴、辅助工具:流图(初始:每条边均为0)和残余图(初始:等于原图)

⑵、从残余图中选择一条增长路径(关键:对流图和残余图进行调整)

⑶、算法一直运行到没有增长路径为止

五、最小生成树

1、基本概念和性质

⑴、生成树的概念和性质

概念:Spanning tree is a tree formed from graph edges that connects all vertices of G.

性质:生成树的边数为N-1

⑵、最小生成树的概念和性质

MST性质:若(u,v)是一条具有最小权值的边,其中u∈U,v∈V-U,则必存在一棵包含边(u,v)的最小生成树

2、Prim算法

⑴、★Prim算法的基本思想:

设G=(V,E),TE是G上最小生成树的边的集合

Ⅰ、初始:U={u0},TE={}

Ⅱ、从所有的(u,v)中寻找一条代价最小的边(u0,v0),其中u0∈U,v0∈V-U

Ⅲ、U=U∪{u0},TE=TE∪(u0,v0)

Ⅳ、上述操作一直做到U=V为止

⑵、★★Prim算法

Ⅰ、同Dijkstra算法非常类似,唯一区别在于dv的含义和更新方法不同

(这里dv是指从v到所有known顶点的最短边)

Ⅱ、注意:如何获取最后的最小生成树和计算出其代价

3、Kruskal算法

⑴、★★Kruskal算法的基本思想和算法

Ⅰ、使用优先队列来存放所有的边

Ⅱ、利用等价类的思想来决定(u,v)边是应该添加还是舍弃

⑵、Kruskal的算法分析:同Prim算法一样,其时间复杂度为(|E|log|V|)

六、深度优先搜索的应用

1、深度优先搜索(DFS,Depth-first search)(DFS是对前序遍历的推广)

⑴、★DFS算法思想和算法

通常情况下,DFS算法均由两个模板构成

Ⅰ、外围模板:针对整个图G进行(初始化,再扫描结点,若unvisited则调用核心模板)Ⅱ、核心模板:是一个从指定顶点开始的,非常简练的DFS递归程序

⑵、DFS算法分析:时间复杂度为O(|E|+|V|)

2、无向图

⑴、★概念:前序编号(对图G进行DFS,图中的各个顶点被依次访问的顺序编号)

⑵、★概念:DFS树(深度优先生成树)

对图G进行DFS以后,图中的所有边被分成两大类:前向边和后向边

其中所有的前向边构成了DFS树

⑶、算法思想和算法(分析以上概念的算法实现)

3、无向图的双连通性

⑴、概念:双连通性和割点

⑵、★low(v)的概念和计算方法

Low(v)是顶点v可到达的最低顶点编号(关键:计算low的三条法则)

⑶、割点的判断条件

若顶点v存在一个孩子结点w,有low(w)>=num(v),则v必然是一个割点

⑷、★算法:寻找连通图中的所有割点

该算法通过对图的两次遍历而实现(一次前序遍历和一次后序遍历)

Ⅰ、结点Vertex包含以下域:visited,num,low,parent

Ⅱ、首先计算图G的每个顶点的前序编号(计算出num和parent)

Ⅲ、利用一趟后序遍历对各个顶点计算low,并判断是否割点

4、欧拉回路

⑴、概念:欧拉环游和欧拉回路

⑵、欧拉定理:任何一个连通图存在欧拉回路的充分必要条件是图中所有顶点的度为偶数

⑶、★欧拉回路的算法思想

Ⅰ、数据结构的设计:遍历的路径采用链表保存;

为避免重复扫描邻接表,对每一个邻接表必须保留最后扫描到的边Ⅱ、对给定的顶点进行一次DFS

Ⅲ、选定一个拼接点,从该顶点开始进行DFS

Ⅳ、上述步骤重复进行,直到所有的边都被遍历

⑷、欧拉回路的算法和算法分析:时间复杂度为O(|E|+|V|)

5、有向图

⑴、按照与无向图相同的策略,对有向图进行DFS

(若图G非强连通的,则产生DFS森林)

⑵、有向图DFS的虚边有三种类型(无向图只有一种,即后向边)

后向边、前向边和交叉边

⑶、对有向图进行DFS的一个作用是:判断该有向图是否无环图

法则如下:一个有向图是无环图当且仅当它没有后向边

6、查找强分支

⑴、★查找强分支的算法思想:两次DFS

Ⅰ、首先对图G进行第一次DFS,得到DFS森林

(通过对DFS的后序遍历得到每个顶点的后序编号;并且将G的所有边反向得到GR)Ⅱ、再对GR进行第二次DFS,总是在编号最高的顶点开始一次新的深度优先搜索

⑵、★定理:按照上述算法生成的DFS森林中的每棵树都是一个强连通的分支

(分析其证明)

七、NP完全性介绍

1、P问题

指保证以多项式时间运行的算法

2、不可判定问题

⑴、可以证明:计算机不可能解决所有的问题,这些不可能解出的问题称为不可判定问题

⑵、著名的不可判定问题:停机问题

Ⅰ、什么是停机问题?

Ⅱ、停机问题的实质是:一个程序很难检查它自己

3、NP类

⑴、NP类代表非确定型多项式时间

这类问题在难度上稍逊于不可判定问题

⑵、判断一个问题是否NP问题的方法

如果我们能在多项式时间内证明一个问题的任意“是”的实例是正确的,那么这个问题就属于NP类

典例:哈密尔顿回路问题就是一个NP问题

⑶、NP类同其它集合的关系

Ⅰ、性质:NP类包括P类,即包括所有具有多项式时间解的问题

Ⅱ、性质:不是所有的可判定问题都是NP问题(即NP问题并不是不可判定问题的补集)典例:无哈密尔顿回路问题显然是一个可判定问题,但不是NP问题

4、NP完全问题

⑴、NP完全问题是NP问题的一个子集

⑵、重要性质:NP中的任何一个问题都可以多项式地归约成NP完全问题

⑶、证明一个问题是NP完全问题的方法

Ⅰ、首先证明该问题是NP问题

Ⅱ、然后将一个适当的NP问题变换到此问题

典例:假设哈密尔顿回路问题是一个NP完全问题,证明旅行商问题也是一个NP完全问题

第十章算法设计技巧

一、贪心算法

1、★贪心算法(greed algorithm)

⑴、Solve the problem in stages(分阶段进行)

⑵、每个阶段都把出现的方案当成最优的解决方案

(当算法终止时,希望局部最优成为全局最优)

2、调度问题

⑴、★调度问题的概念:将作业平均完成的时间最小化

(假设:非抢占调度,即一旦开始一个作业,就必须把该作业运行完)

⑵、多处理器情形

Ⅰ、实现步骤:(首先排序,然后按顺序开始作业,处理器之间轮流分配作业)

Ⅱ、证明:按照这种算法思想实现的,一定是最优解

⑶、将最后完成时间最小化(这是一个NP完全问题)

3、赫夫曼(Huffman)编码

⑴、概念:满树和前缀码

⑵、赫夫曼编码的算法思想(频率出现高的字符编码要短)

⑶、★赫夫曼编码的算法和算法分析

(采用优先队列时,运行时间为O(ClogC))

4、装箱问题

⑴、基本概念

Ⅰ、★概念:装箱问题(将物品装到最少数量的箱子中)

Ⅱ、★概念:联机装箱(每一件物品必须放入一个箱子之后才能处理下一个物品)⑵、联机算法

Ⅰ、重要性质:对于联机装箱问题不存在最优算法(分析其证明)

Ⅱ、★定理一:任意联机装箱算法的下界为4M/3(分析其证明)

⑶、下项适配

Ⅰ、下项适配的基本思想(能放入当前箱子则放,否则开辟一个新的箱子)

Ⅱ、★定理二:下项适配算法的上界为2M(分析其证明)

⑷、首次适配

Ⅰ、首次适配的基本思想(扫描并寻找第一个能放入的箱子,否则开辟一个新箱子)Ⅱ、定理三:首次适配算法的上界为17M/10

⑸、最佳适配

最佳适配的基本思想和上界分析(放入所有能够容纳它的最满的箱子中)

⑹、脱机装箱

Ⅰ、★首次适配递减的算法思想(首先排序,然后再使用首次适配算法)

Ⅱ、引理一:大小至多是1/3(分析其证明)

Ⅲ、引理二、个数至多是M-1(放入其它箱子中的物品个数至多是M-1,分析其证明)Ⅳ、★定理四、首次适配递减算法的上界是(4M+1)/3

Ⅴ、定理五、首次适配递减算法的上界可以缩减为11M/9+4

二、分治算法

1、分治算法(divide and conquer)

⑴、★分治算法的基本思想:分治算法由两个阶段构成

Ⅰ、分:递归解决较小的问题

Ⅱ、治:从子问题的解构建原问题的解

⑵、分治算法的特性(至少含有两个递归调用,且子问题是不相交的)

2、分治算法的运行时间

⑴、★定理六:方程T(N)=aT(N/b)+O(N K)的解(分析其证明)

⑵、定理七:方程T(N)=aT(N/b)+O(N K log P N)的解(定理六的推广)

⑶、定理八:若∑αi<1,T(N)=∑T(αiN)+O(N)的解为T(N)=O(N)

3、最近点问题

⑴、★概念:最近点问题(对于平面上的点列P,找出一对最近的点)

⑵、关键性质:在2δ×2δ区域上,考察点必为常数情形

⑶、最近点算法的基本思想

4、选择问题

⑴、★概念:选择问题(从含有N个元素的集合S中寻找第K个最小的元素)

⑵、概念:五分化中项的中项(分析其作用)

⑶、定理:使用“五分化中项的中项”的快速选择算法的运行时间为O(N)

5、一些算术问题的理论改进

⑴、整数相乘

Ⅰ、概念:实现两个N位数X和Y相乘

Ⅱ、★基本思想:分治算法(将X和Y拆分为两半:将递归调用次数从4降为3)⑵、矩阵相乘(同上分析)

三、动态规划

1、动态规划的基础知识

⑴、★重要性质:所有数学递推公式都可以直接翻译成递归算法

⑵、★动态规划的概念和作用

Ⅰ、概念:动态规划是解递归的一种技术(关键:将中间的计算结果保存下来)Ⅱ、作用:避免直接翻译引起的低效(关键:存在着大量的冗余计算)

⑶、典例分析:Fibonacci算法

Ⅰ、递归程序(分析运行时间,以及算法低效的原因)

Ⅱ、非递归程序(分析算法效率改进的原因)

2、矩阵乘法的顺序安排

⑴、基本知识:矩阵A(M1*M2)与矩阵B(M2*M3)相乘所需的乘法次数

⑵、性质一:T(N)的计算公式(表示顺序的个数)

⑶、性质二:M(Left,Right)的计算公式

(M(Left,Right)为矩阵A(Left)A(Left-1)…A(Right-1)A(Right)的相乘次数)⑷、★矩阵相乘的算法思想和算法

3、最优二叉查找树

⑴、★最优二叉查找树的概念

Ⅰ、概念:给定一组单词w1,w2,w3,…wn,以及它们出现的固定概率p1,p2,p3,…pn,如何在一棵二叉查找树中安放这些单词,使得总的期望访问时间最小

Ⅱ、最优二叉查找树与Huffman树的区别

(数据不仅仅出现在叶结点上,而且必须满足二叉查找树的性质)

⑵、★重要公式:最优二叉查找树的开销C(Left,Right)

⑶、最优二叉查找树的算法思想(同矩阵相乘很类似)

4、所有点对最短路径

⑴、概念:D(k,i,j)

(从顶点Vi到顶点Vj只使用V1,V2,V3,…Vk作为中间顶点的最短路径的权)

⑵、★重要公式:D(k,i,j)的计算公式

⑶、★所有点对最短路径的基本思想和算法

四、随机化算法

1、★随机化算法的概念和性质

⑴、概念:随机化算法(在算法期间,随机数至少有一次用于决策)

⑵、性质:特定的输入不再重要,重要的是随机数

2、随机数生成器

⑴、真正的随机数和伪随机数

⑵、★线性同余数生成器:X(i+1)=AX(i) mod M

Ⅰ、概念:种子(为了开始这个序列,X0必须给定;根据种子来生成X1,X2,X3,…)Ⅱ、概念:周期和全周期(若M为素数,存在一些对A的选择,使得序列以某个周期循环)⑶、★随机数生成器的类模板(分析存在的问题及其改进)

3、跳跃表

⑴、概念:带有到前面2i个表元素的链的链表

(这个概念较为复杂,最好通过一个典型的例子来掌握)

⑵、跳跃表

Ⅰ、概念:K阶结点(带有k个链的结点)

Ⅱ、性质:任意k阶结点上的第i阶链,链接到的下一个结点至少具有i阶

Ⅲ、★概念:跳跃表(利用k阶结点的条件取代前面苛刻的限制性条件)

Ⅳ、★算法思想:跳跃表的查找操作和插入操作

4、素性测试

⑴、★费马定理:如果P是素数,且0

Ⅰ、费马定理的重要性:给出了一个测试N是否素数的算法

Ⅱ、关键思想:这个算法偶尔会出错,但是可以让出错的几率任意小

⑵、★定理:如果P是素数,且0

⑶、算法思想和算法:一种概率素性测试算法

五、回溯算法

1、回溯算法

⑴、★概念:回溯算法(相当于穷举搜索的巧妙实现,但性能往往不太理想)

⑵、★概念:裁剪(在一步内删除一大组可能性的做法)

2、公路收费点重建问题

⑴、概念:公路收费点重建问题(从距离重建一个点集)

⑵、★公路收费点重建问题算法:驱动例程(D是距离集,X是点集)

Ⅰ、选定X[1]=0;X[N]=D.deleteMax()//先把头尾两个顶点的位置确定下来

Ⅱ、不妨假定X[N-1]=D.deleteMax()//确定第三个顶点

Ⅲ、判断X[N]-X[N-1]∈D

⑶、★★公路收费点重建问题算法:回溯的步骤

Ⅰ、关键:分析[Left..Right]中的各个点的Place位置

(即假设[1..Left-1]和[Left+1..Right]中各个点已放入正确位置)

Ⅱ、若D为空,则返回True;否则

dmax=D.findMax()//取出D中目前的最大值

Ⅲ、判断dmax的可能位置

//或者在最右边,或者在最左边(即X[Right]=dmax,或X[Left]=X[N]-dmax)

Ⅳ、以在最右边(X[Right]=dmax)为例:

A、修改X集合

B、修改D集合

C、递归调用Place

D、若递归调用的返回值为false;则回溯(将刚才删除的D集合中的边添加回来)

Ⅴ、同样分析最左边情形

3、博弈

⑴、极小极大策略

Ⅰ、使用一个求值函数来对一个位置的好坏进行量化

(计算机追求极大化,而人追求极小化)

Ⅱ、概念:终端位置(能够根据盘面判断胜负的位置);位置P的后继位置

Ⅲ、在复杂的情况下,我们到达递归的某个深度后只能停止搜索

(这就是所谓,计算机能向前看的步数)

⑵、★α-β裁剪的概念

Ⅰ、概念:α裁剪

findCompMove将其尝试性的极大值α传递给findHumanMove,若findHumanMove尝试性极小值低于α,则findHumanMove立即返回(最好根据图来理解此概念)

Ⅱ、概念:β裁剪

第十一章摊还分析

一、摊还分析的基本概念

1、★概念:摊还时间界(任意顺序的M次操作的最坏情形时间界)

2、性质:摊还时间界比对应的最坏情形时间界要弱

(对任意单次操作提供不了保障)

二、二项队列

1、★★重要定理:N个元素的二项队列可以通过N次相继插入而以时间O(N)建成

(分析证明)

⑴、引理:花费C个时间单位的一次插入导致在森林中净增加2-C棵树

⑵、假设:Ci表示第i次插入的代价,Ti表示第i次插入之后树的棵数,分析其公式

2、位势的概念和如何选择位势

⑴、★概念:位势(位势可以看成是一个储蓄帐户,如果一次操作的时间少于指定的时间,那么这个差额就被存储起来以备后用)

⑵、选择位势的方法

Ⅰ、选择位势函数的一种方法是保证位势函数的初始值为0,而且总是非负的

Ⅱ、消去实际时间中的一项

3、★★摊还公式:T(摊还时间)=T(实际时间)+Δ位势

4、★定理:insert、deleteMin和merge对于二项队列的摊还时间界分析(分析证明)

三、斜堆

1、★概念:重结点和轻结点

(对于一个结点p,如果p的右子树的结点数,至少是以p为根的树的结点数的一半,则称p为重结点)

2、重要技巧:斜堆的位势函数=重结点的个数

3、★定理:合并两个斜堆的摊还时间为O(logN)(分析其证明)

⑴、引理1:设两个斜堆H1和H2的右路径上的结点数分别为r1和r2,那么,执行合并的实际时间与r1+r2成正比

⑵、引理2:右路径上的重结点,在合并以后变成了轻结点;反之不然

四、Fibonacci堆

1、基本概念和性质

⑴、★Dijkstra算法的时间界为O(|E|log|V|+|V|log|V|)(仔细分析以下证明)

Ⅰ、时间界被|E|次decreaseKey操作和|V|次deleteMin操作所控制

Ⅱ、如果使用二叉堆,一次decreaseKey操作代价为O(logN),deleteMin操作同样分析Ⅲ、推广:如果采用d堆的情况

⑵、Fibonacci堆

Ⅰ、★概念:Fibonacci堆(是以O(1)摊还时间支持所有基本的堆操作的一种数据结构,但delete和deleteMin除外,它们花费O(logN)的摊还时间)

Ⅱ、性质:在使用Fibonacci堆的条件下,Dijkstra算法的时间界为O(|E| +|V|log|V|)

2、切除左式堆中的结点

⑴、decreaseKey操作的常规实现

(首先降低结点的值,然后将其朝着根上滤直到建成堆序)

⑵、★decreaseKey操作实现的另一种策略

Ⅰ、先切开,得到两棵树H1和H2,然后再把这两棵树合并在一起

Ⅱ、切开后,H1仍保存左式堆的性质,但H2得通过交换子结点进行调整

Ⅲ、调整的代价为O(logN),左式堆合并的代价为O(logN),所以总代价为O(logN)

3、二项队列的懒惰合并

⑴、★Fibonacci堆采用懒惰合并

Ⅰ、合并操作:采用懒惰合并

Ⅱ、deleteMin操作:(算法分析)(将使懒惰二项队列变成标准的二项队列)

⑵、★定理:懒惰二项队列的合并操作的摊还时间为O(1),而deleteMin操作为O(logN)(证明的关键:懒惰二项队列的位势是树的棵数)

4、Fibonacci堆操作

⑴、Fibonacci堆的实质:

(将左式堆的decreaseKey操作和懒惰二项队列merge操作结合起来)

⑵、★Fibonacci堆的切除规则(保证R=O(logN)成立,注意R的概念)

(即:标记、去除标记和级联切除的规则)

5、时间界的证明

⑴、概念:结点的秩(儿子的个数)

⑵、引理1:令X是Fibonacci堆中的任一结点,Ci为X的第i个最年轻的儿子,则Ci的秩至少是i-2(关键:只有具有相同秩的结点才链接)

⑶、引理2:令F(k)是Fibonacci数,则秩为R的任意结点至少有F(R+1)个后裔

⑷、引理3:Fibonacci堆中任意结点的秩为O(logN)

⑸、★定理:Fibonacci堆对于insert、merge和decreaseKey的摊还时间界均为O(1),而对于deleteMin则是O(logN)(关键:位势设为树的棵数+两倍的标记结点数)

6、伸展树

⑴、复习:单旋转、之字形旋转和一字形旋转

(关键:依赖标准图而做出分析)

⑵、★位势函数的选择:树T的所有结点i的S(i)对数和

Ⅰ、S(i)是结点i的后裔的个数(包括结点本身)

Ⅱ、R(i)是结点的秩,等于log(S(i))

⑶、引理:若a+b<=c,则loga+logb<=2logc-2

⑷、★定理:在结点X伸展一棵根为T的树的摊还时间最多为3(R(T)-R(X))=O(logN)Ⅰ、时间单位的度量:任何访问的花费等于1加上旋转的次数

Ⅱ、证明的关键在于先列出位势的变化,再结合不等式分析

数据结构与算法C语言版期末复习题

《数据结构与算法》期末复习题 一、选择题。 1.在数据结构中,从逻辑上可以把数据结构分为 C 。 A.动态结构和静态结构B.紧凑结构和非紧凑结构 C.线性结构和非线性结构D.内部结构和外部结构 2.数据结构在计算机内存中的表示是指 A 。 A.数据的存储结构B.数据结构C.数据的逻辑结构D.数据元素之间的关系 3.在数据结构中,与所使用的计算机无关的是数据的 A 结构。 A.逻辑B.存储C.逻辑和存储D.物理 4.在存储数据时,通常不仅要存储各数据元素的值,而且还要存储 C 。 A.数据的处理方法B.数据元素的类型 C.数据元素之间的关系D.数据的存储方法 5.在决定选取何种存储结构时,一般不考虑 A 。 A.各结点的值如何B.结点个数的多少 C.对数据有哪些运算D.所用的编程语言实现这种结构是否方便。 6.以下说法正确的是 D 。 A.数据项是数据的基本单位 B.数据元素是数据的最小单位 C.数据结构是带结构的数据项的集合 D.一些表面上很不相同的数据可以有相同的逻辑结构 7.算法分析的目的是 C ,算法分析的两个主要方面是 A 。 (1)A.找出数据结构的合理性B.研究算法中的输入和输出的关系C.分析算法的效率以求改进C.分析算法的易读性和文档性 (2)A.空间复杂度和时间复杂度B.正确性和简明性 C.可读性和文档性D.数据复杂性和程序复杂性 8.下面程序段的时间复杂度是O(n2) 。 s =0; for( I =0; i

考研数据结构必须掌握的知识点与算法-打印版

《数据结构》必须掌握的知识点与算法 第一章绪论 1、算法的五个重要特性(有穷性、确定性、可行性、输入、输出) 2、算法设计的要求(正确性、可读性、健壮性、效率与低存储量需求) 3、算法与程序的关系: (1)一个程序不一定满足有穷性。例操作系统,只要整个系统不遭破坏,它将永远不会停止,即使没有作业需要处理,它仍处于动态等待中。因此,操作系统不是一个算法。 (2)程序中的指令必须是机器可执行的,而算法中的指令则无此限制。算法代表了对问题的解,而程序则是算法在计算机上的特定的实现。 (3)一个算法若用程序设计语言来描述,则它就是一个程序。 4、算法的时间复杂度的表示与计算(这个比较复杂,具体看算法本身,一般关心其循环的次数与N的关系、函数递归的计算) 第二章线性表 1、线性表的特点: (1)存在唯一的第一个元素;(这一点决定了图不是线性表) (2)存在唯一的最后一个元素; (3)除第一个元素外,其它均只有一个前驱(这一点决定了树不是线性表) (4)除最后一个元素外,其它均只有一个后继。 2、线性表有两种表示:顺序表示(数组)、链式表示(链表),栈、队列都是线性表,他们都可以用数组、链表来实现。 3、顺序表示的线性表(数组)地址计算方法: (1)一维数组,设DataType a[N]的首地址为A0,每一个数据(DataType类型)占m个字节,则a[k]的地址为:A a[k]=A0+m*k(其直接意义就是求在数据a[k]的前面有多少个元素,每个元素占m个字节) (2)多维数组,以三维数组为例,设DataType a[M][N][P]的首地址为A000,每一个数据(DataType 类型)占m个字节,则在元素a[i][j][k]的前面共有元素个数为:M*N*i+N*j+k,其其地址为: A a[i][j][k]=A000+m*(M*N*i+N*j+k); 4、线性表的归并排序: 设两个线性表均已经按非递减顺序排好序,现要将两者合并为一个线性表,并仍然接非递减顺序。可见算法2.2 5、掌握线性表的顺序表示法定义代码,各元素的含义; 6、顺序线性表的初始化过程,可见算法2.3 7、顺序线性表的元素的查找。 8、顺序线性表的元素的插入算法,注意其对于当原来的存储空间满了后,追加存储空间(就是每次增加若干个空间,一般为10个)的处理过程,可见算法2.4 9、顺序线性表的删除元素过程,可见算法2.5 10、顺序线性表的归并算法,可见算法2.7 11、链表的定义代码,各元素的含义,并能用图形象地表示出来,以利分析; 12、链表中元素的查找 13、链表的元素插入,算法与图解,可见算法2.9 14、链表的元素的删除,算法与图解,可见算法2.10 15、链表的创建过程,算法与图解,注意,链表有两种(向表头生长、向表尾生长,分别用在栈、队列中),但他们的区别就是在创建时就产生了,可见算法2.11 16、链表的归并算法,可见算法2.12 17、建议了解所谓的静态单链表(即用数组的形式来实现链表的操作),可见算法2.13 18、循环链表的定义,意义 19、循环链表的构造算法(其与单链表的区别是在创建时确定的)、图解

力 扣 数 据 结 构 与 算 法

前端如何搞定数据结构与算法(先导篇) 「观感度:?」 「口味:锅包肉」 「烹饪时间:20min」 本文已收录在Github? 为什么要学习数据结构与算法? 在0202年的今天,由于每天被无数的信息轰炸,大多数人已经变得越来越浮躁了,并且丧失了独立思考的能力。 你可能会经常听到这样的感慨: 技术人究竟能走多远?我遇到了天花板 35岁的程序员要如何面对中年危机? 技术更新太快,好累,学不动了 然后,你也变得焦虑起来。那你有没有静下心来想过,如何才能抵御年龄增长并且使自己增值呢? 无非是终身学习,持续修炼自己的内功。内功也就是基础知识和核心概念,这些轰轰烈烈发展的技术本质,其实都是基础知识,也就是我们在大学里学过的基础课-程。 操作系统 计算机组成原理 计算机网络 编译原理

设计模式 数据结构与算法 这也就是为什么越靠谱的面试官越注重你基础知识的掌握程度,为什么越牛的的企业越重视你的算法能力。因为当你拥有了这些,你已经比大多数人优秀了。你的天花板由你自己来决定,大家口中的中年危机可能并不会成为你的危机。新技术来临时,你对它的本质会看得更加透彻,学起来会一通百通。这样的人才,公司培养你也会花费更少的成本。 (不过,一辈子做个开开心心的 CRUD Boy 也是一种选择。) 数据结构与算法之间的关系 Rob Pikes 5 Rules of Programming中的第五条是这样说的: Data dominates. If youve chosen the right data structures and organized things well, the algorithms will almost always be self-evident. Data structures, not algorithms, are central to programming. 数据占主导。如果您选择了正确的数据结构并组织得当,那么这些算法几乎总是不言而喻的。数据结构而非算法是编程的核心。 瑞士计算机科学家,Algol W,Modula,Oberon 和 Pascal 语言的设计师 Niklaus Emil Wirth 写过一本非常经典的书《Algorithms + Data Structures = Programs》,即算法 + 数据结构 = 程序。 我们可以得出结论,数据结构与算法之间是相辅相成的关系。数据结构服务于算法,算法作用于特定的数据结构之上。 数据结构与算法好难,怎么学?

数据结构与算法习题及答案

第1章绪论 习题 1.简述下列概念:数据、数据元素、数据项、数据对象、数据结构、逻辑结构、存储结构、抽象数据类型。2.试举一个数据结构的例子,叙述其逻辑结构和存储结构两方面的含义和相互关系。 3.简述逻辑结构的四种基本关系并画出它们的关系图。 4.存储结构由哪两种基本的存储方法实现 5.选择题 (1)在数据结构中,从逻辑上可以把数据结构分成()。 A.动态结构和静态结构B.紧凑结构和非紧凑结构 C.线性结构和非线性结构D.内部结构和外部结构 (2)与数据元素本身的形式、内容、相对位置、个数无关的是数据的()。 A.存储结构B.存储实现 C.逻辑结构D.运算实现 (3)通常要求同一逻辑结构中的所有数据元素具有相同的特性,这意味着()。 A.数据具有同一特点 B.不仅数据元素所包含的数据项的个数要相同,而且对应数据项的类型要一致 C.每个数据元素都一样 D.数据元素所包含的数据项的个数要相等 (4)以下说法正确的是()。 A.数据元素是数据的最小单位 B.数据项是数据的基本单位 C.数据结构是带有结构的各数据项的集合 D.一些表面上很不相同的数据可以有相同的逻辑结构 (5)以下与数据的存储结构无关的术语是()。 A.顺序队列B.链表C.有序表D.链栈 (6)以下数据结构中,()是非线性数据结构 A.树B.字符串C.队D.栈 6.试分析下面各程序段的时间复杂度。 (1)x=90;y=100; while(y>0) if(x>100) {x=x-10;y--;} elsex++; (2)for(i=0;i

数据结构与算法复习题10(C语言版)

习题9解答 判断题: 1.用向量和单链表表示的有序表均可使用折半查找方法来提高查找速度。答:FALSE (错。链表表示的有序表不能用折半查找法。) 2.有n个数据放在一维数组A[1..n]中,在进行顺序查找时,这n个数的排列有序或无序其平均查找长度不同。 答:FALSE (错。因顺序查找既适合于有序表也适合于无序表;对这两种表,若对于每个元素的查找概率相等,则顺序查找的ASL相同,并且都是(n+1)/2;对于查找概率不同的情况,则按查找概率由大到小排序的无序表其ASL要比有序表的ASL小。) 3.折半查找是先确定待查有序表记录的范围,然后逐步缩小范围,直到找到或找不到该记录为止。( ) 答:TRUE 4.哈希表的查找效率主要取决于哈希表哈希表造表时选取的哈希函数和处理冲突的方法。 答:TRUE 5.查找表是由同一类型的数据元素(或记录)构成的集合。 答:TRUE 单选题: 6.对于18个元素的有序表采用二分(折半)查找,则查找A[3]的比较序列的下标为( )。 A. 1、2、3 B. 9、5、2、3 C. 9、5、3 D.9、4、2、3

答:D (第一次??2/)181(+ = 9,第二次??2/)81(+ = 4,第三次??2/)31(+ = 2, (第四次??2/)33(+ = 3,故选D. 7. 顺序查找法适合于存储结构为____________的线性表。 A.散列存储 B.顺序存储或链式存储 C.压缩存储 D.索引存储 答:B 8.对线性表进行二分查找时,要求线性表必须( )。 A .以顺序方式存储 B. 以链接方式存储 C .以顺序方式存储,且结点按关键字有序排序 D. 以链接方式存储,且结点按关键字有序排序 答:C 9.设哈希表长m=14,哈希函数为H(k) = k MOD 11。表中已有4个记录(如下图所示),如果用二次探测再散列处理冲突,关键字为49的记录的存储地址是( )。 0 1 2 3 4 5 6 7 8 9 10 11 12 13 A .8 B. 3 C .5 D. 9 答:D (计算H(k),即H(49)=49 mod 11 = 5,冲突,进行二次探测再散列。而二次探测再散列的增量序列为:d i =12,-12,22,-22,32,…,土k 2,(k ≤m/2), 沿着增量序列选择不同的增量按照开放定址公式: H i =( H(key)+d i ) MOD m i =1,2,…,k (k ≤m-1)

数据结构与算法基础知识总结

数据结构与算法基础知识总结 1 算法 算法:是指解题方案的准确而完整的描述。 算法不等于程序,也不等计算机方法,程序的编制不可能优于算法的设计。 算法的基本特征:是一组严谨地定义运算顺序的规则,每一个规则都是有效的,是明确的,此顺序将在有限的次数下终止。特征包括: (1)可行性; (2)确定性,算法中每一步骤都必须有明确定义,不充许有模棱两可的解释,不允许有多义性; (3)有穷性,算法必须能在有限的时间内做完,即能在执行有限个步骤后终止,包括合理的执行时间的含义; (4)拥有足够的情报。 算法的基本要素:一是对数据对象的运算和操作;二是算法的控制结构。 指令系统:一个计算机系统能执行的所有指令的集合。 基本运算和操作包括:算术运算、逻辑运算、关系运算、数据传输。 算法的控制结构:顺序结构、选择结构、循环结构。 算法基本设计方法:列举法、归纳法、递推、递归、减斗递推技术、回溯法。 算法复杂度:算法时间复杂度和算法空间复杂度。 算法时间复杂度是指执行算法所需要的计算工作量。 算法空间复杂度是指执行这个算法所需要的内存空间。 2 数据结构的基本基本概念 数据结构研究的三个方面: (1)数据集合中各数据元素之间所固有的逻辑关系,即数据的逻辑结构; (2)在对数据进行处理时,各数据元素在计算机中的存储关系,即数据的存储结构;(3)对各种数据结构进行的运算。 数据结构是指相互有关联的数据元素的集合。 数据的逻辑结构包含: (1)表示数据元素的信息; (2)表示各数据元素之间的前后件关系。 数据的存储结构有顺序、链接、索引等。 线性结构条件:

(1)有且只有一个根结点; (2)每一个结点最多有一个前件,也最多有一个后件。 非线性结构:不满足线性结构条件的数据结构。 3 线性表及其顺序存储结构 线性表由一组数据元素构成,数据元素的位置只取决于自己的序号,元素之间的相对位置是线性的。 在复杂线性表中,由若干项数据元素组成的数据元素称为记录,而由多个记录构成的线性表又称为文件。 非空线性表的结构特征: (1)且只有一个根结点a1,它无前件; (2)有且只有一个终端结点an,它无后件; (3)除根结点与终端结点外,其他所有结点有且只有一个前件,也有且只有一个后件。结点个数n称为线性表的长度,当n=0时,称为空表。 线性表的顺序存储结构具有以下两个基本特点: (1)线性表中所有元素的所占的存储空间是连续的; (2)线性表中各数据元素在存储空间中是按逻辑顺序依次存放的。 ai的存储地址为:adr(ai)=adr(a1)+(i-1)k,,adr(a1)为第一个元素的地址,k代表每个元素占的字节数。 顺序表的运算:插入、删除。(详见14--16页) 4 栈和队列 栈是限定在一端进行插入与删除的线性表,允许插入与删除的一端称为栈顶,不允许插入与删除的另一端称为栈底。 栈按照“先进后出”(filo)或“后进先出”(lifo)组织数据,栈具有记忆作用。用top表示栈顶位置,用bottom表示栈底。 栈的基本运算:(1)插入元素称为入栈运算;(2)删除元素称为退栈运算;(3)读栈顶元素是将栈顶元素赋给一个指定的变量,此时指针无变化。 队列是指允许在一端(队尾)进入插入,而在另一端(队头)进行删除的线性表。rear指针指向队尾,front指针指向队头。 队列是“先进行出”(fifo)或“后进后出”(lilo)的线性表。 队列运算包括(1)入队运算:从队尾插入一个元素;(2)退队运算:从队头删除一个元素。循环队列:s=0表示队列空,s=1且front=rear表示队列满

[第1题-60题汇总]微软数据结构+算法面试100题

精选微软等公司数据结构 精选微软等公司数据结构++算法面试100题 -----[第1题-60题总] 资源说明: 此份,是为微软等公司数据结构+算法面试100题,之前60题的汇总。 总结整理了前第1题-第60题。特此并作此一份上传。以飨各位。:)。 -------------------------------- 相关资源,包括答案,下载地址: [答案V0.2版]精选微软数据结构+算法面试100题[前20题]--答案修正 https://www.360docs.net/doc/4f540693.html,/source/2813890 //此份答案是针对最初的V0.1版本,进行的校正与修正。 [答案V0.1版]精选微软数据结构+算法面试100题[前25题] https://www.360docs.net/doc/4f540693.html,/source/2796735 [第二部分]精选微软等公司结构+算法面试100题[前41-60题]: https://www.360docs.net/doc/4f540693.html,/source/2811703 [第一部分]精选微软等公司数据结构+算法经典面试100题[1-40题] https://www.360docs.net/doc/4f540693.html,/source/2778852 更多资源,下载地址: http://v_july_https://www.360docs.net/doc/4f540693.html,/ 很快,我将公布第21-40题的答案,敬请期待。:).. 如果你对以下的前第1-60题,有好的思路,和算法,欢迎跟帖回复, 或者,联系我,发至我的邮箱, zhoulei0907@https://www.360docs.net/doc/4f540693.html,。 My CSDN Blog:https://www.360docs.net/doc/4f540693.html,/v_JULY_v My sina Blog:https://www.360docs.net/doc/4f540693.html,/shitou009 帖子维护地址: [整理]算法面试:精选微软经典的算法面试100题[前1-60题] https://www.360docs.net/doc/4f540693.html,/u/20101023/20/5652ccd7-d510-4c10-9671-307a56006e6d.html -------------------------------------- July、2010、/11.12.请享用。:)。 1

数据结构与算法复习题10(C语言版)

习 9解答 判断题: 1.用向量和单链表表示的有序表均可使用折半查找方法来提高查找速度。 答:FALSE (错。链表表示的有序表不能用折半查找法。) 2.有n 个数据放在一维数组A[1..n]中,在进行顺序查找时,这n 个数的排列有序或无序其平均查找长度不同。 答:FALSE (错。因顺序查找既适合于有序表也适合于无序表;对这两种表,若对于每个元素的查找概率相等,则顺序查找的ASL 相同,并且都是(n+1)/2;对于查找概率不同的情况,则按查找概率由大到小排序的无序表其ASL 要比有序表的ASL 小。) 3.折半查找是先确定待查有序表记录的范围,然后逐步缩小范围,直到找到或找不到该记录为止。( ) 答:TRUE 4.哈希表的查找效率主要取决于哈希表哈希表造表时选取的哈希函数和处理冲突的方法。 答:TRUE 5.查找表是由同一类型的数据元素(或记录)构成的集合。 答:TRUE 单选题: 6.对于18个元素的有序表采用二分(折半)查找,则查找A[3]的比较序列的下标为( )。 A. 1、2、3 B. 9、5、2、3 C. 9、5、3 D.9、4、2、3 答:D (第一次??2/)181(+ = 9,第二次??2/)81(+ = 4,第三次??2/)31(+ = 2, (第四次??2/)33(+ = 3,故选D. 7. 顺序查找法适合于存储结构为____________的线性表。 A.散列存储 B.顺序存储或链式存储 C.压缩存储 D.索引存储 答:B 8.对线性表进行二分查找时,要求线性表必须( )。 A .以顺序方式存储 B. 以链接方式存储 C .以顺序方式存储,且结点按关键字有序排序 D. 以链接方式存储,且结点按关键字有序排序 答:C 9.设哈希表长m=14,哈希函数为H(k) = k MOD 11。表中已有4个记录(如下图

数据结构(c语言版)期末考试复习试题

《数据结构与算法》(c语言版)期末考复习题 一、选择题。 1.在数据结构中,从逻辑上可以把数据结构分为 C 。 A.动态结构和静态结构B.紧凑结构和非紧凑结构 C.线性结构和非线性结构D.内部结构和外部结构 2.数据结构在计算机内存中的表示是指 A 。 A.数据的存储结构B.数据结构C.数据的逻辑结构D.数据元素之间的关系 3.在数据结构中,与所使用的计算机无关的是数据的 A 结构。 A.逻辑B.存储C.逻辑和存储D.物理 4.在存储数据时,通常不仅要存储各数据元素的值,而且还要存储 C 。A.数据的处理方法B.数据元素的类型 C.数据元素之间的关系D.数据的存储方法 5.在决定选取何种存储结构时,一般不考虑 A 。 A.各结点的值如何B.结点个数的多少 C.对数据有哪些运算D.所用的编程语言实现这种结构是否方便。 6.以下说法正确的是 D 。 A.数据项是数据的基本单位

B.数据元素是数据的最小单位 C.数据结构是带结构的数据项的集合 D.一些表面上很不相同的数据可以有相同的逻辑结构 7.算法分析的目的是 C ,算法分析的两个主要方面是 A 。(1)A.找出数据结构的合理性B.研究算法中的输入和输出的关系C.分析算法的效率以求改进C.分析算法的易读性和文档性(2)A.空间复杂度和时间复杂度B.正确性和简明性 C.可读性和文档性D.数据复杂性和程序复杂性 8.下面程序段的时间复杂度是O(n2) 。 s =0; for( I =0; i

知识点大纲全国计算机等级考试数据结构和算法

全国计算机等级考试二级office 二级公共基础知识部分(10分*10题) 第一章. 算法与数据结构 考点1:算法概念 ● 算法 算法:指解题方案准确而完整的描述。 算法不等于程序,也不是计算方法。程序编制通常不优于算法设计。 考点2:算法的四个基本特征 可行性、确定性(算法步骤有明确定义)、有穷性、拥有足够情报 考点3:算法的时间复杂度和空间复杂度 1. 时间复杂度:执行算法所需的工作量。 算法执行的基本次数是问题规模的函数,固定规模下还与输入有关。 2. 空间复杂度:算法执行需要的存储空间(算法程序、输入初始数据、某种数据结构所需空间) ● 数据结构 (反映数据元素之间关系的数据元素集合,即带有结构的数据元素的集合,结构指数据元素之间 的前后件(前驱、后继)关系)。目的是提高数据处理的效率(速度/空间) 数据的逻辑结构:是反映数据元素之间逻辑关系的数据结构。 可以表示成:B=(D ,R ) B 表示数据结构;D 表示数据元素集合;R 表示数据元素之间的前后件关系 【例:一年四季的数据结构可以表示成B=(D ,R );D=(春,夏,秋,冬);B={(春,夏), (夏,秋),(秋,冬)}】 数据结构的图形表示: 数据元素:用中间标有元素值的方框表示,称为结点。 逻辑关系:用有向线段从前件指向后件。没有前件的结点称为根结点;没有后件的结点称为 终端结点(叶子结点) B=(D ,R ) D={di|1≤i ≤7} ={d1,d2,d3,d4,(d1,d3),(d1,d7),(d2,d4),(d3,d6),(d4,d5)} 考点4:数据的存储结构 数据的存储结构:指数据的逻辑结构在计算机 储存空间的存放形式。既储存数据元素的信息,还有元素的前后件关系信息。 数据的逻辑关系与数据的存储结构不一定相同。数据结构一般可以表示成多种存储结构,常

阿里校园招聘历年经典面试题汇总:算法工程师

阿里校园招聘历年经典面试题汇总:算法工程师 (1)、jvm 原理 (2)、minor GC 与 Full GC (3)、HashMap 实现原理 (4)、java.util.concurrent 包下使用过哪些 (5)、concurrentMap 和 HashMap 区别 (6)、信号量是什么,怎么使用? (7)、阻塞队列了解吗?怎么使用? (8)、JAVA NIO 是什么? (9)、类加载机制是怎样的 (10)、什么是幂等性 (11)、有哪些 JVM 调优经验 (12)、分布式 CAP 了解吗? (13)、hdfs怎么添加Datanode,添加后hdfs会有什么操作? (14)、Hbase 跟关系数据库对比优缺点?为什么 Hbase 索引速度快 (15)、Hbase 大压缩与小压缩区别 (16)、Hive 与 Hbase 的使用场景 (17)、简单说说Spark功能,spark 与hive有无依赖关系? (18)、zookeeper 有什么应用场景,怎么选举的?3 个节点挂掉一个能正常工作吗? (19)、Hbase 中 zookeaper 作用 (20)、Hbase 写操作什么时候返回 (21)、mysql 有哪些存储引擎?各自特点 (22)、用过哪些设计模式?怎样实现线程安全单例模式? (23)、用过哪些RPC框架? (24)、什么是AOP? (25)、决策树算法怎么实现的? (26)、java垃圾回收会出现不可回收的对象吗?怎么解决内存泄露问题?怎么

定位问题源? (27)、终止线程有几种方式?终止线程标记变量为什么是 valotile 类型?(28)、用过哪些并发的数据结构? cyclicBarrier 什么功能?信号量作用?数据库读写阻塞怎么解决? (29)、乐观锁与悲观锁,怎么实现乐观锁? (30)、开发过分布式框架?怎么实现分布式事务? (31)、spark streaming与storm区别? (32)、找到最大子数组的 start,和end下标 (33)、用过 CDH中什么任务调度? (34)、spark streaming时间间隔设置很小会出现什么状况? (35)、搜索引擎了解多少?你认为搜索引擎的难点在哪里? (36)、RPC 了解吗?怎么监控 RPC 状态,找出出现问题的 RPC 连接?(37)、spring 框架了解多少? (38)、flume应用场景 (39)、找出一串字符中第一个不重复字符的下标。 点击查看详细面经〉〉〉〉〉〉〉〉〉〉〉〉 更多精品干货>>>>>>>>>>> 更多阿里机器学习/数据挖掘经典面试题 其他名企机器学习/数据挖掘经典面试题

(完整版)非常实用的数据结构知识点总结

数据结构知识点概括 第一章概论 数据就是指能够被计算机识别、存储和加工处理的信息的载体。 数据元素是数据的基本单位,可以由若干个数据项组成。数据项是具有独立含义的最小标识单位。 数据结构的定义: ·逻辑结构:从逻辑结构上描述数据,独立于计算机。·线性结构:一对一关系。 ·线性结构:多对多关系。 ·存储结构:是逻辑结构用计算机语言的实现。·顺序存储结构:如数组。 ·链式存储结构:如链表。 ·索引存储结构:·稠密索引:每个结点都有索引项。 ·稀疏索引:每组结点都有索引项。 ·散列存储结构:如散列表。 ·数据运算。 ·对数据的操作。定义在逻辑结构上,每种逻辑结构都有一个运算集合。 ·常用的有:检索、插入、删除、更新、排序。 数据类型:是一个值的集合以及在这些值上定义的一组操作的总称。 ·结构类型:由用户借助于描述机制定义,是导出类型。 抽象数据类型ADT:·是抽象数据的组织和与之的操作。相当于在概念层上描述问题。 ·优点是将数据和操作封装在一起实现了信息隐藏。 程序设计的实质是对实际问题选择一种好的数据结构,设计一个好的算法。算法取决于数据结构。 算法是一个良定义的计算过程,以一个或多个值输入,并以一个或多个值输出。 评价算法的好坏的因素:·算法是正确的; ·执行算法的时间; ·执行算法的存储空间(主要是辅助存储空间); ·算法易于理解、编码、调试。 时间复杂度:是某个算法的时间耗费,它是该算法所求解问题规模n的函数。 渐近时间复杂度:是指当问题规模趋向无穷大时,该算法时间复杂度的数量级。 评价一个算法的时间性能时,主要标准就是算法的渐近时间复杂度。 算法中语句的频度不仅与问题规模有关,还与输入实例中各元素的取值相关。 时间复杂度按数量级递增排列依次为:常数阶O(1)、对数阶O(log2n)、线性阶O(n)、线性对数阶O(nlog2n)、平方阶O (n^2)、立方阶O(n^3)、……k次方阶O(n^k)、指数阶O(2^n)。

数据结构算法面试100题

数据结构+算法面试100题~~~摘自CSDN,作者July 1.把二元查找树转变成排序的双向链表(树) 题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。 要求不能创建任何新的结点,只调整指针的指向。 10 / / 6 14 / / / / 4 8 12 16 转换成双向链表 4=6=8=10=12=14=16。 首先我们定义的二元查找树节点的数据结构如下: struct BSTreeNode { int m_nValue; // value of node BSTreeNode *m_pLeft; // left child of node BSTreeNode *m_pRight; // right child of node }; 2.设计包含min函数的栈(栈) 定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。 要求函数min、push以及pop的时间复杂度都是O(1)。 参见C:\Users\Administrator\Desktop\demo\Stack 分析:min时间复杂度要达到O(1),需要我们在栈中存储最小元素 3.求子数组的最大和(数组) 题目: 输入一个整形数组,数组里有正数也有负数。 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。 例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18。 分析:根据dp思想 #include #define N 8 int main() { int i, a[N] = {1, -2, 3, 10, -4, 7, 2, -5}; int from[N], result[N], max;

数据结构与算法分析习题与参考答案

大学 《数据结构与算法分析》课程 习题及参考答案 模拟试卷一 一、单选题(每题 2 分,共20分) 1.以下数据结构中哪一个是线性结构?( ) A. 有向图 B. 队列 C. 线索二叉树 D. B树 2.在一个单链表HL中,若要在当前由指针p指向的结点后面插入一个由q指向的结点, 则执行如下( )语句序列。 A. p=q; p->next=q; B. p->next=q; q->next=p; C. p->next=q->next; p=q; D. q->next=p->next; p->next=q; 3.以下哪一个不是队列的基本运算?() A. 在队列第i个元素之后插入一个元素 B. 从队头删除一个元素 C. 判断一个队列是否为空 D.读取队头元素的值 4.字符A、B、C依次进入一个栈,按出栈的先后顺序组成不同的字符串,至多可以组成( ) 个不同的字符串? A.14 B.5 C.6 D.8 5.由权值分别为3,8,6,2的叶子生成一棵哈夫曼树,它的带权路径长度为( )。 以下6-8题基于图1。 6.该二叉树结点的前序遍历的序列为( )。 A.E、G、F、A、C、D、B B.E、A、G、C、F、B、D C.E、A、C、B、D、G、F D.E、G、A、C、D、F、B 7.该二叉树结点的中序遍历的序列为( )。 A. A、B、C、D、E、G、F B. E、A、G、C、F、B、D C. E、A、C、B、D、G、F E.B、D、C、A、F、G、E 8.该二叉树的按层遍历的序列为( )。

A.E、G、F、A、C、D、B B. E、A、C、B、D、G、F C. E、A、G、C、F、B、D D. E、G、A、C、D、F、B 9.下面关于图的存储的叙述中正确的是( )。 A.用邻接表法存储图,占用的存储空间大小只与图中边数有关,而与结点个数无关 B.用邻接表法存储图,占用的存储空间大小与图中边数和结点个数都有关 C. 用邻接矩阵法存储图,占用的存储空间大小与图中结点个数和边数都有关 D.用邻接矩阵法存储图,占用的存储空间大小只与图中边数有关,而与结点个数无关 10.设有关键码序列(q,g,m,z,a,n,p,x,h),下面哪一个序列是从上述序列出发建 堆的结果?( ) A. a,g,h,m,n,p,q,x,z B. a,g,m,h,q,n,p,x,z C. g,m,q,a,n,p,x,h,z D. h,g,m,p,a,n,q,x,z 二、填空题(每空1分,共26分) 1.数据的物理结构被分为_________、________、__________和___________四种。 2.对于一个长度为n的顺序存储的线性表,在表头插入元素的时间复杂度为_________, 在表尾插入元素的时间复杂度为____________。 3.向一个由HS指向的链栈中插入一个结点时p时,需要执行的操作是________________; 删除一个结点时,需要执行的操作是______________________________(假设栈不空而 且无需回收被删除结点)。 4.对于一棵具有n个结点的二叉树,一个结点的编号为i(1≤i≤n),若它有左孩子则左 孩子结点的编号为________,若它有右孩子,则右孩子结点的编号为________,若它有 双亲,则双亲结点的编号为________。 5.当向一个大根堆插入一个具有最大值的元素时,需要逐层_________调整,直到被调整 到____________位置为止。 6.以二分查找方法从长度为10的有序表中查找一个元素时,平均查找长度为________。 7.表示图的三种常用的存储结构为_____________、____________和_______________。 8.对于线性表(70,34,55,23,65,41,20)进行散列存储时,若选用H(K)=K %7 作为散列函数,则散列地址为0的元素有________个,散列地址为6的有_______个。 9.在归并排序中,进行每趟归并的时间复杂度为______,整个排序过程的时间复杂度为 ____________,空间复杂度为___________。 10.在一棵m阶B_树上,每个非树根结点的关键字数目最少为________个,最多为________ 个,其子树数目最少为________,最多为________。 三、运算题(每题 6 分,共24分) 1.写出下列中缀表达式的后缀形式: (1)3X/(Y-2)+1 (2)2+X*(Y+3) 2.试对图2中的二叉树画出其: (1)顺序存储表示的示意图; (2)二叉链表存储表示的示意图。 3.判断以下序列是否是小根堆? 如果不是, 将它调 图2 整为小根堆。 (1){ 12, 70, 33, 65, 24, 56, 48, 92, 86, 33 } (2){ 05, 23, 20, 28, 40, 38, 29, 61, 35, 76, 47, 100 } 4.已知一个图的顶点集V和边集E分别为: V={1,2,3,4,5,6,7};

数据结构与算法复习题及参考答案

复习题集─参考答案 一判断题 (√)1. 在决定选取何种存储结构时,一般不考虑各结点的值如何。 (√)2. 抽象数据类型与计算机部表示和实现无关。 (×)3. 线性表采用链式存储结构时,结点和结点部的存储空间可以是不连续的。 (×)4. 链表的每个结点中都恰好包含一个指针。 (×)5.链表的删除算法很简单,因为当删除链中某个结点后,计算机会自动地将后续的各个单元向前移动。(×)6. 线性表的每个结点只能是一个简单类型,而链表的每个结点可以是一个复杂类型。 (×)7. 顺序表结构适宜于进行顺序存取,而链表适宜于进行随机存取。 (×)8. 线性表在物理存储空间中也一定是连续的。 (×)9. 顺序存储方式只能用于存储线性结构。 (√)10.栈是一种对所有插入、删除操作限于在表的一端进行的线性表,是一种后进先出型结构。 (√)11.对于不同的使用者,一个表结构既可以是栈,也可以是队列,也可以是线性表。 (√)12.栈是一种对所有插入、删除操作限于在表的一端进行的线性表,是一种后进先出型结构。 (√)13.两个栈共享一片连续存空间时,为提高存利用率,减少溢出机会,应把两个栈的栈底分别设在这片存空间的两端。 (×)14.二叉树的度为2。 (√)15.若二叉树用二叉链表作存贮结构,则在n个结点的二叉树链表中只有n—1个非空指针域。 (×)16.二叉树中每个结点的两棵子树的高度差等于1。 (√)17.用二叉链表法存储包含n个结点的二叉树,结点的2n个指针区域中有n+1个为空指针。 (√)18.具有12个结点的完全二叉树有5个度为2的结点。 (√)19.二叉树的前序遍历序列中,任意一个结点均处在其孩子结点的前面。 (×)20.在冒泡法排序中,关键值较小的元素总是向前移动,关键值较大的元素总是向后移动。 (×)21.计算机处理的对象可以分为数据和非数据两大类。[计算机处理的对象都是数据] (×)22.数据的逻辑结构与各数据元素在计算机中如何存储有关。 (×)23.算法必须用程序语言来书写。 (×)24.判断某个算法是否容易阅读是算法分析的任务之一。 (×)25.顺序表是一种有序的线性表。[任何数据结构才用顺序存储都叫顺序表] (√)26.分配给顺序表的存单元地址必须是连续的。 (√)27.栈和队列具有相同的逻辑特性。[它们的逻辑结构都是线性表] (√)28.树形结构中每个结点至多有一个前驱。 (×)29.在树形结构中,处于同一层上的各结点之间都存在兄弟关系。 (×)30.如果表示图的邻接矩阵是对称矩阵,则该图一定是无向图。 (×)31.如果表示图的邻接矩阵是对称矩阵,则该图一定是有向图。 (×)32.顺序查找方法只能在顺序存储结构上进行。 (×)33.折半查找可以在有序的双向链表上进行。

数据结构与算法设计知识点

数据结构与算法设计知识点 试题类型: 本课程为考试科目(闭卷笔试),试题类型包括:概念填空题(10 %),是非判断题(10 %),单项选择题(40 %),算法填空题(10%),算法应用题(20 %),算法设计题(10 %)。 第一章绪论 重点内容及要求: 1、了解与数据结构相关的概念(集合、数据、数据元素、数据项、关键字、元 素之间的关系等)。 数据:所有能被输入到计算机中,且能被计算机处理的符号的 集合。是计算机操作的对象的总称。是计算机处理的信息的某种特定 的符号表示形式。 数据元素:是数据(集合)中的一个“个体”,数据结构中的基本 单位,在计算机程序中通常作为一个整体来考虑和处理。 数据项:是数据结构中讨论的最小单位,数据元素可以是一个或 多个数据项的组合 关键码:也叫关键字(Key),是数据元素中能起标识作用的数 据项。 其中能起到唯一标识作用的关键码称为主关键码(简称主码); 否则称为次关键码。通常,一个数据元素只有一个主码,但可以有多 个次码。 关系:指一个数据集合中数据元素之间的某种相关性。 数据结构:带“结构”的数据元素的集合。这里的结构指元素之 间存在的关系。 数据类型:是一个值的集合和定义在此集合上的一组操作的总

称。 2、掌握数据结构的基本概念、数据的逻辑结构(四种)和物理结构(数据元素 的表示与关系的表示、两类存储结构:顺序存储结构和链式存储结构)。 数据结构包括逻辑结构和物理结构两个层次。 数据的逻辑结构:是对数据元素之间存在的逻辑关系的一种抽象的描述,可以用一个数据元素的集合和定义在此集合上的若干关系来表示 逻辑结构有四种:线性结构、树形结构、图状结构、集合结构数据的物理结构:是其逻辑结构在计算机中的表示或实现,因此又称其为存储结构。 存储结构:顺序存储结构和链式存储结构 顺序存储结构:利用数据元素在存储器中相对位置之间的某种特定的关系来表示数据元素之间的逻辑关系; 链式存储结构:除数据元素本身外,采用附加的“指针”表示数据元素之间的逻辑关系。 3、了解算法分析的基本方法,掌握算法时间复杂度相关的概念。 算法:是为了解决某类问题而规定的一个有限长的操作序列 或处理问题的策略 一个算法必须满足以下五个重要特性:1.有穷性2.确定性3.可行性4.有输入5.有输出 设计算法时,通常还应考虑满足以下目标: 1.正确性, 2.可读性, 3.健壮性 4.高效率与低存储量需求

典型数据结构面试题

数据结构 1?在一个单链表中p所指结点之前插入一个s (值为e)所指结点时,可执行如下操作: q=head; while (q->next!=p)q=q->next; s= newNode;s->data=e; q->next=;// 填空 s->next=;// 填空 2.线性表的顺序存储结构是一种的存储结构,而链式存储结构是一种___的 存储结构。 A.随机存取 B.索引存取 C.顺序存取 D.散列存取 3.线性表若采用链式存储结构时,要求内存中可用存储单元的地址___。 A.必须是连续的 B.部分地址必须是连续的 C.一定是不连续的 D.连续或不连续都可以 4?在一个单链表中,已知q所指结点是p所指结点的前驱结点,若在q和p 之间插入s结点,则执行_。 A.s->next=p->next;p->next=s; B.p->next=s->next;s->next=p;

C.q->next=s;s->next=p; D.p->next=s;s->next=q; 5.在一个单链表中,若p 所指结点不是最后结点,在p 之后插入s 所指结点,则执行__。 A.s->next=p;p->next=s; B.s->next=p->next;p->next=s; C.s->next=p->next;p=s; C. p->next=s;s->next=p; 6.在一个单链表中,若删除p 所指结点的后续结点,则执行__。 A.p->next= p->next->next; B.p= p->next;p->next= p->next->nex;t C.p->next= p->next; D.p= p->next->next; 7.链表不具备的特点是__。 A 可随机访问任何一个元素 B 插入、删除操作不需要移动元素 C无需事先估计存储空间大小D所需存储空间与线性表长度成正比 8.以下关于线性表的说法不正确的是。 A 线性表中的数据元素可以是数字、字符、记录等不同类型。 B 线性表中包含的数据元素个数不是任意的。 C 线性表中的每个结点都有且只有一个直接前趋和直接后继。 D 存在这样的线性表:表中各结点都没有直接前趋和直接后继。 9?在一个长度为n的顺序表中删除第i个元素,要移动个元素。如果要在第 i 个元素前插入一个元素,要后移()个元素。N-I N-I+1

数据结构与算法试题

数据结构与算法试题 一、单选题 1、在数据结构的讨论中把数据结构从逻辑上分为 (C ) A 内部结构与外部结构 B 静态结构与动态结构 C 线性结构与非线性结构 D 紧凑结构与非紧凑结构。 2、采用线性链表表示一个向量时,要求占用的存储空间地址(D ) A 必须就是连续的 B 部分地址必须就是连续的 C 一定就是不连续的 D 可连续可不连续 3、采用顺序搜索方法查找长度为n的顺序表时,搜索成功的平均搜索长度为( D )。 A n B n/2 C (n-1)/2 D (n+1)/2 4、在一个单链表中,若q结点就是p结点的前驱结点,若在q与p之间插入结点s,则执行( D )。 A s→link = p→link;p→link = s; B p→link = s; s→link = q; C p→link = s→link;s→link = p; D q→link = s;s→link = p; 5、如果想在4092个数据中只需要选择其中最小的5个,采用( C )方法最好。 A 起泡排序 B 堆排序 C 锦标赛排序 D 快速排序 6、设有两个串t与p,求p在t中首次出现的位置的运算叫做( B )。 A 求子串 B 模式匹配 C 串替换 D 串连接 7、在数组A中,每一个数组元素A[i][j]占用3个存储字,行下标i从1到8,列下标j从1到10。所有数组元素相继存放于一个连续的存储空间中,则存放该数

组至少需要的存储字数就是( C )。 A 80 B 100 C 240 D 270 8、将一个递归算法改为对应的非递归算法时,通常需要使用( A )。 A 栈 B 队列 C 循环队列 D 优先队列 9、一个队列的进队列顺序就是1, 2, 3, 4,则出队列顺序为( C )。 10、在循环队列中用数组A[0、、m-1] 存放队列元素,其队头与队尾指针分别为front与rear,则当前队列中的元素个数就是( D )。 A ( front - rear + 1) % m B ( rear - front + 1) % m C ( front - rear + m) % m D ( rear - front + m) % m 11、一个数组元素a[i]与( A )的表示等价。 A *(a+i) B a+i C *a+i D &a+i 12、若需要利用形参直接访问实参,则应把形参变量说明为( B )参数。 A 指针 B 引用 C 值 D 变量 13、下面程序段的时间复杂度为( C ) for (int i=0;i

相关文档
最新文档