算法与数据结构应知应会知识点
1、顺序存储结构的特点是什么?
顺序存储时,相邻数据元素的存放地址也相邻(逻辑与物理的统一);要求内容中可用存储单元的地址必须是连续的。存储密度大(=1),存储空间利用率高,但是插入或删除元素时不方便。
2、链式存储结构的特点是什么?
链式存储时,相邻数据元素可随意存放,但所占存储空间分两部分,一部分存放结点值,另一部分存放表示结点间关系的指针。
插入或删除元素时很方便,使用灵活。但是存储密度小(<1),存储空间利用率低。
3、顺序队列的“假溢出”是怎样产生的?
一般的一维数组队列的尾指针已经到了数组的上界,不能再有入队操作,但其实数组中还有空位置,这就叫做“假溢出”。采用循环队列是解决假溢出的途径。
4、如何知道循环队列是空还是满?
解决队满队空的办法有三:
①设置一个布尔变量以区别队满还是队空;
②浪费一个元素的空间,用于区别队满还是队空;
我们常采用法②,即队头指针、队尾指针中有一个指向实元素,另一个指向空闲元素。
③使用一个计数器记录队列中元素的个数(即队列长度);
判断循环队列的空标志是:f=rear 队满的标志是 f=(rear+1)%N
5、常用的五种数据结构运算?
插入、删除、查找、修改、排序。
6、线索化二叉链表的基本操作函数
**二:线索二叉树
-
线索二叉树的定义:n个结点的二叉链表中含有n+1[2n-(n-1)=n+1]个空指针域。利用二叉链表中的空指针域,存放指向结点在某种遍历次序下的前驱和后继结点的指针(这种附加的指针称为"线索")。
因为n个节点有2n个指针
又因为n个节点中有n-1条边(除了头结点没有边,其余节点都有一个父节点,相当于都有1条边,共n-1条)
剩下的空链域就是2n-(n-1)=n+1,即n+1个空指针
2.线索二叉树结构实现:线索化的实质就是将二叉链表中的空指针改为指指向前驱和后继的线索,这种过程在遍历二叉树时进行**作用:线索化的作用是将树可以像链表一样遍历每一个节点 ,而不是用栈或递归的方法遍历
注:不同的线索化方式对应不同的线索化的遍历(并且一棵树只能线索化一次)
前序线索化-----前序线索化遍历 (根左右)
中序线索化-----中序线索化遍历 (左根右)
后序线索化-----后序线索化遍历 (左右根)
/*
递归形似完成前序遍历
*/
void preVisted(BitTree *root)
{
if(rootNULL) return ;
printf("%d ",root->data);
preVisted(root->lchild);
preVisted(root->rchild);
}
void nonPreVisted(BitTree *root)
{
if(rootNULL) return ;
Stack s;
init(&s);
push(&s,root);
while(!isEmpty(&s))
{
root=pop(&s);
printf("%d ",root->data);
if(root->rchild!=NULL) push(&s,root->rchild);
if(root->lchild!=NULL) push(&s,root->lchild);
}
}
7、无向图中的节点数量与边的关系函数是什么?
无向完全图 节点数为n,则有n(n-1)/2条边。(有向完全图有n(n-1)条边。
8、稀疏矩阵的基本存储方式,三类特殊矩阵的存储方式。
①三元组表、十字链表。
②对称矩阵:aij=aji,对称矩阵中的元素关于主对角线对称,故存储矩阵中上三角或下三角中的元素,每两个对称的元素共享一个存储空间。这样,能节约近一半的存储空间。一般情况下,按行优先顺序存储主对角线(包括对角线)以下的元素。
三角矩阵:以主对角线划分,三角矩阵有上三角和下三角两种。右上左下。
三角矩阵中的重复元素c可共享一个存储空间,其余元素正好有n(n-1)/2个,因此,三角矩阵可压缩存储到向量sa[nx(n-1)/2+1]中,其中c存放在向量的最后一个分量中。
对角矩阵: 对角矩阵中,所有非零元素都集中在以对角线为中心的带状区域中,即除主对角线和主对角线邻近的上、下方,其他元素均为0.
对角矩阵可按行优先顺序或对角线的顺序,将其压缩存储到一个向量中,并且也能找到每个非零元素与向量下标的对应关系。
9、冒泡排序、希尔排序、快速排序的实现过程
希尔排序:缩小增量排序,
思想:首先,取一个小于n的整数d1作为第一个增量,把所需的所有数据分成d1个组,所有元素位置的距离为d1的整数倍放在同一数组中,在各组内进行直接插入排序;然后取第二个增量d2<d1,重复上述分组和排序,直至所取的增量d1=1,即把所有文件放在同一组中进行直接插入排序为止。
我们选择增量gap=length/2,缩小增量继续以gap = gap/2的方式,这种增量选择我们可以用一个序列来表示,{n/2,(n/2)/2…1},称为增量序列。
代码:
void shellSort(int a[],int n)
{
int temp,i;
for(i=n/2;i>=1;i--)
{//增量序列i由n/2一次递减直至i=1
for(int j=0;j<n-i;j++)
{//数据各组进行交换
if(a[i]>a[j+i];
a[i]=a[j+i];
a[j+i]=temp;
}
}
}
冒泡排序
它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。