c++多模块化划分算法MMM(单链接、全链接、均链接)

news2024/7/6 18:37:09

文章目录

  • 题目1c++代码
  • 一、实验目的
  • 二、实验描述
    • 3.1 题目1
      • 3.1.1 单链接
      • 3.1.2 全链接
      • 3.1.3 均值链接
      • 3.1.4 划分结果统计:
    • 3.2 题目2
      • 3.2.1 单链接
      • 3.2.2 全链接
      • 3.2.3 均值链接
      • 3.2.4 划分结果统计:
  • 题目2c++代码

github地址
代码地址

题目1c++代码

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<vector>
using namespace std;

const int task_num = 10;

vector<vector<int>> init(int data[][task_num]);                                                                 //初始化函数
vector<vector<int>> Link(vector<vector<int>>& data,int num,int direction, int link_type);                       //划分算法 
vector<vector<int>> combine(vector<vector<int>> &list, vector<int> &first, vector<int>&second, int j, int i);   //合并子类
int JudgeThreshold(vector<vector<int>>& data, vector<int>& first,vector<int>& second,int distance, int link_type);  //阈值判断
void res_print(int distance, vector<vector<int>> &list);                                                            //结果输出


int getMaxDistance(vector<vector<int>> data);                                                           //计算最大距离
int calculateDistance(vector<vector<int>> data, vector<vector<int>> list);                              //计算通信代价

#define single
#define Complete
#define Average

int main()
{

    int matrix[task_num][task_num] =
    {
    {0, 1, 0, 0, 0, 0, 4, 0, 2, 0},
    {1, 0, 3, 0, 0, 0, 0, 0, 0, 0},
    {0, 3, 0, 0, 0, 0, 0, 2, 0, 1},
    {0, 0, 0, 0, 0, 2, 0, 5, 6, 0},
    {0, 0, 0, 0, 0, 0, 0, 3, 7, 8},
    {0, 0, 0, 2, 0, 0, 1, 0, 0, 0},
    {4, 0, 0, 0, 0, 1, 0, 0, 0, 0},
    {0, 0, 2, 5, 3, 0, 0, 0, 0, 0},
    {2, 0, 0, 6, 7, 0, 0, 0, 0, 0},
    {0, 0, 1, 0, 8, 0, 0, 0, 0, 0}};//导入通信代价矩阵

   

    vector<vector<int>> data = init(matrix);

    vector<vector<int>> tempMatrix = data;
    #ifdef single
        vector<vector<int>> list1=Link(data,3,4, 1);//得到经过单连接划分后的list,其中簇中元素最多为3,最多有4个簇
      
    

        int totalDistance1=calculateDistance(tempMatrix,list1);//计算划分后各簇之间的总通信距离
        cout<<"通信距离:"<<totalDistance1<<endl;
    #endif
    cout<<endl;

    #ifdef Complete

        vector<vector<int>> list2=Link(data,3,4, 2);//得到经过全连接划分后的list,其中簇中元素最多为3,最多有4个簇
        int totalDistance2=calculateDistance(tempMatrix,list2);//计算划分后各簇之间的总通信距离
        cout<<"通信距离:"<<totalDistance2<<endl;
    #endif


    cout<<endl;

    #ifdef Average

        vector<vector<int>> list3=Link(data, 3, 4, 3);//得到经过均值连接划分后的list,其中簇中元素最多为3,最多有4个簇
       int totalDistance3=calculateDistance(tempMatrix,list3);//计算划分后各簇之间的总通信距离
        cout<<"通信距离:"<<totalDistance3<<endl;
    #endif



	return 0;
}



vector<vector<int>> init(int data[][task_num])
{
    vector<vector<int>> res;
    for(int i = 0; i < task_num; i++)
    {
        vector<int> temp;
        for(int j = 0; j < task_num; j++)
        {
            temp.push_back(data[i][j]);
        }
        res.push_back(temp);
    }
    

    return res;
}


// 划分结果输出
void res_print(int distance, vector<vector<int>>& list)
{
    cout<<distance<<"    "<< list.size()<<"    ";
    for (int i=0; i< list.size(); i++) 
    {
        vector<int> temp = list[i];
        int length = temp.size();
        if(length > 1)
            cout<<"{";
        for (int j=0;j < temp.size();j++) 
        {   
            cout<<temp[j]+1 ;//将划分后的簇输出
            if(j != temp.size() - 1)
                cout<<",";
            
        }
        if(length > 1)
            cout<<"}";
        if( i != list.size() - 1)
            cout<<",";
     
    }
 

    cout<<endl;
    

}


int getMaxDistance(vector<vector<int>> data)//计算最大距离
{
    int max=-1;
    int length=task_num;
    for (int i = 0; i < length; i++) 
    {
        for (int j = i; j < length; j++) 
        {
            if (data[i][j] >= max) 
            {
                max = data[i][j];
            }
        }
    }
    return max;
}

int calculateDistance(vector<vector<int>> data, vector<vector<int>> list)
{
    int totalDistance=0;
    //先找到两个相邻的簇,然后匹配簇中的元素
    for (int i = 0; i < list.size()-1; i++) 
    {
        vector<int> last= list[i];//得到相邻的簇
        
        for (int j=i+1;j<list.size();j++)
        {int sum = 0;
            vector<int> next=list[j];//得到相邻的簇
            for (int m=0;m<last.size();m++)//进行元素的两两匹配
            {
                
                for (int n=0;n<next.size();n++)
                {   
                    
                    if( data[last[m]][next[n]])
                    {//若两元素间有链路相链接
                        sum += data[last[m]][next[n]];
                        totalDistance+=data[last[m]][next[n]];
                    }
                    
                }
            }
        cout<< "模块"<< i + 1 <<"与模块"<< j + 1<<"通信代价:"<<sum<<endl;
        }
       
    }
    return totalDistance;
}



vector<vector<int>> Link(vector<vector<int>>& data,int num,int direction, int link_type)
{


    bool border[task_num][task_num]  = {false};//确定该边是否已划分
    bool used[task_num]  = {false} ;//确定该元素是否已放入簇中
    int length=data.size();//矩阵大小
    int number=0;//记录簇的个数
    int count=0;//计算已经放到簇中的数据个数
    vector<vector<int>> list;
    
   // data=getDistance(data);//将通信代价矩阵转换为通信距离矩阵
    int maxLength=getMaxDistance(data);//计算通信距离的最大值

    //初始化最初十个
    for(int i = 0; i < 10; i++)
    {
        vector<int> temp ;
        temp.push_back(i);
        list.push_back(temp);
    }
    int distance = maxLength + 1;
    int m = list.size();
    int MMMSAA = 0;
    while(1)
    {
        while(distance != 0 && m > 4)
        {
            int flag = 0;//是否进行下一轮
            for(int i = 0; i < list.size(); i++)
            {
                vector<int> first = list[i];
                for(int j = i + 1; j < list.size(); j++)
                {
                    vector<int> second = list[j];
                    if(JudgeThreshold(data, first, second,distance, link_type))      //如果均值大于阈值
                    {
                        if(first.size() + second.size() <= num)
                        {
                            list = combine(list, first, second, j, i);
                            flag = 1;
                        }
                    }
                    if(flag)
                        break;
                }
                if(flag)
                    break;
                
            }
           // res_print(distance, list);

            if(flag )
                m--;
            else
            {   
                if(!MMMSAA)
                    res_print(distance, list);
                    //cout<<endl<<distance<<endl;
                distance--;
            } 
            
        // 如果没有划分成四个模块,则执行MMMSAA
        }
        if(m <= 4)
        {
            if(MMMSAA)
            {   cout<<"MMMSAA链接划分结果为:  "<<endl;
                res_print(distance , list);
            }
            else
            {
                res_print(distance , list);

                if(link_type == 1)
                {   cout<<"单链接划分后得到"<<endl;
                }
                else if(link_type == 2)
                {   cout<<"全链接划分后得到"<<endl;
                }
                else if(link_type == 3)
                {   cout<<"均值链接划分后得到"<<endl;
                }
                res_print(distance , list);

            }
           break;

        }
        else
        {   
            MMMSAA = 1;
            link_type = 1;  
            distance = maxLength + 1;
        }
    }
    return list;
}





int JudgeThreshold(vector<vector<int>> &data, vector<int> &first,vector<int> &second,int distance, int link_type)
{
    int i,j;
    
    int first_num = first.size();
    int second_num = second.size();

    //单值
    if(link_type == 1)
    {
        int flag = 0;
        for(i = 0; i< first_num; i++)
        {
            for(j = 0; j < second_num; j++)
            {
                if( data[first[i]][second[j]] >= distance)
                {    
                    flag = 1;
                    break;
                }
                if(flag)
                    break;
            }
        }
        return flag;
    }
    // 全连接
    else if(link_type == 2)
    {   
        int flag = 1;
        for(i = 0; i< first_num; i++)
        {
            for(j = 0; j < second_num; j++)
            {
                if( data[first[i]][second[j]] < distance)
                {    
                    flag = 0;
                    break;
                }
                if(!flag)
                    break;
            }
        }
        return flag;
    }
    // 均值
    else if(link_type == 3)
    {    
        int sum = 0;
        double ave = 0;
        for(i = 0; i< first_num; i++)
        {
            for(j = 0; j < second_num; j++)
            {
                sum += data[first[i]][second[j]];
            }
        }
        ave = sum / (first_num * second_num);
        if(ave >= distance)
            return 1;
        else
            return 0;
    }
}

// 组合子类 
vector<vector<int>> combine(vector<vector<int>> &list, vector<int> &first, vector<int>&second, int second_index, int first_index)
{
    vector<vector<int>> res;
    vector<int> temp;
    int i = 0;
    for(i = 0; i< first.size(); i++)
    {
        temp.push_back(first[i]);
    }
    for(i = 0; i< second.size(); i++)
    {   
        temp.push_back(second[i]);
    }
    sort(temp.begin(),temp.begin()+temp.size());

    res.push_back(temp);
    list.erase (list.begin() + second_index);
    list.erase (list.begin() + first_index);
    for(i = 0; i < list.size(); i++)
    {
        res.push_back(list[i]);
    }
  //  sort(res.begin(),res.begin()+res.size());

    return res;

}

一、实验目的

编程实现多模块化划分算法MMM(单链接、全链接、均链接)。

单链接
在这里插入图片描述
在这里插入图片描述

全链接

在这里插入图片描述

均值链接
在这里插入图片描述在这里插入图片描述

二、实验描述

输入是通信代价、模块数、每个模块最大任务数,输出为划分好的模块,并给出划分代价。
三、 测试结果

3.1 题目1

使用实现的程序将图1.1 的10个任务划分成4个模块,每个块内任务个数不超过3。
设一智能嵌入式系统,由任务 T1,T2,…,T10 组成,任务间的通信代
价见图 1-1。
在这里插入图片描述

图1-1 任务通信代价图

3.1.1 单链接

在这里插入图片描述
在这里插入图片描述

3.1.2 全链接

在这里插入图片描述
在这里插入图片描述

3.1.3 均值链接

在这里插入图片描述
在这里插入图片描述

3.1.4 划分结果统计:

在这里插入图片描述
在这里插入图片描述

从划分结果统计来看使用不同链接算法,划分结果是有差异的。单链接的划分代价最小为16,其他俩个划分结果相同,但中间步骤不同。

3.2 题目2

图1-2中的8个任务a,b,c,d,f,g,h分成2个模块,每个模块含有4个任务,使得模块间通信代价最小
在这里插入图片描述

图1-2 电路示意图
在这里插入图片描述

图1-2 任务通信矩阵

3.2.1 单链接

在这里插入图片描述
在这里插入图片描述

3.2.2 全链接

在这里插入图片描述
在这里插入图片描述

3.2.3 均值链接

在这里插入图片描述
在这里插入图片描述

3.2.4 划分结果统计:

在这里插入图片描述

从划分结果统计来看使用不同链接算法,划分结果是有差异的。但此处划分的通信代价相同,都为3。

题目2c++代码

#include
#include
#include
#include
#include
using namespace std;

const int task_num = 8;

vector<vector> init(double data[][task_num]); //初始化函数
vector<vector> Link(vector<vector>& data,int num,int direction, int link_type); //划分算法
vector<vector> combine(vector<vector> &list, vector &first, vector&second, int j, int i); //合并子类
int JudgeThreshold(vector<vector>& data, vector& first,vector& second,double distance, int link_type); //阈值判断
void res_print(int distance, vector<vector> &list); //结果输出

double getMaxDistance(vector<vector> data); //计算最大距离
double calculateDistance(vector<vector> data, vector<vector> list); //计算通信代价

#define single
#define Complete
#define Average

int main()
{

double matrix[task_num][task_num] =
{
{0,     0,      0.5,    0,      0.5,    0,      0,      0},
{0,     0,      0.5,    0.5,    0,      0,      0,      0},
{0.5,   0.5,    0,      0.5,    1,      0.5,    0,      0},
{0,     0.5,    0.5,    0,      0,      1,      0,      0},
{0.5,   0,      1,      0,      0,      0.5,    1,      0},
{0,     0,      0.5,    1,      0.5,    0,      0.5,    0.5},
{0,     0,      0,      0,      1,      0.5,    0,      0.5},
{0,     0,      0,      0,      0,      0.5,    0.5,    0},
};//导入通信代价矩阵



vector<vector<double>> data = init(matrix);

vector<vector<double>> tempMatrix = data;
for(int i = 0; i< tempMatrix.size(); i++)
{
    for(int j = 0; j< tempMatrix.size(); j++)
{
    cout<<tempMatrix[i][j]<<"\t";
}
cout<<endl;
}
#ifdef single
    cout<<"单值"<<endl;
    vector<vector<int>> list1=Link(data,4,2, 1);//得到经过单连接划分后的list,其中簇中元素最多为4,最多有2个簇
  


    int totalDistance1=calculateDistance(tempMatrix,list1);//计算划分后各簇之间的总通信距离
    cout<<"通信距离:"<<totalDistance1<<endl;
#endif
cout<<endl;

#ifdef Complete
    cout<<"全值"<<endl;

    vector<vector<int>> list2=Link(data,4 ,2, 2);//得到经过全连接划分后的list,其中簇中元素最多为3,最多有4个簇
    int totalDistance2=calculateDistance(tempMatrix,list2);//计算划分后各簇之间的总通信距离
    cout<<"通信距离:"<<totalDistance2<<endl;
#endif


cout<<endl;

#ifdef Average
    cout<<"均值"<<endl;

    vector<vector<int>> list3=Link(data, 4, 2, 3);//得到经过均值连接划分后的list,其中簇中元素最多为3,最多有4个簇
   int totalDistance3=calculateDistance(tempMatrix,list3);//计算划分后各簇之间的总通信距离
    cout<<"通信距离:"<<totalDistance3<<endl;
#endif



return 0;

}

vector<vector> init(double data[][task_num])
{
vector<vector> res;
for(int i = 0; i < task_num; i++)
{
vector temp;
for(int j = 0; j < task_num; j++)
{
temp.push_back(data[i][j]);
}
res.push_back(temp);
}

return res;

}

// 划分结果输出
void res_print(double distance, vector<vector>& list)
{
cout<<distance<<" “<< list.size()<<” “;
for (int i=0; i< list.size(); i++)
{
vector temp = list[i];
int length = temp.size();
if(length > 1)
cout<<”{“;
for (int j=0;j < temp.size();j++)
{
cout<<temp[j]+1 ;//将划分后的簇输出
if(j != temp.size() - 1)
cout<<”,";

    }
    if(length > 1)
        cout<<"}";
    if( i != list.size() - 1)
        cout<<",";
 
}


cout<<endl;

}

double getMaxDistance(vector<vector> data)//计算最大距离
{
double max=-1;
int length=task_num;
for (int i = 0; i < length; i++)
{
for (int j = i; j < length; j++)
{
if (data[i][j] >= max)
{
max = data[i][j];
}
}
}
return max;
}

double calculateDistance(vector<vector> data, vector<vector> list)
{
double totalDistance=0;
//先找到两个相邻的簇,然后匹配簇中的元素
for (int i = 0; i < list.size()-1; i++)
{
vector last= list[i];//得到相邻的簇

    for (int j=i+1;j<list.size();j++)
    {   
        double sum = 0;
        vector<int> next=list[j];//得到相邻的簇
        for (int m=0;m<last.size();m++)//进行元素的两两匹配
        {
            
            for (int n=0;n<next.size();n++)
            {   
                
                if( data[last[m]][next[n]])
                {//若两元素间有链路相链接
                    sum += data[last[m]][next[n]];
                    totalDistance+=data[last[m]][next[n]];
                }
                
            }
        }
    cout<< "模块"<< i + 1 <<"与模块"<< j + 1<<"通信代价:"<<sum<<endl;
    }
   
}
return totalDistance;

}

vector<vector> Link(vector<vector>& data,int num,int direction, int link_type)
{

bool border[task_num][task_num]  = {false};//确定该边是否已划分
bool used[task_num]  = {false} ;//确定该元素是否已放入簇中
int length=data.size();//矩阵大小
int number=0;//记录簇的个数
int count=0;//计算已经放到簇中的数据个数
vector<vector<int>> list;

// data=getDistance(data);//将通信代价矩阵转换为通信距离矩阵
double maxLength=getMaxDistance(data);//计算通信距离的最大值
//cout<<"maxLength "<<maxLength<<endl;
//初始化最初十个
for(int i = 0; i < task_num; i++)
{
vector temp ;
temp.push_back(i);
list.push_back(temp);
}
double distance = maxLength + 0.5;
int m = list.size();
int MMMSAA = 0;
while(1)
{
while(distance > 0 && m > direction)
{
int flag = 0;//是否进行下一轮
for(int i = 0; i < list.size(); i++)
{
vector first = list[i];
for(int j = i + 1; j < list.size(); j++)
{
vector second = list[j];
if(JudgeThreshold(data, first, second,distance, link_type)) //如果均值大于阈值
{
if(first.size() + second.size() <= num)
{
list = combine(list, first, second, j, i);
flag = 1;
}
}
if(flag)
break;
}
if(flag)
break;

        }
       // res_print(distance, list);

        if(flag )
            m--;
        else
        {   
            if(!MMMSAA)
                res_print(distance, list);
                //cout<<endl<<distance<<endl;
            distance-= 0.5;
        } 
        
    // 如果没有划分成四个模块,则执行MMMSAA
    }
    if(m <= direction)
    {   
        if(MMMSAA)
        {   cout<<"MMMSAA链接划分结果为:  "<<endl;
            res_print(distance , list);
        }
        else
        {
            res_print(distance , list);

            if(link_type == 1)
            {   cout<<"单链接划分后得到"<<endl;
            }
            else if(link_type == 2)
            {   cout<<"全链接划分后得到"<<endl;
            }
            else if(link_type == 3)
            {   cout<<"均值链接划分后得到"<<endl;
            }
            res_print(distance , list);

        }
       break;

    }
    else
    {   
        MMMSAA = 1;
        link_type = 1;  
        distance = maxLength + 0.5;
    }
}
return list;

}

int JudgeThreshold(vector<vector> &data, vector &first,vector &second,double distance, int link_type)
{
int i,j;

int first_num = first.size();
int second_num = second.size();

//单值
if(link_type == 1)
{
    int flag = 0;
    for(i = 0; i< first_num; i++)
    {
        for(j = 0; j < second_num; j++)
        {
            if( data[first[i]][second[j]] >= distance)
            {    
                flag = 1;
                break;
            }
            if(flag)
                break;
        }
    }
    return flag;
}
// 全连接
else if(link_type == 2)
{   
    int flag = 1;
    for(i = 0; i< first_num; i++)
    {
        for(j = 0; j < second_num; j++)
        {
            if( data[first[i]][second[j]] < distance)
            {    
                flag = 0;
                break;
            }
            if(!flag)
                break;
        }
    }
    return flag;
}
// 均值
else if(link_type == 3)
{    
    double sum = 0.0;
    double ave = 0.0;
    for(i = 0; i< first_num; i++)
    {
        for(j = 0; j < second_num; j++)
        {
            sum += data[first[i]][second[j]];
        }
    }
    ave = sum / (first_num * second_num);
    if(ave >= distance)
        return 1;
    else
        return 0;
}

}

// 组合子类
vector<vector> combine(vector<vector> &list, vector &first, vector&second, int second_index, int first_index)
{
vector<vector> res;
vector temp;
int i = 0;
for(i = 0; i< first.size(); i++)
{
temp.push_back(first[i]);
}
for(i = 0; i< second.size(); i++)
{
temp.push_back(second[i]);
}
sort(temp.begin(),temp.begin()+temp.size());
res.push_back(temp);
list.erase (list.begin() + second_index);
list.erase (list.begin() + first_index);

for(i = 0; i < list.size(); i++)
{
    res.push_back(list[i]);
}
sort(res.begin(),res.begin()+res.size());
return res;

}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关于Servlet编程(2)

1.常用类的关键API介绍 Servlet中常见的类有三个.介绍过了HttpServlet类.我们再来看看另外两个. HttpServletRequest 这个类对应到发送的HTTP请求. 方法描述String getProtocol()返回请求协议的名称和版本String getMethod()返回请求的 HTTP 方法的名称 (GET,POST 或 PUT)S…

java计算机毕业设计ssm医院病人信息管理系统60k18(附源码、数据库)

java计算机毕业设计ssm医院病人信息管理系统60k18&#xff08;附源码、数据库&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#…

summernote富文本编辑器和jquery.validate冲突报错的解决方案

先看问题: 当我在富文本输入并移出鼠标焦点的时候, 控制台抛出错误Cannot read properties of undefined (reading replace), 而导致jquery.validate无法对其他表单组件进行校验 1.定位问题: jquery.validate的初始化是监听了表单$("#addOrEditForm").validate(),…

Nacos的服务注册之服务端

上节讲到了nacos的客户端,通过把实例信息封装成instance,调用服务端的接口:/instance,进行注册. 接下来,我们一起看看服务端是怎么处理客户端发来的请求的. 服务端 在nacos-naming这个模块中,在这个模块里边有一个InstanceController 其中在com.alibaba.nacos.naming.contro…

Netty_03_ByteBuf和网络中拆包粘包问题及其解决

文章目录一、前言二、ByteBuf&#xff08;Netty API中定义的数据类型&#xff09;2.1 ByteBuf2.1.1 ByteBuf创建的方法有两种2.1.2 ByteBuf的存储结构2.1.3 ByteBuf中常用的方法APIReader相关方法Write相关方法Write可能导致扩容2.2 ByteBuf代码(演示读写指针移动和扩容)2.2.1 …

RabbitMQ:基础概述

RabbitMQ 是一个消息中间件&#xff0c;它接收消息并且转发&#xff0c;是“消费-生产者模型”的一个典型的代表&#xff0c;一端往消息队列中不断的写入消息&#xff0c;而另一端则可以读取或者订阅队列中的消息。 RabbitMQ 于 2007 年发布&#xff0c;由 erlang 语言进行开源…

37_软件I2C通信实验

目录 I2C通信协议 多主机I2C总线系统结构 I2C协议 应答信号ACK 数据有效性 数据传输 I2C设备地址 I2C通讯整个过程 硬件连接 EEPROM(24C02) 24C02字节写时序 24C02字节读时序 实验源码 I2C通信协议 I2C(IIC,Inter-Integrated Circuit),两线式串行总线,由PHILIPS公…

ATtiny13与Proteus仿真-ADC仿真

ADC仿真 1、ADC介绍 ATtiny13的ADC有如下特点: 10位分辨率0.5 LSB 积分非线性 2 LSB 绝对精度13 - 260 μs 转换时间在最高分辨率下高达 15 kSPS四个多路复用单端输入通道ADC 结果读数的可选左调整0 - VCC ADC 输入电压范围可选择的 1.1V ADC 参考电压自由运行或单一转换模式…

[附源码]计算机毕业设计家庭医生签约服务管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

dmb ish osh

转自&#xff1a;原理和实战解析Linux中如何正确地使用内存屏障 圈里流传着一句话“珍爱生命&#xff0c;远离屏障”&#xff0c;这足以说明内存屏障是一个相当晦涩和难以准确把握的东西。使用过弱的屏障&#xff0c;会导致软件不稳定。使用过强的屏障&#xff0c;会引起性能问…

c语言篇(动态内存管理)

前言&#xff1a; 对于数据的存储我们可以静态存储&#xff0c;也可以动态存储&#xff0c;两种方式都有自己特有的好处&#xff0c;这篇文章教我们如和进行动态的数据存储&#xff01;&#xff01;&#xff01;&#xff01; &#x1f49e; &#x1f49e; 欢迎来到小马学习代码…

自动驾驶之单目3D目标检测TensorRT调研

目前在github上只能找到2个项目 TensorRT-CenterNet-3D tkDNN 两者都是使用CenterNet&#xff0c;但第1个基于TensorRT5,无法与当前最新的TensorRT6和TensorRT7兼容。经测试&#xff0c;第1个无法在XavierJetpack 4.3/4.4上部署&#xff0c;因此选择部署第二个tkDNN。 1. 基本…

Python学习基础笔记三十八——time模块

1、time模块&#xff1a;和时间有关系的&#xff0c;我们就用到了时间模块&#xff1a; import timeprint(time.time()) #获得当前时间戳 2、表示时间的三种方式&#xff1a; 在Python中&#xff0c;通常用三种方式来表示时间&#xff1a;时间戳、元组(struct_time)、格式…

LeetCode刷题复盘笔记—一文搞懂动态规划之337. 打家劫舍 III问题(动态规划系列第十九篇)

今日主要总结一下动态规划完全背包的一道题目&#xff0c;337. 打家劫舍 III 题目&#xff1a;337. 打家劫舍 III Leetcode题目地址 题目描述&#xff1a; 小偷又发现了一个新的可行窃的地区。这个地区只有一个入口&#xff0c;我们称之为 root 。 除了 root 之外&#xff0…

UDS入门至精通系列:Service 19(二)

文章目录 前言一、协议的定义(19 04/06)二、数据库编辑(CANdelaStudio)三、CAPL应用(Service 19 04 / 06)总结前言 本文主要讲述了ECU诊断中用到的DTC Status以及Service 19 02作用和用法。 本文主要讲述了ECU诊断中用到的DTC Status以及Service 19 02作用和用法。 本文…

Transformer15

今天还是Transformer~~ 都连载这么多了 , 据说是全球首个面向遥感任务设计的亿级视觉大模型 大规模视觉基础模型在基于自然图像的视觉任务中取得了重大进展。得益于良好的可扩展性和表征能力&#xff0c;基于视觉Transformer (Vision Transformer, ViT) 的大规模视觉基础模型吸…

Instruction Tuning(FLAN、instructGPT、chatGPT)

首页最近被chatGPT刷屏&#xff0c;但翔二博主左看右看发现很多想法似乎都是一脉相通的&#xff0c;于是连夜从存档中找了一些文章尝试理一理它的理论路线。 具身智能综述和应用&#xff08;Embodied AI&#xff09;多模态中的指令控制 同时想到今年在智源人工智能前沿报告&a…

线程,线程池的使用

文章目录线程&#xff0c;线程池的使用1. 多线程基础1.1 线程和进程1.2 多线程的创建1.2.1 继承Thread类1.2.2 实现Runnable接口1.2.3 匿名内部类方式1.2.4 守护线程1.3 线程安全1.3.1 卖票案例1.3.2 线程同步2. 线程池的实现方式2.1 Java提供的四种线程池2.2 线程池的创建原理…

微信小程序开发【从0到1~入门篇】

目录 1. 微信小程序介绍 1.1 什么是小程序&#xff1f; 1.2 小程序可以干什么&#xff1f; 2. 申请账号 2.1 申请帐号 2.2 测试号申请&#xff08;我们小程序账号申请完成之后&#xff0c;建议务必要申请一个测试号用来开发&#xff09; 3. 安装开发工具 3.1 选择稳定…

我的创作纪念日(2021-12-10 2022-12-10)

&#x1f306; 内容速览阴差阳错成为一名博主&#xff1f;这一年来的收获日常生活未来憧憬阴差阳错成为一名博主&#xff1f; 如上图所见&#xff0c;她就是我在CSDN上发布的第一篇博客——无标题&#xff0c;有时候机缘来的那么突然&#xff0c;我甚至都没有给她想一个凑合的名…