分析这段递归函数的时间复杂度void find(int i){ for(int j=1;j<=n;j++){ if(g[i][j]==1){ g[j][i]=g[i][j]=0; //擦除i-j的连线 find(j); } } c[++ci]=i; }
时间: 2024-05-22 14:16:47 浏览: 42
这段递归函数实际上是对一个图进行深度优先遍历,并将遍历的结果存储在数组c中。具体来说,对于当前节点i,依次遍历与其相邻的节点j,并将i和j之间的连线擦除,然后递归遍历j节点。当遍历完所有与i相邻的节点后,将i存储到数组c中。
时间复杂度分析:
遍历整个图需要遍历每个节点,而对于每个节点,需要遍历其相邻的节点,因此总的时间复杂度为O(n^2)。但是,在遍历过程中,每条边只会被遍历一次,并且每个节点也只会被遍历一次,因此实际的时间复杂度应该是O(m+n),其中m为边数。
相关问题
请详细解释下列代码:#include<iostream> #include<fstream> using namespace std; int MIN(int n, int m){ if (n > m) return m; else return n; } int MAXMUM(int i, int j){ if (i > j) return i; else return j; } int MAX(int *D, int i, int j){ int max, mid, max1, max2; if (i == j) max = D[i]; else if (i == j - 1) if (D[i] < D[j]) max = D[j]; else max = D[i]; else { mid = (i + j) / 2; max1 = MAX(D, i, mid); max2 = MAX(D, mid + 1, j); max = MAXMUM(max1, max2); } return max; } void SORT(int P[], int D[],int foo[], int start, int end)//按效益大到小排序 { for (int i = start + 1; i <= end; i++) { int item = P[i]; int item_d = D[i]; int item_f=foo[i]; int j = i - 1; while (j >= start && item > P[j]) { P[j + 1] = P[j]; D[j + 1] = D[j]; foo[j+1]=foo[j]; j--; } P[j + 1] = item; D[j + 1] = item_d; foo[j+1]=item_f; } } int FIND(int *parent, int i){ int j, k, t; j = i; while (parent[j] > 0) j = parent[j];//根 k = i; while (k != j) { t = parent[k]; parent[k] = j; k = t; } return j; } void UNION(int *parent, int i, int j){ int x; x = parent[i] + parent[j]; if (parent[i] > parent[j]) //i的结点少 { parent[i] = j; parent[j] = x; } else { parent[j] = i; parent[i] = x; } } int FJS(int *D, int n, int b, int *J, int *Q){ int i, j, l, k; int *F = new int[n]; int *P = new int[n]; for (i = 0; i <= b; i++) { F[i] = i; P[i] = -1; } k = 0;//初始化J for (i = 1; i <= n; i++){ j = FIND(P, MIN(n, D[i])); if (F[j]!= 0){ k = k + 1; J[k] = i; Q[F[j]] = i; l = FIND(P, F[j] - 1); UNION(P, l, j); F[j] = F[l]; } } return k;//返回最优解的个数 } int main(){ int n, p, d, i, b, k; cin >> n;//作业数 int P[n];//效益 int D[n];//期限 int J[n];//解集 int Q[n];//顺序 int foo[n];//脚标 for (int i = 1; i <= n; i++){ cin >>d>> p; P[i] = p; D[i] = d; foo[i]=i; } SORT(P, D,foo, 1, n); b= MIN(n, MAX(D, 1, n)); for (i = 1; i <= b; i++) Q[i] = -1; k = FJS(D, n, b, J, Q); int sum = 0; for (int i = 1; i <= b; i++){ if (Q[i] != -1) { sum += P[Q[i]]; } } cout << sum << endl; for (int i = 1; i < b; i++) if (Q[i] != -1){ cout <<foo[Q[i]]<< " "; } cout<<foo[Q[b]]; return 0; }
这段代码实现了一个贪心算法,用于解决作业调度问题。具体来说,有n个作业,每个作业有一个效益P和一个期限D,要求将这些作业调度到一个时间轴上,使得效益最大化,同时满足每个作业的完成时间不超过其期限。该算法的主要思路是按照效益从大到小排序,然后依次将作业加入时间轴中,如果在加入某个作业时发现其期限已经过了,则将其舍弃。
该算法中的主要函数包括:
1. MIN函数:返回两个整数中的较小值。
2. MAXMUM函数:返回两个整数中的较大值。
3. MAX函数:递归地求解一个数组中的最大值。
4. SORT函数:按照效益从大到小对作业进行排序。
5. FIND函数:查找某个作业的根节点。
6. UNION函数:将两个作业合并到同一个集合。
7. FJS函数:实现贪心算法的主要部分,返回最优解的个数。
8. main函数:读入作业信息,按照效益排序,调用FJS函数求解最优解,并输出结果。
该算法的时间复杂度为O(nlogn),其中n为作业数量,主要开销在排序和查找根节点上。
请解析以下代码://先序、中序序列交互创建二叉树 void createBiTree(btNode *& T, string &preStr,string &inStr, int i,int j,int len) { //i子树先序起始下标;j子树中序起始下标,len当前子树序列的长度(子树结点数) int m=inStr.find(preStr[i]); //查找子树根结点在中序中位置 if(m==-1) return; //创建失败 if(len>0) { T=new btNode; //创建新结点 T->data=preStr[i]; T->lChild=NULL; T->rChild=NULL; createBiTree(T->lChild,preStr,inStr,i+1,j,m-j); //创建左子树 createBiTree(T->rChild,preStr,inStr,i+(m-j)+1,m+1,len-1-(m-j)); //创建右子树 //m-j左子树结点数(左子树序列长度)。 //len-1-(m-j)右子树结点数(右子树序列长度),创建右子树中的+1、-1是计入根结点的位置 } }
这段代码实现了根据二叉树的先序遍历和中序遍历序列构建二叉树的功能。具体解析如下:
函数名称:createBiTree
参数说明:
- btNode *& T:二叉树根节点的引用,因为在函数中可能会修改根节点的指向。
- string &preStr:二叉树的先序遍历序列,传递引用是为了避免拷贝。
- string &inStr:二叉树的中序遍历序列,传递引用是为了避免拷贝。
- int i:当前子树在先序遍历序列中的起始下标。
- int j:当前子树在中序遍历序列中的起始下标。
- int len:当前子树的节点数。
函数中的变量说明:
- int m:当前子树根节点在中序遍历序列中的下标。
函数实现:
- 首先,在中序遍历序列中查找当前子树的根节点,如果找不到则说明创建失败,返回。
- 如果当前子树的节点数大于0,则创建一个新的二叉树节点,节点的数据为先序遍历序列中的第i个元素。
- 然后,根据当前子树在中序遍历序列中的根节点位置,将中序遍历序列划分为左子树和右子树两个部分,并递归地创建左子树和右子树。
- 在递归创建右子树时,需要注意右子树在先序遍历序列中的起始下标应为i+(m-j)+1,其中m-j为左子树节点数,+1是为了跳过根节点。
该函数使用了递归的方式构建二叉树,时间复杂度为O(nlogn)。
阅读全文
相关推荐
![-](https://img-home.csdnimg.cn/images/20241231044930.png)
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241231044833.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)