3、初识程序

2023-10-30

数据结构静态的描述了数据元素之间的关系。

高效的程序需要在数据结构的基础上设计和选择算法。

高效的程序:恰当的数据结构+合适的算法

算法是特定问题求解步骤的描述:在计算机中表现为指令的有限序列。算法是独立存在的一种解决问题的方法和思想。特性:

输入:算法具有0个或多个输入。

输出:算法至少有1个或多个输出。

有穷性:算法在有限的步骤之后会自动结束而不会无限循环。

确定性:算法中的每一步都有确定的含义,不会出现二义性。

可行性:算法的每一步都是可行的。

正确性:算法对于合法数据能够得到满足要求的结果。算法能够处理非法输入,并得到合理的结果。算法对于边界数据和压力数据都能得到满足要求的结果。

可读性:算法要方便阅读,理解和交流。

健壮性:算法不应该产生莫名其妙的结果。

性价比:利用最少的资源得到满足要求的结果。

算法复杂度:

时间复杂度:算法运行后对时间需求量的定性描述。

空间复杂度:算法运行后对空间需求量的定性描述。

大O(operation)表示法:关注操作数量的最高次项。

6、算法效率

O(1)<O(logn)<O(n)<O(n*logn)<O(n*n)//<O(n*3)<O(2*n)<O(n!)<O(n*n)

算法的空间复杂度:S(n)=S(f(n)),n为算法的问题规模,f(n)为空间使用函数,与n有关 。

问题:在一个自然是1-1000中找出出现次数最多的数字

/*
    问题: 
    在一个由自然数1-1000中某些数字所组成的数组中,每个数字可能出现零次或者多次。
    设计一个算法,找出出现次数最多的数字。
*/
#include <iostream>
using namespace std;
void search(int a[], int len)     // O(n)
{
    int sp[1000] = {0};
    int max = 0;    
    for(int i=0; i<len; i++)
    {
        sp[a[i] - 1]++;   //作为sp数组的下标
    }    
    for(int i=0; i<1000; i++)
    {
        if( max < sp[i] )
        {
            max = sp[i];
        }
    }    
    for(int i=0; i<1000; i++)
    {
        if( max == sp[i] )
        {
            cout << i + 1 << endl;
        }
    }
}
int main(int argc, char* argv[])
{
    int a[] = {1, 1, 3, 4, 5, 6, 6, 6, 3, 3};    
    search(a, sizeof(a)/sizeof(*a));
    return 0;
}

 题目:当两个算法的大O表示法相同时,是否意味着两个算法的效率完全相同?

7、数据结构该怎么学习?

1,先从概念上形象的理解数据元素之间的关系。

2、思考这种关系能够解决什么问题。

3、考虑基于这种关系能够产生哪些算法。

4、理解和熟悉最终的算法。

5、选择一种熟悉的语言,编码实战。

8、泛型编程:

c++中的类模板:以相同的方式处理不同的类型。在类声明之前用template进行标识,<typename T>用于说明类中使用的泛型类型T。类模板的应用:只能显示指定具体类型,无法自动推导。使用具体类型<Type>定义对象。

#include <iostream>

using namespace std;

template <typename T>
void Swap(T& a, T& b)
{
    T t = a;
    a = b;
    b = t;

}

template <typename T>
class Op
{
public:
    T process(T v)
    {
        return v * v;
    }

};

int main()
{
    int a = 2;
    int b = 1;
    Swap(a, b);
    cout << "a = " << a << " " << "b = " << b << endl;
    double c = 0.01;
    double d = 0.02;
    Swap<double>(d, c);
    cout << "c = " << c << " " << "d = " << d << endl;
    Op<int> opInt;
    Op<double> opDouble;
    cout << "5 * 5 = " << opInt.process(5) << endl;
    cout << "0.3 * 0.3 = " << opDouble.process(0.3) << endl;
    return 0;

}

函数模板支持参数的自动推导和显示指定,类模板在使用时只能显示指定类型,类模板非常适用于编写数据结构相关的代码。

9、智能指针

指针生命周期结束时主动释放堆空间,一片堆空间最多只能由一个指针标识(拷贝构造函数,重载赋值操作符),杜绝指针运算和指针比较。

设计方案:通过类模板描述指针的行为,能够定义不同类型的指针对象。

重载指针特征操作符(->和*),利用对象模拟原生指针的行为。

创建DTLib  . 智能指针

#ifndef SMARTPOINTER_H_ 
#define SMARTPOINTER_H_
namespace WSlib
{
template <typename T>
class SmartPointer
{
T* m_pointer;
public:
SmartPointer(T* p=NULL)
{
m_pointer=p;
}
SmartPointer(const SmartPointer<T>& obj)
{
m_pointer=obj.m_pointer;
const_cast<SmartPointer<T>&>(obj).m_pointer=NULL; //const对象必须去除const属性
}
SmartPointer<T>& operator=(const SmartPointer<T>& obj)
{
if(this != &obj)
{
delete m_pointer;
m_pointer=obj.m_pointer;  //this->m_pointer=obj.m_pointer;
     //两者都是二元操作符,而且右边的操作数都是成员的名称。
             // 不同点:点运算符( . )的左边操作数是一个结果为结构的表达式;
             // 箭头运算符( -> )的左边的操作数是一个指向结构体的指针
const_cast<SmartPointer<T>&>(obj).m_pointer=NULL;  //const对象不允许赋值  必须去掉
}
return *this; //可以支持连续赋值
}
T* operator ->()
{
return m_pointer;
}
T* operator* ()
{
return *m_pointer;
}
bool isNull()
{
return (m_pointer==NULL);
}
T* get()
{
return *m_pointer;
}
~SmartPointer()
{
delete m_pointer;
}
};
}

#endif

#include<iostream>
#include "SmartPointer.h"
using namespace std;
using namespace WSlib;  //必须使用自己命名空间
class Test
{
public:
Test()
{
cout<<"Test()"<<endl;
}
~Test()
{
cout<<"~Test()"<<endl;
}
};
int main()
{
SmartPointer <Test> sp=new Test(); //sp指向堆空间的地址,在析构函数中释放
    SmartPointer <Test>nsp;
nsp=sp;
//nsp++;  错的
cout<<sp.isNull()<<endl;
cout<<nsp.isNull()<<endl;
return 0;

}

智能指针的使用军规:智能用来指向堆空间的单个对象或者单个变量(不能是数组或者局部对象或者局部变量)

指针特征操作符(->和*可以被重载),重载指针特征符能够使用对象代替指针,智能指针智能用于指向堆空间中的内存,智能指针最大程度的避免内存问题。

11、异常的类型可以是自定义类类型,对于类类型异常的匹配依旧是至上而下严格匹配,赋值兼容性原则在异常匹配中依然适用。匹配子类异常的catch放在上部,匹配父类异常的catch放在下部。

异常功能定义:

Arithmenticption 计算异常

NullpointerException 空指针异常

indexOutOfBoundsException 越界异常

NoEnoughMemoryException内存不足异常

InvalidParameterException 参数错误异常

#ifndef EXCEPTION_H_
#define EXCEPTION_H_
namespace WSlib
{
   #define THROW_EXCEPTION(e, m) (throw e(m,__FILE__,__LINE__))
class Exception
{
protected:
char* m_message;  //指向字符串,异常详细信息
char* m_location; //异常地点
void init(const char* message,const char* file,int line);//重载了构造函数,构造函数内部逻辑差不多,利用辅助函数完成初始化


public:
Exception(const char* message);
Exception(const char* file,int line);
Exception(const char* message,const char* file,int line);


Exception(const Exception& e);
Exception& operator=(const Exception& e);
    
virtual const char* message()const;
virtual const char* location()const;


virtual ~Exception()=0;  //纯虚析构函数,用来说明当前类时抽象类
};
class ArithmeticException:public Exception
{
public:
ArithmeticException():Exception(0){}
ArithmeticException(const char* message):Exception(message){}
ArithmeticException(const char* file,int line):Exception(file,line){}
ArithmeticException(const char* message,const char* file,int line):Exception(message,file,line){}


ArithmeticException(const ArithmeticException& e):Exception(e){}
ArithmeticException& operator=(const ArithmeticException& e)
{
Exception::operator=(e); //直接调用父类的赋值操作符重载函数
return *this;
}


};
}

#endif

#include "Exception.h"
#include<cstring>
#include<cstdlib>  //malloc
using namespace std;
namespace WSlib
{
void Exception::init(const char* message,const char* file,int line)
{
//m_message=message;直接赋值不行,参数message指针指向字符串可能在栈,堆空间,全局数据区,没有办法控制message所指向的外部字符串的生命周期
m_message=strdup(message); //strdup将字符串复制到堆空间,m_message就指向堆空间的字符串,他的内容与message指向的字符串一样
if(file!=NULL)
{
char sl[16]={0};
itoa(line,sl,10);
m_location=static_cast<char*>(malloc(strlen(file)+strlen(sl)+2)); //malloc返回void* ,所以转换到插入*,+2一个是:一个是字符串结束符\0
m_location=strcpy(m_location,file);
m_location=strcat(m_location,":");
m_location=strcat(m_location,sl);
}
else
{
m_location=NULL;
}


}
Exception::Exception(const char* message)
{
    init(message,NULL,0);
}
Exception::Exception(const char* file,int line)
{
    init(NULL,file,line);
}
Exception::Exception(const char* message,const char* file,int line)
{
init( message,file, line);
}


Exception::Exception(const Exception& e)  //深拷贝,要保证每个对象内部的成员指针所指向的都是独立的堆空间
{
m_message=strdup(e.m_message);
m_location=strdup(e.m_location);

    Exception& Exception::operator=(const Exception& e)
{
if(this!=&e)
{
free(m_message);
free(m_location);
    m_message=strdup(e.m_message);
    m_location=strdup(e.m_location);
}
return *this;


}
const char* Exception::message() const
{
return m_message;
}
    const char* Exception::location() const
{
return m_location;
}
Exception::~Exception() //纯虚函数不提供实现,实现由子类完成,析构函数例外:c++规定,但凡自定义了析构函数,不管是不是纯虚函数,都要提供实现,因为析构对象时,最后都要调用父类析构函数,如果父类析构函数是纯虚函数并且没有实现,当调用到顶层析构函数时,没有实现不可以
{
free(m_message);
free(m_location);
}

}

#include <iostream>
#include "Exception.h"
using namespace std;
using namespace WSlib;
int main()
{
try
{
THROW_EXCEPTION(ArithmeticException, "test");
//throw Exception("test",__FILE__,__LINE__);  //文件名和行号使用预定义的宏 __FILE__,__LINE__
}
catch(const Exception&e)
{
cout<<"catch(const Exception& e)"<<endl;  //能捕获到子类对象,子类对象可以出现在任何需要父类对象的地方,赋值兼容性原则,所以能捕获到ArithmeticException,一个子类对象就是一个父类对象
cout<<e.message()<<endl;
cout<<e.location()<<endl;
}
catch(const ArithmeticException& e)          //异常匹配自上往下,捕获类型有继承关系,子类放上面,父类放下面,这个应该放上面
{
cout<<"catch(const Exception& e)"<<endl;  
cout<<e.message()<<endl;
cout<<e.location()<<endl;
}
return 0;

  //设计原则:在可复用代码库设计时,尽量使用面向对象技术进行架构,尽量使用异常处理机制分离正常逻辑和异常逻辑

//现代c++库必然包含充要的异常类族,所有库中的数据结构类都依赖于异常机制,异常机制能够分离库中代码的正常逻辑和异常逻辑

12、顶层父类

当代软件架构实践中的经验:尽量使用单重继承的方式进行系统设计,尽量保持系统中只存在单一的继承树,尽量使用组合关系代替继承关系。

不幸的事实:c++语言的灵活性使得代码中可以存在多个继承树,c++编译器的差异使得同样的代码可能表现不同的行为。

比如new操作失败会发生什么?  

创建Wobject类的意义:遵循经典设计准则,所有数据结构都继承自Wobject,定义动态内存申请的行为,提高代码的移植性。

#ifndef Wobject_H_
#define Wobject_H_
namespace WSlib
{
class Wobject
  {
public:
void* operator new(unsigned int size)throw();
void operator delete(void* p);
void* operator new[](unsigned int size)throw();
void operator delete[](void* p);
virtual ~Wobject()=0;
  };
}
#endif
//定义我们自己的new/delete重载函数,new/delete数据结构库中类的对象时,有我们期望的行为,在各个编译器都是一样的

//析构函数为纯虚函数,为抽象类,保证所有子类有虚函数表指针,能够使用动态类型识别相关的技术

#include<iostream>
#include "Wobject.h"
#include <cstdlib>
using namespace std;


namespace WSlib
{
void* Wobject::operator new(unsigned int size)throw()  //throw()不会抛出异常,失败返回空值
{
cout<<"Wobject::operator new"<<size<<endl;
return malloc(size);
}


void Wobject::operator delete(void* p)
{
cout<<"Wobject::operator delete"<<p<<endl;
free(p);
}
void* Wobject::operator new[](unsigned int size)throw()  //throw()不会抛出异常,失败返回空值
{
return malloc(size);
}
void Wobject::operator delete[](void* p)
{
free(p);
}
 Wobject::~Wobject()
{
 
}
}
/* 测试用例
#include <iostream>
#include "Wobject.h"
using namespace std;
using namespace WSlib;
class Test:public Wobject
{
public:
int i;
int j;
};
class Child:public Test
{
public:
int k;
};
int main()
{
Wobject* obj1=new Test();
Wobject* obj2=new Child();
cout<<"obj1"<<obj1<<endl;
cout<<"obj2"<<obj2<<endl;
//......
delete obj1;
delete obj2;
return 0;
}
****************************结果*******************************************
/*Wobject::operator new12 两个整形,一个虚函数表指针
Wobject::operator new16   又定义了一个整形k
obj100FFE238
obj200FFA1D8
Wobject::operator delete00FFE238
Wobject::operator delete00FFA1D8 释放对象空间的是我们自己定义的
**************************************************************************/
//Wobject类是WSlib中数据结构类的顶层父类,Wobject类用于统一动态内存申请的行为(失败返回空值,而不是抛出标准库中的异常对象),

//在堆中创建Wobject子类的对象,失败时返回NULL值,Wobject类为纯虚父类,所有子类都能进行动态类型识别

13、类族结构的进化

所有类位于单一的继承树,Wobject定义了动态内存申请失败时返回空指针。

改进的关键点,Exception类继承自Wobject类,堆空间中创建异常对象失败时,返回NULL指针。

新增InvalidOperation异常类:成员函数调用时,如果状态不正确则抛出异常。

SmartPoint类继承自Wobject类,堆空间中创建智能指针对象失败时,返回NULL 指针。

/* WSlib的开发方式和注意事项
迭代开发(可能推翻上一次的程序):每次完成一个小的目标,持续开发,最终打造可复用类库。原则:
单一继承树:所有类都继承自Wobject,规范堆对象创建时的行为
只抛异常,不处理异常:使用THROW_EXCEPTION抛出异常,提高移植性
弱耦合性:尽量不适用标准库中的类和函数,提高可移植性*/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

3、初识程序 的相关文章

  • (转) 如何将notepad++添加到右键

    工具 原料 win 7系统 Notepad 方法 步骤 左下角点击 开始 gt 运行 gt regedit 打开注册表编辑器 在HKEY CLASSSES ROOT Shell 下 在Shell下 新建项命名为Open With Notep
  • 卧槽,做Python兼职又接了一个大单,真香

    每年的第一季度 是Python兼职接单的高潮期 近段时间 各行业对爬虫类和数分类服务的需求量呈指数级的暴增 圈子里的朋友双休都没闲着 趁着旺季接单大赚一笔 所以 最近在csdn后台咨询技术变现 兼职接单问题的朋友也越来越多 最近十天收到了六
  • 【数据库原理及应用教程(第4版

    文章目录 一 选择题 二 填空题 三 简答题 Reference 一 选择题 1 2 3 4 5 6 7 8 9 10 C B D C D B A B D B 11 12 13 14 15 16 17 18 19 20 C D A D B
  • Spring启动执行流程梳理

    注 本文梳理启动流程使用的Spring版本 4 0 2 RELEASE 使用spring配置 都需要在web xml中配置一个spring的监听器和启动参数 context param 如下
  • 基于视觉的移动平台运动目标检测

    1 声明 本文为自己的研究总结 主要根据各类文献总结而来 内容上可能有些不全面 不客观 这篇博文主要介绍的是基于视觉的移动平台运动目标检测 写这篇博文的目的主要是对自己一个阶段性总结 也希望能够帮助做这方面研究的同学 2 引言 首先 我们来
  • Nacos + Prometheus + Grafana 搭建走起~

    小伙伴们好呀 这两天在本地搭建了这个 Nacos Prometheus Grafana 主要是为了这个 nacos 填坑 然后顺便搭下这个监控中心 哈哈 文章内容比较琐碎 看完你可以了解到 怎么选择 nacos 版本 可能会踩到的坑 没错
  • 一些概念的解释

    转移支付 财政转移支付是以各级政府之间所存在的财政能力差异为基础 以实现各地公共服务水平的均等化为主旨 而实行的一种财政资金转移或财政平衡制度 用人话说 就是大家一起收税 三分留地方 七分归国家 实际上不同税种比例不同 归国家的这些国家在根
  • DELL R740服务器系统安装详细过程

    RAID配置 1 开机F2进入bios 2 选择device setting 3 Integrated Raid controller 1 xxxxxx raid 卡型号 一般是第一行 4 选择 Main Menu
  • java中上传本地图片

    如果你想上传多张图片 http blog csdn net xuanzhangran article details 54929988 如果是上传单张如下 点击上传图片按钮 上传本地 效果如图 1 原始图框 2 点击预览 弹出本地弹框 3
  • PB调用windows api删除文件夹及其子文件夹或子文件

    创建nvo folder对象 forward global type nvo folder from nonvisualobject end type type shfileopstruct from structure within nv
  • Java线程:线程的交互

    本文转载至 http lavasoft blog 51cto com 62575 99157 线程交互是比较复杂的问题 SCJP要求不很基础 给定一个场景 编写代码来恰当使用等待 通知和通知所有线程 一 线程交互的基础知识 SCJP所要求的
  • 比较流行的响应式框架

    Bootstrap Foundation Semantic UI PureCSS 与君共勉 再牛逼的梦想 也抵不住傻逼般的坚持
  • Parser-Free Virtual Try-on via Distilling Appearance Flows代码解析

    从PF AFN test开始看 先看测试代码 1 test sh python test py name demo resize or crop None batchSize 1 gpu ids 0 参数 name resize or cr
  • 子组件自定义事件,父组件调用记录-

    方式一 1 子组件 p 某个事件 p methods a b是子组件自定义的事件名 this emit b 定义传给父组件的值 2 父组件调用 父组件定义 a a methods a e console log e 定义传给父组件的值 方式
  • 华为OD机试 - 运维日志排序(Java)

    题目描述 运维工程师采集到某产品线网运行一天产生的日志n条 现需根据日志时间先后顺序对日志进行排序 日志时间格式为H M S N H表示小时 0 23 M表示分钟 0 59 S表示秒 0 59 N表示毫秒 0 999 时间可能并没有补全 也
  • utils:常见的几种日期格式和转换方法

    一 UTC格式 国际统一时间 YYYYMMDD T HHMMSS Z 或者时区标识 T表示分隔符 Z表示的是UTC 相差北京时间8小时 2020 01 13T16 00 00 000Z 对应的北京时间 2020 01 14 00 00 00
  • 【计算机视觉】目标检测中Faster R-CNN、R-FCN、YOLO、SSD等算法的讲解(图文解释 超详细必看)

    觉得有帮助请点赞关注收藏 一 基于候选区域的目标检测算法 基于候选区域的深度卷积神经网络 Region based Convolutional Neural Networks 是一种将深度卷积神经网络和区域推荐相结合的物体检测方法 也可以叫
  • hdu 6069 Counting Divisors

    Problem acm hdu edu cn showproblem php pid 6069 Meaning 定义函数d n n 的因子个数 给定区间 l r 和常数 k 求 i lrd ik mod 998244353 sum r i
  • JAVA练习28-买卖股票的最佳时机‖

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 目录 前言 一 题目 1 题目描述 2 思路与代码 2 1 思路 2 2 代码 总结 前言 提示 这里可以添加本文要记录的大概内容 1月22日练习内容 提示 以下是本篇文章正
  • Adapter及其一些例子

    为了更好的理解Adapter我们这里先看一下接口的关系图 我们主要讲解就是BaseAdapter因为它同时继承了ListAdapter与spinnerAdapter 而且绝大部分的Adapter都继承它 Adapter的实现类如下 Arra

随机推荐

  • 决策树实现鸢尾花分类

    介绍 在这篇博客中 我们使用以下几个库来实现决策树算法 scikit learn机器学习库 scikit learn最先是由David Cournapeau在2007年发起的一个Google Summer of Code项目 从那时起这个项
  • JavaWeb问题解决:关于JSP中使用System类会出现服务器错误的情况

    浏览器显示的报错详情 报错代码 System out cannot be resolved to a type 无法为JSP编译类 这洋文的意思是说 System out不能被解析成类型 大致意思意思就是在JSP页面解析成为Servlet类
  • 一些数学符号

    阿尔法 贝塔 伽玛 德尔塔 伊普西隆 泽塔 伊塔 西塔 约塔 卡帕 兰姆达 米欧 纽 克西 欧米克隆
  • 第4题:请编写一个函数void fun(char *tt,int pp[]),统计在tt字符串中“a”到“z”26个字母各自出现的次数,并依次放在pp所指数组中。

    C试题 第4题 请编写一个函数void fun char tt int pp 统计在tt字符串中 a 到 z 26个字母各自出现的次数 并依次放在pp所指数组中 ChatGPT回答如下 主要考察了以下几个知识点 字符串的基本操作 在 C 语
  • 双峰逻辑映射【基于matlab的动力学模型学习笔记_7】

    仅当作学习笔记 若有纰漏欢迎友好交流指正 此外若能提供一点帮助将会十分荣幸 本文利用Lyapunov指数 着重从混沌特性展现双峰逻辑映射与逻辑映射之间的区别 所谓的一维双峰逻辑映射 是因为它在第一次迭代中会出现一个双峰 如下图所示 图1 双
  • java 数字范围正则_Java 正则表达式

    正则表达式 概述 正则表达式定义了字符串的模式 正则表达式可以用来搜索 编辑或处理文本 正则表达式并不仅限于某一种语言 但是在每种语言中有细微的差别 java util regex 包主要包括以下三个类 Pattern 类 pattern
  • 可转债网格交易策略回测

    什么是网格交易策略 基于股票波动高抛低吸策略 自动化反复买卖赚取差价 投资者借助条件单 把资金分成多份 从基准价开始 每跌x 就自动买入一份 每涨y 就自动卖掉一份 股价越波动高抛低吸的机会越多 什么是交易策略回测 设定了交易策略后 基于历
  • 安卓pos机开发!写给互联网大厂员工的真心话,附带学习经验

    前言 19年6月份从网易云音乐离开 放弃了留学机会 开始了人生的第一次创业 前后尝试了两个项目 因为个人能力与时机因素都失败了 虽然没能享受到创业所能够带来高杠杆物质上的回报 但是对个人软技能和自我边界认知上都有了很大的提升 对于这段经历有
  • [Error] invalid operands of types 'float' and 'int' to binary 'operator%' c错误

    错误提示告诉你 的所有两边 一个是整形 int 一个是浮点型 float 类型不匹配报错 所以你把应该把 其中一个变量定义成整形
  • 前端(node.js)调用dll动态链接库

    壹 需求 使用 js node 调用dll 动态链接库 github地址如下 包含dll 里面就一个Add方法暴露出来 github 贰 两种方式调用dll 当前开发环境 Windows 11 22H2 node v16 20 0 Pyth
  • logback配置日志

    logback的详细介绍网上有很多 http blog csdn net jibaole article details 52442694 参考文档 使用方法 当我们分清了log4j logback和slf4j的关系后 我们就可以使用它们了
  • [701]labelImg标注工具

    labelImg github https github com tzutalin labelImg exe下载 https tzutalin github io labelImg 用于深度网络训练的数据集做标注的方法和工具有好多 像Lab
  • dockerfile基于apline将JDK20打包成镜像

    dockerfile基于apline将JDK20打包成镜像 今天就来和大家聊聊如何把最新出版的JDK20打包成docker镜像 很多uu都会采用centos作为基础镜像 这么做会有一个问题 centos系统会含有很多库文件 这些库文件JDK
  • Visual Studio Code和IntelliJ IDEA运行spring boot项目

    纯前端 没有java经验 要运行一个spring boot项目 根据别人博文运行成功 现整理到本文 以更基础的方式写步骤 参考博文 超详细的VsCode创建SpringBoot项目 图文并茂 yd的博客 CSDN博客 一 Java环境配置
  • Pytorch多GPU训练:DataParallel和DistributedDataParallel

    引言 Pytorch有两种方法实现多GPU训练 分别是DataParallel DP 和DistributedDataParallel DDP DP实现简单 但没有完全利用所有GPU资源 DDP实现相对复杂 但是更快 我建议使用DDP DP
  • bert入门之分词源码解析

    bert编码方法 概括起来 就分词和id映射 我们先看一下分词的两个方法 一 BasicTokenizer 大致流程 转成 unicode gt 去除各种奇怪字符 gt 处理中文 gt 空格分词 gt 去除多余字符和标点分词 gt 再次空格
  • 国内就能用的Chat-GPT分享

    人工智能在语音理解与交互的新里程碑 AI聊天平台 在人工智能 AI 领域 语言模型的发展日新月异 这其中 OpenAI所推出的GPT系列语言模型尤为显眼 尤其是其中的一员 ChatGPT 已经在人工智能的语言理解与交互方面设定了一个新的里程
  • PB安装步骤

    安装PowerBuilder 9 0具体步骤 1 解压压缩包 双击 SETUP 2 点击 Next 3 点击 Yes 4 点击 Next 5 选择好安装到的文件夹 点击 Next 6 选择组件 我只选择PowerBuilder 点击 Nex
  • 如何加载HTML页面页面到另一个界面中

    1 第一种 iframe 但是 对于个人经验来说 iframe最好不要用 不仅自适应不太好 而且对于seo优化特别不好 2 第二种 通过jQuery load 事件加载页面 比较简单 但是会刷新界面 不过个人感觉影响不大 可以return
  • 3、初识程序

    数据结构静态的描述了数据元素之间的关系 高效的程序需要在数据结构的基础上设计和选择算法 高效的程序 恰当的数据结构 合适的算法 算法是特定问题求解步骤的描述 在计算机中表现为指令的有限序列 算法是独立存在的一种解决问题的方法和思想 特性 输