1.建立一个长度为n的有序单链表的时间复杂度
0(n^2)
2.哈希算法
key%p:p最好为质数
如果两个关键字的值不等但哈希函数值相等,则称这两个关键字为同义词(正确);
3.二分查找
注意: 二分查找是向下查询的
二分查找,因为它是顺序表
,所以直接 1.(1+14)/2=7
>4 r=6
2.(1+6)/2=3
<4 l=4
3.(4+6)/2=5
>4 r=4 (4+4)/2=4 7 3 5 4
4.DFS和BFS
深度优先遍历的思想类似于树的先序遍历。其遍历过程可以描述为:从图中某个顶点v出发,访问该顶点,然后依次从v的未被访问的邻接点出发继续深度优先遍历图中的其余顶点,直至图中所有与v有路径相通的顶点都被访问完为止;
BFS是根据节点的与节点之间的距离长度来的——>先遍历与顶点a邻接的顶点,因此前面是abce,直接排除ACD,选B
5.快速排序(补)
当数列越无序,快速排序的时间复杂度越低,最低为0(nlogn);
快速排序在基本有序的时候算法时间复杂度是最坏的,此时为0(n^2)
6.数据结构
1.线性结构是一个有序数据元素的集合。 其中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的。
常用的线性结构有:线性表,栈,队列,双队列,数组,串。
2.非线性结构中各个数据元素不再保持在一个线性序列中,每个数据元素可能与零个或者多个其他数据元素发生联系。根据关系的不同,可分为层次结构和群结构。
常见的非线性结构有:二维数组,数组,广义表,树(二叉树等),图。(其中数组是由多个一维数组组成的,所以不再是线性结构)
7.链表
非空的双向循环链表
中任何结点的前驱指针
均不为空
。(正确)
8.希尔排序
(49,13,27,50,76,38,65,97)
9.树的遍历:
A
10.最小生成树:
【答案】n - 1
连通图:无向图中,对于图中任意两个顶点之前有路径,则称此图为连通图。n个顶点构成连通图它的边有多种可能,不使用图的边数来计算最小生成树的变数。
生成最小生成树需要包含图中各点,因此连接的边数为n - 1。
11.堆的定义:
大题
1.统计二叉树中节点的个数
int count=0;
void math_count(Bitree* bt,int *count){
//1.base:当前节点不为空,+1
if(bt==NULL){
return;
}
//2.前序位置:节点数+1
*count++;
//3.递归当前根节点的左右子树
math_count(bt->lchild,count);
math_count(bt->rchild,count);
}
2.选择排序
void select_sort(Node* head){
Node* current=head;
while(current){ //选择外层节点
Node* temp=current->next; //内层比较节点
while(temp){
if(temp->data<current->data){
int temp_data=current->data;
current->data=temp->data;
temp->data=temp_data;
}
temp=temp->next; //内层指针更新
}
current=current->next;
}
}
3.插入排序
void insert_sort(int[]nums){
//1.插入排序是从第二个元素开始的
for(int i=1;i<nums.length;i++){
int j=i;
//2.从后往前遍历,将元素插入到合适的位置
while(j>0&&nums[j]<nums[j-1]){
//交换
int temp=arr[j-1];
arr[j-1]=arr[j];
arr[j]=temp;
j--;
}
}
}
4.节点所在层数
int level=0;
//寻找target所在的层数
void math_level(Bitree* bt,int target){
//1.base
if(bt==NULL) return;
level++;
//2.前序:判断target在哪个位置
if(bt->data==target) return; //当前根节点的data=target,return
else if(bt->lchild&&bt->data>target) math_level(bt->lchild,target); //递归搜索当前节点的左子树
else if(bt->rchild&&bt->data<target) math_level(bt->rchild,target); //递归右子树
}