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

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

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

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

【问题描述】

从标准输入中输入一组整数,在输入过程中按照左子结点值小于根结点值、右子结点值大于等于根结点值的方式构造一棵二叉查找树,然后从左至右输出所有树中叶结点的值及高度(根结点的高度为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;          
            }
            else
                cur=cur->left;
        }
        else if(item>=cur->val)
        {
            new->deep++;
            if(cur->right==NULL)
            {
                cur->right=new;
                break;
            }  
            else
                cur=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++;
        }
        else
            j++;
    }
    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;
            }
            else
                cur=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;
            }
            else
                cur=cur->left;
        }
    }
}
void Inorder(BTNode* p)
{
    if(p==NULL)
        return;
    Inorder(p->left);
    printf("%s %d\n",p->word,p->num);
    Inorder(p->right);
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Golang的协程调度器GMP

目录 GMP 含义 设计策略 全局队列 P的本地队列 GMP模型以及场景过程 场景一 场景2 场景三 场景四 场景五 场景六 GMP 含义 协程调度器&#xff0c;它包含了运行协程的资源&#xff0c;如果线程想运行协程&#xff0c;必须先获取P&#xff0c;P中还包含了可运行的G…

Vue15-watch对比计算属性

一、姓名案例 1-1、watch实现 1-2、计算属性 对比发现&#xff1a; 计算属性比watch属性更简略一些。 1-3、计算属性 VS 侦听属性 1-4、需求变更 计算属性中不能开启异步任务&#xff01;&#xff01;&#xff01;因为计算属性靠return返回值。但是watch靠亲自写代码去改。 1-…

一款开源文件加速下载利器

前言 大文件的下载&#xff0c;浏览器支持不是很好&#xff0c;今天下载了一个20个G的文件&#xff0c;连续失败了好多次。 然后寻找到了一个开源的下载工具gospeed&#xff0c;可以完美的解决这个问题。而且下载速度快。 简介 Gopeed&#xff08;全称 Go Speed&#xff09;&am…

vscode copilot git commit 生成效果太差,用其他模型替换

问题 众所周知&#xff0c;copilot git commit 就像在随机生成 git commit 这种较为复杂的内容还是交给大模型做比较合适 方法 刚好&#xff0c;gitlens 最近开发了 AI commit的功能&#xff0c;其提供配置url api可以实现自定义模型 gitlens 只有3种模型可用&#xff1a…

重邮计算机网络803-(2)物理层

一.物理层 1.介绍 物理层的主要任务描述为确定与传输媒体的接口的一些特性&#xff0c;即&#xff1a; ①机械特性 指明接口所用接线器的形状和尺寸、引线数目和排列、固定和锁定装置等等。 ②电气特性 指明在接口电缆的各条线上出现的电压的范围。 ③功能特性 指明某条线上…

让AI做2024新高考1卷数学最后一题:AI智商横向对比!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;所以创建了“AI信息Gap”这个公众号&#xff0c;专注于分享AI全维度知识…

动手学深度学习4.10 实战Kaggle比赛:预测房价-笔记练习(PyTorch)

以下内容为结合李沐老师的课程和教材补充的学习笔记&#xff0c;以及对课后练习的一些思考&#xff0c;自留回顾&#xff0c;也供同学之人交流参考。 本节课程地址&#xff1a;实战 Kaggle 比赛&#xff1a;预测房价_哔哩哔哩_bilibili 本节教材地址&#xff1a;4.10. 实战Ka…

Keil软件仿真的使用

一、软件的初始化设置 初始设置可以按照下图&#xff0c;这里我使用的是STM32F103C8T6&#xff0c;所以单片机型号为STM32F103C8&#xff0c;这个设置在Debug目录下。然后进行时钟的设置&#xff0c;我们板上晶振为8M&#xff0c;这里将时钟改为8. 或许有人想问如果是别的型号单…

Vue3学习记录第三天

Vue3学习记录第三天 背景说明学习记录Vue3中shallowReactive()和shallowRef()Vue3中toRaw()和markRaw()前端...语法Vue3中readonly()和shallowReadonly()函数 背景 之前把Vue2的基础学了, 这个课程的后面有简单介绍Vue3的部分. 学习知识容易忘, 这里仅简答做一个记录. 内容都很…

# RocketMQ 实战:模拟电商网站场景综合案例(一)

RocketMQ 实战&#xff1a;模拟电商网站场景综合案例&#xff08;一&#xff09; 一、内容介绍 1、案例介绍&#xff1a; 1.1 业务分析 1&#xff09;下单业务 2&#xff09;支付业务 1.2 问题分析 2、技术分析 2.1 技术选型&#xff1a; 1&#xff09;SpringBoot 2&…

Zynq7000 系列FPGA模块化仪器

• 基于 XilinxXC7Z020 / 010 / 007S • 灵活的模块组合 • 易于嵌入的紧凑型外观结构 • 高性能的 ARM Cortex 处理器 • 成熟的 FPGA 可编程逻辑 &#xff0c;基于 IP 核的软件库 FPGA 控制器 Zynq7000 系列模块是基于 Xilinx XC7Z020/010/007S 全可编程片上系统 (SoC) 的…

【PPT技巧】PPT文件设置了修改权限,如何取消权限编辑文件?

不知道大家在使用PPT文件的时候&#xff0c;是否遇到过下面的提示框&#xff0c;这就是PPT文件设置了修改权限&#xff0c;只有输入密码才可以编辑文件。 如果我们没有输入密码&#xff0c;以只读方式进入&#xff0c;那么我们会发现功能栏中的按钮全是灰色&#xff0c;无法使用…

Vue3【二】 VSCode需要安装的Vue语法插件

VSCode需要安装的 适配Vue3的插件 Vue-Official插件安装

DeepSORT(目标跟踪算法)中的马氏距离详解(很详细)

DeepSORT&#xff08;目标跟踪算法&#xff09;中的马氏距离详解&#xff08;很详细&#xff09; flyfish 马氏距离的公式是由印度统计学家【普拉萨纳钱德拉马哈拉诺比斯&#xff08;Prasanta Chandra Mahalanobis&#xff09;】&#xff09;&#xff08;好长的名字&#xff…

STM32F103C8T6 HAL库 USART1 DMA方式接收数据

前言&#xff1a; 前面的两篇文章都说关于发送的&#xff0c;HAL库发送数据可以调用现成的函数&#xff0c;而接收数据&#xff0c;现成函数不太好用。这里为了记录了一下自己参考了网上几个大佬的代码&#xff0c;整理了一下USART1 DMA方式接受数据的代码&#xff0c;…

【python】OpenCV—Histogram Matching(9.2)

学习来自OpenCV基础&#xff08;17&#xff09;基于OpenCV、scikit-image和Python的直方图匹配 文章目录 直方图匹配介绍scikit-image 中的直方图匹配小试牛刀风格迁移 直方图匹配介绍 直方图匹配&#xff08;Histogram Matching&#xff09;是一种图像处理技术&#xff0c;旨…

一文详解大模型微调全流程

节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学. 针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 汇总合集&…

11-数组与指针深入理解——题型理解

11-数组与指针深入理解——题型理解 文章目录 11-数组与指针深入理解——题型理解一、理解题1二、理解题二三、理解题三四、理解题四五、理解题五六、理解题六 一、理解题1 #include <stdio.h>int main(void) {int (*p)[5] NULL; // 定义一个指向 拥有5个整型数据的数组…

Tessy学习系列(三):单元测试——官方例程isValueInRange

一、工程创建 &#xff08;1&#xff09;新建工程 注意&#xff1a;工程名称以及路劲不能包含空格和中文 &#xff08;2&#xff09;新建测试集与单元测试模块 新建测试集 新建单元测试模块 设置测试模块为单元测试模块并选择GNU GCC编译器如果需要其他的编译器&#xff0c;…

力扣每日一题 6/10

881.救生艇[中等] 题目&#xff1a; 给定数组 people 。people[i]表示第 i 个人的体重 &#xff0c;船的数量不限&#xff0c;每艘船可以承载的最大重量为 limit。 每艘船最多可同时载两人&#xff0c;但条件是这些人的重量之和最多为 limit。 返回 承载所有人所需的最小船…