北航第五次数据结构与程序设计编程题复习

北航第五次数据结构与程序设计编程题复习

  • 树叶节点遍历(树-基础题)
  • 计算器(表达式计算-表达式树实现)
  • 服务优化
  • 词频统计(树实现)

树叶节点遍历(树-基础题)

【问题描述】

从标准输入中输入一组整数,在输入过程中按照左子结点值小于根结点值、右子结点值大于等于根结点值的方式构造一棵二叉查找树,然后从左至右输出所有树中叶结点的值及高度(根结点的高度为1)。例如,若按照以下顺序输入一组整数:50、38、30、64、58、40、10、73、70、50、60、100、35,则生成下面的二叉查找树:
在这里插入图片描述从左到右的叶子结点包括:10、35、40、50、60、70、100,叶结点40的高度为3,其它叶结点的高度都为4。

【输入形式】

先从标准输入读取整数的个数,然后从下一行开始输入各个整数,整数之间以一个空格分隔。
【输出形式】

按照从左到右的顺序分行输出叶结点的值及高度,值和高度之间以一个空格分隔。
【样例输入】

13

50 38 30 64 58 40 10 73 70 50 60 100 35
【样例输出】

10 4

35 4

40 3

50 4

60 4

70 4

100 4
【样例说明】

按照从左到右的顺序输出叶结点(即没有子树的结点)的值和高度,每行输出一个。
【评分标准】

该题要求输出所有叶结点的值和高度,提交程序名为:bst.c


这个题的大体框架就是逐点插入法,但是要多做一步:结点结构体中多加一项元素deep,用于存放节点的深度。结点插入时,每和已有树中结点比较一次,deep加一。
题目要求从左往右打印叶子结点,其实就是中序遍历的思想。但实际上,中间的根结点不可能是需要访问的叶子结点(你都是根了肯定有子节点啊),因此只需要先遍历左子树再右子树就可以了。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct node
{int val;int deep;struct node*left;struct node*right;
}BTNode;
BTNode* root=NULL;
void insert(int);
void leaf(BTNode*);
int main()
{int n,item;scanf("%d",&n);for(int i=0;i<n;i++){scanf("%d",&item);insert(item);}leaf(root);
}
void insert(int item)
{BTNode* new=(BTNode*)malloc(sizeof(BTNode));new->deep=1;new->left=new->right=NULL;new->val=item;if(root==NULL){root=new;return;}BTNode* cur=root;while(1){if(item<cur->val){new->deep++;if(cur->left==NULL){cur->left=new;   break;          }elsecur=cur->left;}else if(item>=cur->val){new->deep++;if(cur->right==NULL){cur->right=new;break;}  elsecur=cur->right;}}
}
void leaf(BTNode* root)
{if(root==NULL)return;if(root->left==NULL&&root->right==NULL)printf("%d %d\n",root->val,root->deep);leaf(root->left);leaf(root->right);
}

计算器(表达式计算-表达式树实现)

【问题描述】

从标准输入中读入一个整数算术运算表达式,如24 / ( 1 + 2 + 36 / 6 / 2 - 2) * ( 12 / 2 / 2 )= ,计算表达式结果,并输出。

要求:
1、表达式运算符只有+、-、*、/,表达式末尾的=字符表示表达式输入结束,表达式中可能会出现空格;
2、表达式中会出现圆括号,括号可能嵌套,不会出现错误的表达式;
3、出现除号/时,以整数相除进行运算,结果仍为整数,例如:5/3结果应为1。

4、要求采用表达式树来实现表达式计算。

表达式树(expression tree):

我们已经知道了在计算机中用后缀表达式和栈来计算中缀表达式的值。在计算机中还有一种方式是利用表达式树来计算表达式的值。表达式树是这样一种树,其根节点为操作符,非根节点为操作数,对其进行后序遍历将计算表达式的值。由后缀表达式生成表达式树的方法如下:

l 读入一个符号:

l 如果是操作数,则建立一个单节点树并将指向他的指针推入栈中;

l 如果是运算符,就从栈中弹出指向两棵树T1和T2的指针(T1先弹出)并形成一棵新树,树根为该运算符,它的左、右子树分别指向T2和T1,然后将新树的指针压入栈中。

例如输入的后缀表达为:

ab+cde+**

则生成的表达式树为:
在这里插入图片描述

【输入形式】

从键盘输入一个以=结尾的整数算术运算表达式。操作符和操作数之间可以有空格分隔。

【输出形式】

首先在屏幕上输出表达式树根、左子节点及右子节点上的运算符或操作数,中间由一个空格分隔,最后有一个回车(如果无某节点,则该项不输出)。然后输出表达式计算结果。
【样例输入】

24 / ( 1 + 2 + 36 / 6 / 2 - 2) * ( 12 / 2 / 2 ) =

【样例输出】

  • / /

18

【样例说明】

按照运算符及括号优先级依次计算表达式的值。在生成的表达树中,*是根节点的运算符,/ 是根节点的左子节点上运算符,/是根节点的右子节点上运算符,按题目要求要输出。

【评分标准】

通过所有测试点得满分。


我们之前用栈做过这个题,先把表达式转为逆波兰表达式,然后再计算,这次我们又多了一种办法:表达式树。
表达式树的特点是:叶结点是操作数,其他结点为操作符。
在这里插入图片描述
要构造表达式树,首先需要将表达式转化为后缀表达式。然后:
从左往右依次读入符号:
如果是操作数,则建立一个单节点树并将指向该节点的指针推入栈中
如果是运算符,则从栈中弹出两个树节点的指针并形成一棵新树,树根为运算符。然后将新树压入栈中。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
enum set {OP,NUM};
typedef struct item
{enum set type;union{char ope;int num;}uni;
}ITEM;
typedef struct node
{ITEM item;int calnum;struct node*left;struct node*right;
}BTnode;
void remove_zero(char*);
void toReversePoland(char*);
int Priority(char);
void cal(ITEM*,int);
int main()
{char arr[100];gets(arr);remove_zero(arr);toReversePoland(arr);return 0;
}
void remove_zero(char* a)
{int i=0,j=0;while(a[j]!='\0'){if(a[j]!=' '){a[i]=a[j];j++;i++;}elsej++;}a[i]='\0';
}
void toReversePoland(char* a)
{ITEM arr[100];int index=0;char operation[100];int Top=-1;for(int i=0;i<strlen(a);i++){if(a[i]>='0'&&a[i]<='9'){int num=a[i]-'0';for(int j=i+1;j<strlen(a);j++){if(a[j]>='0'&&a[j]<='9'){num=num*10+(a[j]-'0');}else{arr[index].type=NUM;arr[index].uni.num=num;i=j-1;index++;break;}}}else if(a[i]=='=')break;else if(a[i]=='+'||a[i]=='-'||a[i]=='*'||a[i]=='/'){if(Top==-1)operation[++Top]=a[i];else{while(Top>-1&&operation[Top]!='('&&(Priority(operation[Top])>=Priority(a[i]))){arr[index].type=OP;arr[index].uni.ope=operation[Top];index++;Top--;}operation[++Top]=a[i];}}else if(a[i]=='('){operation[++Top]='(';}else if(a[i]==')'){char top=operation[Top];while(top!='('){arr[index].type=OP;arr[index].uni.ope=top;index++;Top--;top=operation[Top];}Top--;}}while(Top!=-1){arr[index].type=OP;arr[index].uni.ope=operation[Top];index++;Top--;}// for(int i=0;i<index;i++)// {//     if(arr[i].type==OP)//         printf("%c ",arr[i].uni.ope);//     else//         printf("%.2f ",arr[i].uni.num);// }cal(arr,index);
}
int Priority(char a)
{if(a=='+'||a=='-')return 1;if(a=='*'||a=='/')return 2;
}
void cal(ITEM* arr,int n)
{BTnode* stack[100];int top=0;for(int i=0;i<n;i++){if(arr[i].type==NUM){BTnode* new=(BTnode*)malloc(sizeof(BTnode));new->item=arr[i];new->calnum=arr[i].uni.num;new->left=new->right=NULL;stack[top++]=new;}else{BTnode*new=(BTnode*)malloc(sizeof(BTnode));top--;BTnode* x1=stack[top];top--;BTnode* x2=stack[top];new->left=x2;new->right=x1;if(arr[i].uni.ope=='+'){new->item=arr[i];new->calnum=x1->calnum+x2->calnum;}else if(arr[i].uni.ope=='-'){new->item=arr[i];new->calnum=x2->calnum-x1->calnum;}else if(arr[i].uni.ope=='*'){new->item=arr[i];new->calnum=x2->calnum*x1->calnum;}else if(arr[i].uni.ope=='/'){new->item=arr[i];new->calnum=x2->calnum/x1->calnum;}stack[top++]=new;}}if(stack[0]->item.type==OP){printf("%c ",stack[0]->item.uni.ope);}else if(stack[0]->item.type==NUM){printf("%d ",stack[0]->calnum);}if(stack[0]->left){if(stack[0]->left->item.type==OP){printf("%c ",stack[0]->left->item.uni.ope);}else if(stack[0]->left->item.type==NUM){printf("%d ",stack[0]->left->item.uni.num);}}if(stack[0]->right){if(stack[0]->right->item.type==OP){printf("%c\n",stack[0]->right->item.uni.ope);}else if(stack[0]->right->item.type==NUM){printf("%d\n",stack[0]->right->item.uni.num);}}else{printf("\n");}printf("%d",stack[0]->calnum);
}

我在树结构体中加入了一项calnum,这一项是用于存储弹出的两个运算数运算后的值。如果遍历逆波兰表达式时,访问到运算数,那么calnum就等于运算数的值,如果是运算符,就存储弹栈出的两个数的值。

逆波兰表达式的转换我是直接copy上一次作业中写好的代码的,大家考试前也可以这么搞,就是把一些常用的算法结构写好,考试时候直接粘贴,考试浪费的时间 - -。

服务优化

【问题描述】

假设某机场所有**登机口(Gate)**呈树形排列(树的度为3),安检处为树的根,如下图所示。图中的分叉结点(编号大于等于100)表示分叉路口,登机口用小于100的编号表示(其一定是一个叶结点)。通过对机场所有出发航班的日志分析,得知每个登机口每天的平均发送旅客流量。作为提升机场服务水平的一个措施,在不改变所有航班相对关系的情况下(即:出发时间不变,原在同一登机口的航班不变),仅改变登机口(例如:将3号登机口改到5号登机口的位置),使得整体旅客到登机口的时间有所减少(即:从安检口到登机口所经过的分叉路口最少)。
在这里插入图片描述
编写程序模拟上述登机口的调整,登机口调整规则如下:

1)首先按照由大到小的顺序对输入的登机口流量进行排序,流量相同的按照登机口编号由小到大排序;

2)从上述登机口树的树根开始,将登机口按照从上到下(安检口在最上方)、从左到右的顺序,依次对应上面排序后将要调整的登机口。

例如上图的树中,若只考虑登机口,则从上到下有三层,第一层从左到右的顺序为:5、6、14、13,第二层从左到右的顺序为:7、8、9、10、1、2、18、17、16、15,第三层从左到右的顺序为:11、12、3、4、20、19。若按规则1排序后流量由大至小的前五个登机口为3、12、16、20、15,则将流量最大的3号登机口调整到最上层且最左边的位置(即:5号登机口的位置),12号调整到6号,16号调整到14号,20号调整到13号,15号调整到第二层最左边的位置(即7号登机口的位置)。

【输入形式】

1)首先按层次从根开始依次输入树结点之间的关系。其中分叉结点编号从数字100开始(树根结点编号为100,其它分叉结点编号没有规律但不会重复),登机口为编号小于100的数字(编号没有规律但不会重复,其一定是一个叶结点)。树中结点间关系用下面方式描述:

R S1 S2 S3 -1

其中R为分叉结点,从左至右S1,S2,S3分别为树叉R的子结点,其可为树叉或登机口,由于树的度为3,S1,S2,S3中至多可以2个为空,最后该行以-1和换行符结束。各项间以一个空格分隔。如:

100 101 102 103 -1

表明编号100的树根有三个子叉,编号分别为101、102和103,又如:

104 7 8 -1

表明树叉104上有2个编号分别为7和8的登机口。

假设分叉结点数不超过100个。分叉结点输入的顺序不确定,但可以确定:输入某个分叉结点信息时,其父结点的信息已经输入。

输入完所有树结点关系后,在新的一行上输入-1表示树结点关系输入完毕。

2)接下来输入登机口的流量信息,每个登机口流量信息分占一行,分别包括登机口编号(1~99之间的整数)和流量(大于0的整数),两整数间以一个空格分隔。登机口数目与前面构造树时的登机机口数目一致。

【输出形式】

按照上述调整规则中排序后的顺序(即按旅客流量由大到小,流量相同的按照登机口编号由小到大)依次分行输出每个登机口的调整结果:先输出调整前的登机口编号,然后输出字符串"->"(由英文减号字符与英文大于字符组成),再输出要调整到的登机口编号。

【样例输入】

100 101 102 103 -1

103 14 108 13 -1

101 5 104 6 -1

104 7 8 -1

102 105 106 107 -1

106 1 110 2 -1

108 16 15 -1

107 18 111 17 -1

110 3 4 -1

105 9 109 10 -1

111 20 19 -1

109 11 12 -1

-1

17 865

5 668

20 3000

13 1020

11 980

8 2202

15 1897

6 1001

14 922

7 2178

19 2189

1 1267

12 3281

2 980

18 1020

10 980

3 1876

9 1197

16 980

4 576

【样例输出】

12->5

20->6

8->14

19->13

7->7

15->8

3->9

1->10

9->1

13->2

18->18

6->17

2->16

10->15

11->11

16->12

14->3

17->4

5->20

4->19

【样例说明】

样例输入了12条树结点关系,形成了如上图的树。然后输入了20个登机口的流量,将这20个登机口按照上述调整规则1排序后形成的顺序为:12、20、8、19、7、15、3、1、9、13、18、6、2、10、11、16、14、17、5、4。最后按该顺序将所有登机口按照上述调整规则2进行调整,输出调整结果。
【评分标准】

该题要求计算并输出登机口的调整方法,提交程序名为adjust.c。


咳咳来北航当程序员阅读能力一定要好……审题占写完整道题的50%……
首先,我们看看这个题的结构体怎么定义:树的度为三,那就是三叉树,我们应该在结构体里定义left mid right三个指针。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAX 100
typedef struct node
{int id;int passenger;struct node* left;struct node* mid;struct node* right;
}BTNode;BTNode* root;
int GateCount=0;
void Insert(int,BTNode*);
BTNode* findroot(int);
BTNode* find(int,BTNode*);
void Adjust(BTNode*);
int cmp1(const void* p1,const void* p2){return (*(BTNode**)p2)->passenger-(*(BTNode**)p1)->passenger;
}
int cmp2(const void* p1,const void* p2){return (*(BTNode**)p1)->id-(*(BTNode**)p2)->id;
}
int main()
{int R,S;scanf("%d",&R);while(R!=-1){ BTNode* r=findroot(R);scanf("%d",&S);     while(S!=-1){if(S<100)GateCount++;Insert(S,r);scanf("%d",&S);}scanf("%d",&R);}int gate,num;for(int i=0;i<GateCount;i++){scanf("%d %d",&gate,&num);BTNode* Gate=find(gate,root);Gate->passenger=num;}Adjust(root);
}
BTNode* find(int n,BTNode* p)
{if(p==NULL)return NULL;if(p->id==n)return p;BTNode* tar=NULL;tar=find(n,p->left);if(tar==NULL)tar=find(n,p->mid);if(tar==NULL)tar=find(n,p->right);return tar;
}
BTNode* findroot(int r)
{if(root==NULL){root=(BTNode*)malloc(sizeof(BTNode));root->id=r;root->passenger=0;root->left=root->right=root->mid=NULL;return root;}return find(r,root);   
}
void Insert(int s,BTNode* r)
{BTNode* new=(BTNode*)malloc(sizeof(BTNode));new->id=s;new->passenger=0;new->left=new->mid=new->right=NULL;if(r->left==NULL){r->left=new;return;}if(r->left!=NULL&&r->mid==NULL){r->mid=new;return;}    if(r->left!=NULL&r->mid!=NULL&&r->right==NULL){r->right=new;return;}
}
void Adjust(BTNode* root)
{BTNode* queue[MAX];BTNode* Gates[GateCount];int index=0;int Front=0,Rear=MAX-1,Count=0;Rear=(Rear+1)%MAX;queue[Rear]=root;Count++;while(Count!=0){BTNode* R=queue[Front];Front=(Front+1)%MAX;Count--;if(R->left==NULL&&R->mid==NULL&&R->right==NULL)Gates[index++]=R;else{if(R->left){Rear=(Rear+1)%MAX;queue[Rear]=R->left;Count++;}if(R->mid){Rear=(Rear+1)%MAX;queue[Rear]=R->mid;Count++;}if(R->right){Rear=(Rear+1)%MAX;queue[Rear]=R->right;Count++;}}}BTNode* Gates_1[GateCount];memcpy(Gates_1,Gates,sizeof(BTNode*)*GateCount);qsort(Gates_1,GateCount,sizeof(BTNode*),cmp1);for(int i=0;i<GateCount;i++){int num=1;int start=i;while(i+1<GateCount&&Gates_1[i]->passenger==Gates_1[i+1]->passenger){i++;num++;}if(num>1){qsort(Gates_1+start,num,sizeof(BTNode*),cmp2);}}for(int i=0;i<GateCount;i++){printf("%d->%d\n",Gates_1[i]->id,Gates[i]->id);}
}

这个题我觉得非常好,考点非常全面,考到了树的构造,树的遍历,查找指定节点,层序遍历,还有在快排中怎样以两个关键词排序。
最后还有一个小小的点需要注意一下:每个分支节点有三个指针,这三个指针可能都指向分支节点,也可能都指向登机口节点(图上没有表示,图上最多只有两个)。因此在插入树节点

词频统计(树实现)

【问题描述】

编写程序统计一个英文文本文件中每个单词的出现次数(词频统计),并将统计结果按单词字典序输出到屏幕上。

要求:程序应用二叉排序树(BST)来存储和统计读入的单词。

注:在此单词为仅由字母组成的字符序列。包含大写字母的单词应将大写字母转换为小写字母后统计。在生成二叉排序树不做平衡处理。

【输入形式】

打开当前目录下文件article.txt,从中读取英文单词进行词频统计。

【输出形式】

程序应首先输出二叉排序树中根节点、根节点的右节点及根节点的右节点的右节点上的单词(即root、root->right、root->right->right节点上的单词),单词中间有一个空格分隔,最后一个单词后没有空格,直接为回车(若单词个数不足三个,则按实际数目输出)。

程序将单词统计结果按单词字典序输出到屏幕上,每行输出一个单词及其出现次数,单词和其出现次数间由一个空格分隔,出现次数后无空格,直接为回车。

【样例输入】

当前目录下文件article.txt内容如下:

"Do not take to heart every thing you hear."she says.(这个she says是我自己加的

“Do not spend all that you have.”

"Do not sleep as long as you want;"who(也是我加的

【样例输出】

do not take

all 1

as 2

do 3

every 1

have 1

hear 1

heart 1

long 1

not 3

sleep 1

spend 1

take 1

that 1

thing 1

to 1

want 1

you 3

【样例说明】

程序首先在屏幕上输出程序中二叉排序树上根节点、根节点的右子节点及根节点的右子节点的右子节点上的单词,分别为do not take,然后按单词字典序依次输出单词及其出现次数。

【评分标准】

通过全部测试点得满分


为什么我要加一个she says呢?因为hear."she这一串中没有空格,如果你要用fscanf读的话,这个就被识别为一个单词了,但是很明显,这是两个独立的单词,hear和she,因此需要巧妙地处理一下:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>
typedef struct node
{char word[50];int num;struct node* left;struct node* right;
}BTNode;
BTNode* root;
void Insert(char*);
void Inorder(BTNode*);
int main()
{FILE* fp=fopen("article.txt","r");//------------------------------------------------//这部分用于单词的正确读写int ch;char str[50];int index=0;while((ch=fgetc(fp))!=EOF){ch=tolower(ch);if(ch>='a'&&ch<='z')str[index++]=ch;else{if(index>0){str[index]='\0';Insert(str);index=0;}} }//这个判断很重要,//因为如果最后一个单词后面没有标点,直接是EOF,//那么最后一个单词就不正确插入树中,//这也是为什么我在最后加了一个who的原因,用于测试这一部分。if(index>0){str[index]='\0';Insert(str);}//-------------------------------------------------if(root!=NULL){printf("%s ",root->word);}if(root->right!=NULL){printf("%s ",root->right->word);}if(root->right->right!=NULL){printf("%s",root->right->right->word);}printf("\n");Inorder(root);return 0;
}
void Insert(char* s)
{if(root==NULL){root=(BTNode*)malloc(sizeof(BTNode));strcpy(root->word,s);root->num=1;root->left=root->right=NULL;return;}BTNode* cur=root;while(1){int cmp=strcmp(s,cur->word);if(cmp==0){cur->num++;break;}else if(cmp>0){if(cur->right==NULL){BTNode* new=(BTNode*)malloc(sizeof(BTNode));strcpy(new->word,s);new->num=1;new->left=new->right=NULL;cur->right=new;break;}elsecur=cur->right;}else{if(cur->left==NULL){BTNode* new=(BTNode*)malloc(sizeof(BTNode));strcpy(new->word,s);new->num=1;new->left=new->right=NULL;cur->left=new;break;}elsecur=cur->left;}}
}
void Inorder(BTNode* p)
{if(p==NULL)return;Inorder(p->left);printf("%s %d\n",p->word,p->num);Inorder(p->right);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/345744.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

React的useState的基础使用

import {useState} from react // 1.调用useState添加状态变量 // count 是新增的状态变量 // setCount 修改状态变量的方法 // 2.添加点击事件回调 // userState实现计数实例import {useState} from react// 使用组件 function App() {// 1.调用useState添加状态变量// coun…

Qt——升级系列(Level Four):控件概述、QWidget 核心属性、按钮类控件

目录 控件概述 QWidget 核心属性 核心属性概览 enabled geometry windowTitle windowIcon windowOpacity cursor font toolTip focusPolicy styleSheet 按钮类控件 Push Button Radio Buttion Check Box Tool Button 控件概述 Widget 是 Qt 中的核⼼概念. 英⽂原义是 "…

运维一个宝塔面板的php项目的艰辛历程【解决了http3,ssl,quic】

在这个项目的环境 使用了宝塔面板 有4个php:php5.6,php7.3,php7.4,php8.0 nignx为1.20版本 升级计划&#xff1a; 升级nginx1.26.0版本&#xff0c;添加上http3协议&#xff0c;添加ssl证书 遇到的问题&#xff1a; 升级nginx1.26版本后 无法打开php5.6的后台 原因&#xff…

PromptPort:为大模型定制的创意AI提示词工具库

PromptPort&#xff1a;为大模型定制的创意AI提示词工具库 随着人工智能技术的飞速发展&#xff0c;大模型在各行各业的应用越来越广泛。而在与大模型交互的过程中&#xff0c;如何提供精准、有效的提示词成为了关键。今天&#xff0c;就为大家介绍一款专为大模型定制的创意AI…

Llama模型家族之Stanford NLP ReFT源代码探索 (二)Intervention Layers层

LlaMA 3 系列博客 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;一&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;二&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;三&#xff09; 基于 LlaMA…

QT error: allocation of incomplete type ‘Ui::Server‘

目录 前言 报错内容&#xff1a; 过程解析&#xff1a; 原因分析&#xff1a; daisy.skye的博客 QT合集http://t.csdnimg.cn/wEVbu 前言 最近又开始需要做上位机了&#xff0c;要知道qt上位机对我来说已经3年没有接触了&#xff0c;最开始接触还是毕业时工作中的简单学习和…

数据结构 -- 树状数组

前言 树状数组或二叉索引树&#xff08;Binary Indexed Tree&#xff09;&#xff0c;又以其发明者命名为 Fenwick 树。其初衷是解决数据压缩里的累积频率的计算问题&#xff0c;现多用于高效计算数列的前缀和、区间和。它可以以 O(logn) 的时间得到任意前缀和。并同时支持在 …

计算机毕业设计python+spark知识图谱音乐推荐系统 音乐数据分析可视化大屏 音乐爬虫 LSTM情感分析 大数据毕设 深度学习 机器学习

流程&#xff1a; 1.Python采集网易云音乐歌手、歌词、音乐、评论等约10-20万海量数据&#xff0c;存入mysql数据库&#xff1b; 2.使用pandasnumpy/MapReduce对mysql中四类数据进行数据清洗&#xff0c;写入.csv文件并上传至hdfs(含评论NLP文本分类/lsm情感分析); 3.使用hive建…

关于科技的总结与思考

文章目录 互联网时代有趣的数字数据驱动大数据的两个特性数据保护互联网免费模式的再探讨平台互联网的意义人工智能伦理的思考语言理性人梅特卡夫定律冲浪的神奇之处AR的恐怖之处叙词表、受控词表和大众分类法六度/十九度的解读知识图谱是真正的仿生智能幂次法则和优先连接现代…

MyBatis插件机制

MyBatis插件机制是该框架提供的一种灵活扩展方式&#xff0c;允许开发者在不修改框架源代码的情况下对MyBatis的功能进行定制和增强。这种机制主要通过拦截器&#xff08;Interceptor&#xff09;实现&#xff0c;使得开发者可以拦截和修改MyBatis在执行SQL语句过程中的行为。 …

【AI大模型】Transformers大模型库(五):AutoModel、Model Head及查看模型结构

目录​​​​​​​ 一、引言 二、自动模型类&#xff08;AutoModel&#xff09; 2.1 概述 2.2 Model Head&#xff08;模型头&#xff09; 2.3 代码示例 三、总结 一、引言 这里的Transformers指的是huggingface开发的大模型库&#xff0c;为huggingface上数以万计的预…

ChatGPT Prompt技术全攻略-总结篇:Prompt工程技术的未来发展

系列篇章&#x1f4a5; No.文章1ChatGPT Prompt技术全攻略-入门篇&#xff1a;AI提示工程基础2ChatGPT Prompt技术全攻略-进阶篇&#xff1a;深入Prompt工程技术3ChatGPT Prompt技术全攻略-高级篇&#xff1a;掌握高级Prompt工程技术4ChatGPT Prompt技术全攻略-应用篇&#xf…

DNS协议 | NAT技术 | 代理服务器

目录 一、DNS协议 1、DNS背景 2、DNS协议 域名 域名解析 二、NAT技术 1、NAT技术 2、NAPT技术 3、NAT技术的缺陷 三、代理服务器 1、正向代理服务器 2、反向代理服务器 一、DNS协议 域名系统&#xff08;Domain Name System&#xff0c;缩写&#xff1a;DNS&#…

20240605解决飞凌的OK3588-C的核心板刷机原厂buildroot不能连接ADB的问题

20240605解决飞凌的OK3588-C的核心板刷机原厂buildroot不能连接ADB的问题 2024/6/5 13:53 rootrootrootroot-ThinkBook-16-G5-IRH:~/repo_RK3588_Buildroot20240508$ ./build.sh --help rootrootrootroot-ThinkBook-16-G5-IRH:~/repo_RK3588_Buildroot20240508$ ./build.sh lun…

【学术小白成长之路】02三方演化博弈(基于复制动态方程)期望与复制动态方程

从本专栏开始&#xff0c;笔者正式研究演化博弈分析&#xff0c;其中涉及到双方演化博弈分析&#xff0c;三方演化博弈分析&#xff0c;复杂网络博弈分析等等。 先阅读了大量相关的博弈分析的文献&#xff0c;总结了现有的研究常用的研究流程&#xff0c;针对每个流程进行拆解。…

快速搭建rtsp server(Ubuntu)

在现代视频监控和实时视频流媒体应用中&#xff0c;实时流协议&#xff08;RTSP&#xff09;服务器扮演着至关重要的角色。无论是家庭安防系统、企业级监控还是流媒体服务&#xff0c;RTSP服务器都能提供高效、稳定的解决方案。然而&#xff0c;对于许多初学者或开发者来说&…

数学建模笔记

数学建模 定义角度 数学模型是针对参照某种事物系统的特征或数量依存关系&#xff0c;采用数学语言&#xff0c;概括地或近似地表述出的一种数学结构&#xff0c;这种数学结构是借助于数学符号刻画出来的某种系统的纯关系结构。从广义理解&#xff0c;数学模型包括数学中的各…

高考分数查询结果自动推送至微信(卷II)

祝各位端午节安康&#xff01;只要心中无结&#xff0c;每天都是节&#xff0c;开心最重要&#xff01; 在上一篇文章高考分数查询结果自动推送至微信&#xff08;卷Ⅰ&#xff09;-CSDN博客中谈了思路&#xff0c;今天具体实现。文中将敏感信息已做处理&#xff0c;读者根据自…

【大学物理】波动光学:光的衍射

23.2 单缝的夫琅禾费衍射_哔哩哔哩_bilibili 1 光的衍射和惠更斯-菲涅尔原理 干涉vs衍射&#xff1a;干涉研究的是两个分立的子光源&#xff0c;衍射研究的是连续的子光源。 两位科学家用分解的思想&#xff0c;一个解决了方向一个解决了光强。 2 单缝的夫琅禾费衍射 夫琅禾…

【SpringBoot + Vue 尚庭公寓实战】项目初始化准备(二)

【尚庭公寓SpringBoot Vue 项目实战】项目初始化准备&#xff08;二&#xff09; 文章目录 【尚庭公寓SpringBoot Vue 项目实战】项目初始化准备&#xff08;二&#xff09;1、导入数据库2、创建工程3、项目初始配置3.1、SpringBoot依赖配置3.2、创建application.yml文件3.3、…