每日算法系列【LeetCode 1039】多边形三角剖分的最低得分
题目描述给定 N,想象一个凸 N 边多边形,其顶点按顺时针顺序依次标记为 A[0], A[i], ..., A[N-1]。假设您将多边形剖分为 N-2 个三角形。对于每个三角形,该三角形的值是顶点标记的乘积,三角剖分的分数是进行三角剖分后所有 N-2 个三角形的值之和。返回多边形进行三角剖分后可以得到的最低分。示例1输入:[1,2,3]输出:6解释:多边形已经三角化,唯一三角形的分数为 6。示例2输入:[3,7,4,5]输出:144解释:有两种三角剖分,可能得分分别为:3*7*5 + 4*5*7 = 245,或 3*4*5 + 3*4*7 = 144。最低分数为 144。示例3输入:[1,3,1,4,1,5]输出:13解释:最低分数三角剖分的得分情况为 1*1*3 + 1*1*4 + 1*1*5 + 1*1*1 = 13。提示3 <= A.length <= 501 <= A[i] <= 100题解可以发现,一刀下去,两个多边形只有一条边是在内部,其他边都是连续的外围的边,如下图所示:代码c++class Solution {public: static const int N = 55; int dp[N][N];
int minScoreTriangulation(vector<int>& A) { int n = A.size(); memset(dp, 0, sizeof dp); for (int len = 3; len <= n; ++len) { for (int i = 0; i < n; ++i) { int j = i + len - 1; int tmp = INT_MAX; for (int k = i+1; k < j; ++k) { tmp = min(tmp, A[i]*A[j%n]*A[k%n]+dp[i][k%n]+dp[k%n][j%n]); } dp[i][j%n] = tmp; } } return dp[0][n-1]; }};pythonclass Solution: def minScoreTriangulation(self, A: List[int]) -> int: n = len(A) dp = [[0]*n for _ in range(n)] for l in range(3, n+1): for i in range(n): j = i + l - 1 tmp = 0x3f3f3f3f for k in range(i+1, j): tmp = min(tmp, A[i]*A[j%n]*A[k%n]+dp[i][k%n]+dp[k%n][j%n]) dp[i][j%n] = tmp return dp[0][n-1]作者简介:godweiyang,知乎同名,华东师范大学计算机系硕士在读,方向自然语言处理与深度学习。喜欢与人分享技术与知识,期待与你的进一步交流~
高校学生参加飞天加速计划
我是一名来自四川的大四学生,用阿里云服务器已经一年多了,平时能够在阿里云服务器上部署一些自己的小项目,不仅能够学习,还能满足自己的一些成就感。阿里云的很多活动对学生非常友好,最开始看到阿里云的学生服务器仅需9元一月,就直接下手了一年,服务器配置能够满足我的基本需求,平时学习Linux和部署一些项目在上面拿去参赛等。 阿里云非常的人性,在开通服务器时会介绍很多知识,能够让小白快速上手。开通服务器后,就安装了宝塔面板,这是一个非常好的服务器运维面板,提供了很多便捷的工具。阿里云服务器ECS可以搭建个人网站、小程序等,安全性也很高,不需要担心安全问题。 飞天加速计划是个非常好的活动,它为我在家中学习的大学生提供了一个稳定性强、容易使用、安全度高的云服务器,可以通过学习,做出属于自己的网页,可以和同学一起开发小程序、微信公众号等等。还搭建了小程序服务端,在比赛中还获了奖。阿里云将其在、大数据、AI、低代码、数据智能等方面,提供给开发者便利。宣布升级到2.0的"飞天加速计划",助力开发者应用创新。其中包括:面向高校师生,提供30亿小时免费资源,提供教育基金,用于学生教育与实践;面向开发者,提供专属特价产品及免费学习资源、认证服务和比赛基金,给我们很多优惠以及很多方便。 最后,对计算机感兴趣的,特别是喜欢开发的,一定要拥有一台自己的云服务器,刚好阿里云的活动就能够满足大部分的学生用户,刚开始还有免费的ECS领取,也希望更多的大学生加入到这一队列来,为自己增加一个新的技能!我希望阿里云能够不断创新,给广大应用人员提供更多的方便。
高校学生参加飞天加速计划
我是一名来自四川的大四学生,用阿里云服务器已经一年多了,平时能够在阿里云服务器上部署一些自己的小项目,不仅能够学习,还能满足自己的一些成就感。阿里云的很多活动对学生非常友好,最开始看到阿里云的学生服务器仅需9元一月,就直接下手了一年,服务器配置能够满足我的基本需求,平时学习Linux和部署一些项目在上面拿去参赛等。 阿里云非常的人性,在开通服务器时会介绍很多知识,能够让小白快速上手。开通服务器后,就安装了宝塔面板,这是一个非常好的服务器运维面板,提供了很多便捷的工具。阿里云服务器ECS可以搭建个人网站、小程序等,安全性也很高,不需要担心安全问题。 飞天加速计划是个非常好的活动,它为我在家中学习的大学生提供了一个稳定性强、容易使用、安全度高的云服务器,可以通过学习,做出属于自己的网页,可以和同学一起开发小程序、微信公众号等等。还搭建了小程序服务端,在比赛中还获了奖。阿里云将其在、大数据、AI、低代码、数据智能等方面,提供给开发者便利。宣布升级到2.0的"飞天加速计划",助力开发者应用创新。其中包括:面向高校师生,提供30亿小时免费资源,提供教育基金,用于学生教育与实践;面向开发者,提供专属特价产品及免费学习资源、认证服务和比赛基金,给我们很多优惠以及很多方便。 最后,对计算机感兴趣的,特别是喜欢开发的,一定要拥有一台自己的云服务器,刚好阿里云的活动就能够满足大部分的学生用户,刚开始还有免费的ECS领取,也希望更多的大学生加入到这一队列来,为自己增加一个新的技能!我希望阿里云能够不断创新,给广大应用人员提供更多的方便。
高校学生参加飞天加速计划
我是一名来自四川的大四学生,用阿里云服务器已经一年多了,平时能够在阿里云服务器上部署一些自己的小项目,不仅能够学习,还能满足自己的一些成就感。阿里云的很多活动对学生非常友好,最开始看到阿里云的学生服务器仅需9元一月,就直接下手了一年,服务器配置能够满足我的基本需求,平时学习Linux和部署一些项目在上面拿去参赛等。 阿里云非常的人性,在开通服务器时会介绍很多知识,能够让小白快速上手。开通服务器后,就安装了宝塔面板,这是一个非常好的服务器运维面板,提供了很多便捷的工具。阿里云服务器ECS可以搭建个人网站、小程序等,安全性也很高,不需要担心安全问题。 飞天加速计划是个非常好的活动,它为我在家中学习的大学生提供了一个稳定性强、容易使用、安全度高的云服务器,可以通过学习,做出属于自己的网页,可以和同学一起开发小程序、微信公众号等等。还搭建了小程序服务端,在比赛中还获了奖。阿里云将其在、大数据、AI、低代码、数据智能等方面,提供给开发者便利。宣布升级到2.0的"飞天加速计划",助力开发者应用创新。其中包括:面向高校师生,提供30亿小时免费资源,提供教育基金,用于学生教育与实践;面向开发者,提供专属特价产品及免费学习资源、认证服务和比赛基金,给我们很多优惠以及很多方便。 最后,对计算机感兴趣的,特别是喜欢开发的,一定要拥有一台自己的云服务器,刚好阿里云的活动就能够满足大部分的学生用户,刚开始还有免费的ECS领取,也希望更多的大学生加入到这一队列来,为自己增加一个新的技能!我希望阿里云能够不断创新,给广大应用人员提供更多的方便。
数据结构项目——二叉树实现
案例分析:写出下面二叉树的先、中、后序遍历输出的结果:注:先自己推算,然后用程序验算。先序遍历的结果:A F H D C B J G E I K中序遍历的结果:D H C F J B G A I E K后序遍历的结果:D C H J G B F I K E A代码如下:#include "pch.h"
#include <iostream>
using namespace std;
int top = -1;
typedef struct Bitnode
{
char data;
Bitnode *lchild, *rchild;
}Bitnode,*bittree;
//创建一个二叉树
void Createbittree(bittree *t)
{
*t =(Bitnode *) malloc(sizeof(Bitnode));
(*t)->data = 'A';
(*t)->lchild= (Bitnode *)malloc(sizeof(Bitnode));
(*t)->rchild =(Bitnode *)malloc(sizeof(Bitnode));
(*t)->lchild->data = 'F';
(*t)->rchild->data = 'E';
(*t)->lchild->lchild = (Bitnode *)malloc(sizeof(Bitnode));
(*t)->lchild->rchild = (Bitnode *)malloc(sizeof(Bitnode));
(*t)->rchild->lchild = (Bitnode *)malloc(sizeof(Bitnode));
(*t)->rchild->rchild = (Bitnode *)malloc(sizeof(Bitnode));
(*t)->lchild->lchild->data = 'H';
(*t)->lchild->rchild->data = 'B';
(*t)->rchild->lchild->data = 'I';
(*t)->rchild->rchild->data = 'K';
(*t)->rchild->lchild->lchild= NULL;
(*t)->rchild->lchild->rchild= NULL;
(*t)->rchild->rchild->lchild = NULL;
(*t)->rchild->rchild->rchild = NULL;
(*t)->lchild->lchild->lchild = (Bitnode *)malloc(sizeof(Bitnode));
(*t)->lchild->lchild->lchild->lchild = NULL;
(*t)->lchild->lchild->lchild->rchild = NULL;
(*t)->lchild->lchild->rchild = (Bitnode *)malloc(sizeof(Bitnode));
(*t)->lchild->lchild->rchild->lchild = NULL;
(*t)->lchild->lchild->rchild->rchild = NULL;
(*t)->lchild->rchild->lchild = (Bitnode *)malloc(sizeof(Bitnode));
(*t)->lchild->rchild->lchild->lchild = NULL;
(*t)->lchild->rchild->lchild->rchild = NULL;
(*t)->lchild->rchild->rchild = (Bitnode *)malloc(sizeof(Bitnode));
(*t)->lchild->rchild->rchild->lchild = NULL;
(*t)->lchild->rchild->rchild->rchild = NULL;
(*t)->lchild->lchild->lchild->data = 'D';
(*t)->lchild->lchild->rchild->data = 'C';
(*t)->lchild->rchild->lchild->data = 'J';
(*t)->lchild->rchild->rchild->data = 'G';
}
//先序遍历入栈
void Push(Bitnode **a,Bitnode *elem)
{
a[++top] = elem;
}
//先序遍历出栈
void Pop()
{
if (top==-1)
{
return;
}
top--;
}
//获取栈顶元素
Bitnode *Get_top(Bitnode**a)
{
return a[top];
}
//输出节点数据
void Printelem(Bitnode *elem)
{
cout << elem->data << " ";
}
//实现先序遍历算法
void preorder(Bitnode*tree)
{
Bitnode *a[30];
Bitnode *p;
Push(a, tree);
while (top!=-1)
{
p = Get_top(a);
Pop();
while (p)
{
Printelem(p);
if (p->rchild)
{
Push(a,p->rchild);
}
p = p->lchild;
}
}
}
//中序遍历二叉树
void inorder(bittree tree)
{
Bitnode *a[30]; //定义一个顺序栈
Bitnode *p; //临时指针
Push(a, tree); //根节点入栈
while (top != -1) //top!=-1来判定栈是否为空
{
while ((p=Get_top(a))&&p)//获取栈顶元素不为空
{
//左子树节点入栈,如果没有,null入栈
Push(a, p->lchild);
}
Pop();//跳出循环,栈顶元素是空,
if (top!=-1)
{
p = Get_top(a);//获取栈顶元素
Pop();
Printelem(p);
Push(a,p->rchild);//右子树节点入栈
}
}
}
//二叉树后序遍历(非递归法)
struct Snode
{
bittree p;
int tag;
};
//后序遍历的入栈函数
void PostPush(Snode*a, Snode sdata)
{
a[++top] = sdata;
}
//后序遍历
void PostOrder(bittree tree)
{
Snode a[20];
Bitnode*p; //节点指针
int tag;
Snode sdata;
p = tree;
while (p||top!=-1)//用的或,这两种都行
{
while (p)
{
sdata.p = p;
sdata.tag = 0;//遍历左子树,设置标记位为0
PostPush(a, sdata);//入栈
p = p->lchild;//以该节点为根节点,遍历左子树
}
sdata=a[top];
Pop();
p = sdata.p;
tag = sdata.tag;
if (tag==0)//条件为真,左子树遍历完成,该节点需要遍历右子树
{
sdata.p = p;
sdata.tag = 1;
PostPush(a, sdata);//更改节点标志位,重新入栈
p = p->rchild;//将该节点的右子树设置为根节点,重新循环
}
else
{
Printelem(p);
p = NULL;
}
}
}
int main()
{
bittree tree;
Createbittree(&tree);
cout << "先序遍历的结果为:";
preorder(tree);
cout << endl;
cout << "中序遍历的结果为:";
inorder(tree);
cout << endl;
cout << "后序遍历的结果为:";
PostOrder(tree);
cout << endl;
return 0;
}
结果为:
海晟融创的行业解决方案分享 BizWorks 如何助力我们更高效地建设中台
海晟融创的行业解决方案分享BizWorks 如何助力我们更高效地建设中台——冯云雷海晟融创公司海晟融创成立于 2006 年,是福建省烟草局业务多元化拓展的合资子公司。公司秉持“专业专注、服务烟草”经营理念,致力于通过信息技术的开发和应用推广来推进行业信息化进程。海晟融创勇于创新,探索多元化发展,成为生态综合服务商的脚步从未停止。2004 年,烟叶信息基础管理软件在全行业推广,海晟融创正式成为国家级行业化服务商。 2006 年,引入了中软国际的技术重组,苦练内功,坚实基础。 2020 年引入了投资公司战略入股,开始加快发展。如今,海晟融创依托于云平台加中台的架构,通过资源整合、数智驱动,实现了覆盖农、工、商、政的产业链全景解决方案。在此过程中,阿里云 Bizworks 应用起到了很大的作用。技术进步一直是行业变革的源动力。随着产业数字化进程不断深入,烟草行业也迎来了互联网+的转型升级。行业指导意见明确提出,要通过推进互联网、大数据、人工智能等新技术与烟草产业深度整合,促进传统烟草升级优化,积极面对控烟履约、新型制品、完善体制等严峻挑战,着力增强互联网+智慧农业、互联网+协同制造、互联网+现代流通、互联网+高校政务,有效化解产能过剩、布局分散、创新能力不足等现实难题。海晟业务中台正是基于此战略,创新探索数据中台加业务中台,依赖阿里云平台,借助 BizWorks 业务中台业务设计。依托“云-管-端”业务架构,聚焦“场景为先云为先”,通过模块去重和沉淀,通过共享通用模块,让前台业务更加敏捷地面向市场,实现企业新业务的快速上线与迭代试错,服务更多场景,提升业务响应力。在技术层面,避免重复开发,技术迭代升级更高效,可按需扩展,让整个技术框架在自主可控的基础上更开放,打造全管理场景数字化生态。 BizWorks提供了一整套研发管控工具,包括业务建模、技术框架、脚手架代码生成、代码扫描、发布部署、容器管理、能力运营、系统运维等等。在日常开发中,可以实现多业务中心的有效区隔,每个业务中心同步开展可视化建模和设计工作,生成的脚手架代码和 DDL 脚本能够直接用于开发。而在研发过程中,对于业务模型、数据模型的修改,既可正向由模型到代码更新,也可在代码中调整后通过 BizWorks 反向扫描来更新,大大节省了设计和开发成本,提升了开发效率。同时 BizWorks 还提供了十大业务基础模板,基于此模板的通用能力,能够快速叠加业务属性,创建业务中心。正是得益于此,我们才得以在短时间内成功快速建设八大烟草业务中心。 BizWorks 除了作为业务中台的技术基座,其设计建模、应用开发、发布部署、运维运营等能力还可持续为上层中台应用建设和治理助力。简单的业务应用依赖中台建设完成的业务模型,只需定义能力模型,即可快速开发实现。而与部署流水线的有机整合,则彻底解决了开发技术框架、版本依赖等运维部署难题。自动扫描、自动编译、自动发布,让即时应用成为可能。BizWorks 应用为海晟融创带来了以下四个方面的收益:① 夯实基座:以 BizWorks 为技术基座,拉通全行业技术规范,通过 BizWorks 产品组件贯穿整个产品研发生命周期,保障全行业的技术实施稳定高效。② 沉淀资产:通过 BizWorks 构建的烟草行业标准模型,借助后续领域业务迭代打磨,逐步形成行业级标准,进而得以在全国烟草行业进行推广。③ 最佳实践:以中台建设加持续运营为理论基础,结合阿里多年来的最佳实践方案,帮助行业数字中台逐步形成了理论加实践的样板案例,这也是我们最初选择 BizWorks 的重要原因。④ 降本提效: BizWorks 提供的一套完整的技术研发工具加业务中心开发模板,能够帮助行业、各省局的承建方快速使用、扩展、新建各类业务应用,极大提高了研发效率,降低了人力成本和时间成本,最终得以快速推向市场。阿里作为中台战略的首倡者,其理念在 BizWorks 中得到了完美体现。而海晟融创多年来的行业深耕,对烟草行业的业务熟悉程度称得上业内翘楚。双方在前期的合作中效果显著。未来,希望双方团队能够建立长期稳定的交流机制,使业务融于产品,产品了解业务,从而实现产品层的深度集成,真正实现战略级的整合对接,快速强化业务中台的基础能力和可扩展性,孵化特色应用,形成囊括烟草、工、农、商、政全域的产业生态布局,打造赋能型“烟草+”产业新生态,全方位为行业高质量发展及数字化转型赋能,提供更好的服务。
MySQL原理 - 字符集与排序规则(上)
任何计算机存储数据,都需要字符集,因为计算机存储的数据其实都是二进制编码,将一个个字符,映射到对应的二进制编码的这个映射就是字符编码(字符集)。这些字符如何排序呢?决定字符排序的规则就是排序规则。查看内置字符集与比较规则通过show charset;命令,可以查看所有的字符集。 以下仅展示了我们常用的字符集:+----------+---------------------------------+---------------------+--------+
| Charset | Description | Default collation | Maxlen |
+----------+---------------------------------+---------------------+--------+
| latin1 | cp1252 West European | latin1_swedish_ci | 1 |
| ascii | US ASCII | ascii_general_ci | 1 |
| gb2312 | GB2312 Simplified Chinese | gb2312_chinese_ci | 2 |
| cp1250 | Windows Central European | cp1250_general_ci | 1 |
| gbk | GBK Simplified Chinese | gbk_chinese_ci | 2 |
| utf8 | UTF-8 Unicode | utf8_general_ci | 3 |
| utf8mb4 | UTF-8 Unicode | utf8mb4_general_ci | 4 |
| utf16 | UTF-16 Unicode | utf16_general_ci | 4 |
| utf32 | UTF-32 Unicode | utf32_general_ci | 4 |
+----------+---------------------------------+---------------------+--------+ascii:共收录128个字符,包括空格、标点符号、数字、大小写字母和一些不可见字符。由于总共才128个字符,所以可以使用1个字节来进行编码latin1:共收录256个字符,是在ASCII字符集的基础上又扩充了128个西欧常用字符(包括德法两国的字母),也可以使用1个字节来进行编码。gb2312: 收录了汉字以及拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母。其中收录汉字6763个,其他文字符号682个,兼容ASCII字符集。这是一个变长字符集,如果该字符在ascii字符集中,则采用1字节编码,否则采用两字节。gbk: GBK是在gb2312基础上扩容后的标准。收录了所有的中文字符。同样的,这是一个变长字符集,如果该字符在ascii字符集中,则采用1字节编码,否则采用两字节。utf8和utf8mb4: 收录地球上能想到的所有字符,而且还在不断扩充。这种字符集兼容ASCII字符集,采用变长编码方式,编码一个字符需要使用1~4个字节。MySQL为了节省空间,其中的utf8是标准 UTF8 阉割后的,只有1~3字节编码的字符集,基本包含了所有常用的字符。如果还要使用 enoji 表情,那么需要使用utf8mb4,这个是完整的 UTF8 字符集。utf16: 不同于utf8,utf16用两个字节或者四个字节编码字符,可以理解为utf8的不节省空间的一种形式utf32: 固定用四个字节编码字符,可以理解为utf8的不节省空间的一种形式通过查看information_schema.character_sets表,也可以看到所有的字符集:mysql> select * from information_schema.character_sets where character_set_name = "utf8";
+--------------------+----------------------+---------------+--------+
| CHARACTER_SET_NAME | DEFAULT_COLLATE_NAME | DESCRIPTION | MAXLEN |
+--------------------+----------------------+---------------+--------+
| utf8 | utf8_general_ci | UTF-8 Unicode | 3 |
+--------------------+----------------------+---------------+--------+
1 row in set (0.06 sec)通过show collation;命令,可以查看所有的字符集,我们这里来查看utf8mb4的排序规则:mysql> show collation like 'utf8mb4%';
+------------------------+---------+-----+---------+----------+---------+
| Collation | Charset | Id | Default | Compiled | Sortlen |
+------------------------+---------+-----+---------+----------+---------+
| utf8mb4_general_ci | utf8mb4 | 45 | Yes | Yes | 1 |
| utf8mb4_bin | utf8mb4 | 46 | | Yes | 1 |
| utf8mb4_unicode_ci | utf8mb4 | 224 | | Yes | 8 |
| utf8mb4_icelandic_ci | utf8mb4 | 225 | | Yes | 8 |
| utf8mb4_latvian_ci | utf8mb4 | 226 | | Yes | 8 |
| utf8mb4_romanian_ci | utf8mb4 | 227 | | Yes | 8 |
| utf8mb4_slovenian_ci | utf8mb4 | 228 | | Yes | 8 |
| utf8mb4_polish_ci | utf8mb4 | 229 | | Yes | 8 |
| utf8mb4_estonian_ci | utf8mb4 | 230 | | Yes | 8 |
| utf8mb4_spanish_ci | utf8mb4 | 231 | | Yes | 8 |
| utf8mb4_swedish_ci | utf8mb4 | 232 | | Yes | 8 |
| utf8mb4_turkish_ci | utf8mb4 | 233 | | Yes | 8 |
| utf8mb4_czech_ci | utf8mb4 | 234 | | Yes | 8 |
| utf8mb4_danish_ci | utf8mb4 | 235 | | Yes | 8 |
| utf8mb4_lithuanian_ci | utf8mb4 | 236 | | Yes | 8 |
| utf8mb4_slovak_ci | utf8mb4 | 237 | | Yes | 8 |
| utf8mb4_spanish2_ci | utf8mb4 | 238 | | Yes | 8 |
| utf8mb4_roman_ci | utf8mb4 | 239 | | Yes | 8 |
| utf8mb4_persian_ci | utf8mb4 | 240 | | Yes | 8 |
| utf8mb4_esperanto_ci | utf8mb4 | 241 | | Yes | 8 |
| utf8mb4_hungarian_ci | utf8mb4 | 242 | | Yes | 8 |
| utf8mb4_sinhala_ci | utf8mb4 | 243 | | Yes | 8 |
| utf8mb4_german2_ci | utf8mb4 | 244 | | Yes | 8 |
| utf8mb4_croatian_ci | utf8mb4 | 245 | | Yes | 8 |
| utf8mb4_unicode_520_ci | utf8mb4 | 246 | | Yes | 8 |
| utf8mb4_vietnamese_ci | utf8mb4 | 247 | | Yes | 8 |
+------------------------+---------+-----+---------+----------+---------+
26 rows in set (0.13 sec)同样的,通过查询information_schema.collations也可以:mysql> select * from information_schema.collations where character_set_name = "utf8mb4";
+------------------------+--------------------+-----+------------+-------------+---------+
| COLLATION_NAME | CHARACTER_SET_NAME | ID | IS_DEFAULT | IS_COMPILED | SORTLEN |
+------------------------+--------------------+-----+------------+-------------+---------+
| utf8mb4_general_ci | utf8mb4 | 45 | Yes | Yes | 1 |
| utf8mb4_bin | utf8mb4 | 46 | | Yes | 1 |
| utf8mb4_unicode_ci | utf8mb4 | 224 | | Yes | 8 |
| utf8mb4_icelandic_ci | utf8mb4 | 225 | | Yes | 8 |
| utf8mb4_latvian_ci | utf8mb4 | 226 | | Yes | 8 |
| utf8mb4_romanian_ci | utf8mb4 | 227 | | Yes | 8 |
| utf8mb4_slovenian_ci | utf8mb4 | 228 | | Yes | 8 |
| utf8mb4_polish_ci | utf8mb4 | 229 | | Yes | 8 |
| utf8mb4_estonian_ci | utf8mb4 | 230 | | Yes | 8 |
| utf8mb4_spanish_ci | utf8mb4 | 231 | | Yes | 8 |
| utf8mb4_swedish_ci | utf8mb4 | 232 | | Yes | 8 |
| utf8mb4_turkish_ci | utf8mb4 | 233 | | Yes | 8 |
| utf8mb4_czech_ci | utf8mb4 | 234 | | Yes | 8 |
| utf8mb4_danish_ci | utf8mb4 | 235 | | Yes | 8 |
| utf8mb4_lithuanian_ci | utf8mb4 | 236 | | Yes | 8 |
| utf8mb4_slovak_ci | utf8mb4 | 237 | | Yes | 8 |
| utf8mb4_spanish2_ci | utf8mb4 | 238 | | Yes | 8 |
| utf8mb4_roman_ci | utf8mb4 | 239 | | Yes | 8 |
| utf8mb4_persian_ci | utf8mb4 | 240 | | Yes | 8 |
| utf8mb4_esperanto_ci | utf8mb4 | 241 | | Yes | 8 |
| utf8mb4_hungarian_ci | utf8mb4 | 242 | | Yes | 8 |
| utf8mb4_sinhala_ci | utf8mb4 | 243 | | Yes | 8 |
| utf8mb4_german2_ci | utf8mb4 | 244 | | Yes | 8 |
| utf8mb4_croatian_ci | utf8mb4 | 245 | | Yes | 8 |
| utf8mb4_unicode_520_ci | utf8mb4 | 246 | | Yes | 8 |
| utf8mb4_vietnamese_ci | utf8mb4 | 247 | | Yes | 8 |
+------------------------+--------------------+-----+------------+-------------+---------+
26 rows in set (0.11 sec)每个字符集都有一个默认的排序规则:IS_DEFAULT 为 Yes。比较规则名称以与其关联的字符集的名称开头,可以用通过这个开头查询所有的字符集,也可以查询information_schema.collations精确指定字符集字符集后面跟着的是语言编码,因为utf8mb4包含了所有字符,不同国家的文字语言排序肯定不一样。最后末尾的ci代表case insensitive,大小写不敏感,所有可能的后缀如下所示:ai: accent insensitive 不区分重音as: accent sensitive 区分重音ci: case insensitive 不区分大小写cs: case sensitive 区分大小写bin: binary 以二进制方式比较应用字符集与比较规则字符集与比较规则配置有四个级别:MySQL实例级别库级别表级别字段级别 指定的级别粒度越小,则以粒度越小的字符集还有比较规则优先。例如指定MySQL实例级别字符集是utf8mb4,指定某个表字符集是latin1,那么这个表的所有字段如果不指定的话,编码就是latin1由于字符集和比较规则是互相有联系的,如果我们只修改了字符集,比较规则也会跟着变化,如果只修改了比较规则,字符集也会跟着变化,具体规则如下:只修改字符集,则比较规则将变为修改后的字符集默认的比较规则。只修改比较规则,则字符集将变为修改后的比较规则对应的字符集。实例级别通过两个系统变量来指定实例级别的字符集与排序规则。配置文件:[server]
character_set_server=utf8mb4
collation_server=utf8mb4_general_ci启动之后,可以查看并修改这两个变量。mysql> show variables like 'character_set_server';
+----------------------+---------+
| Variable_name | Value |
+----------------------+---------+
| character_set_server | utf8mb4 |
+----------------------+---------+
1 row in set (0.06 sec)
mysql> show variables like 'collation_server';
+------------------+--------------------+
| Variable_name | Value |
+------------------+--------------------+
| collation_server | utf8mb4_general_ci |
+------------------+--------------------+
1 row in set (0.05 sec)
mysql> set character_set_server = 'utf8mb4';
Query OK, 0 rows affected (0.00 sec)
mysql> set collation_server = 'utf8mb4_general_ci';
Query OK, 0 rows affected (0.00 sec)
为什么生命科学企业都在陆续上云?
文 | 阿里云弹性高性能计算团队 摘要:本文将从生命科学行业现状及其对算力的巨大需求开始,展示该行业目前在基础设施层面临的需求与痛点,解答为什么云上高性能计算将大大有助于生命科学企业的快速发展。 生命科学行业正迎来发展的黄金时期。医学的发展和人们对健康的追求,正快速转换为生命科学整个产业链发展的新动能,高性能计算HPC在生命科学研究中扮演着十分重要的角色。同时,随着生命科学行业的快速发展,我们可以看到,行业的上云已经成为了势不可挡的趋势。 得益于云的弹性与便捷,一个行业对云计算的急切需求往往与其快速发展分不开,传统IT的备货、交付、部署的长流程决定了它无法满足快速生长的行业猛增的IT需求。 本文将从生命科学行业现状及其对算力的巨大需求开始,展示该行业目前在基础设施层面面临何种需求与痛点,解答为什么云上高性能计算将大大有助于生命科学企业的快速发展。 生命科学对算力的需求:规模大、高性能、类型丰富目前,生命科学行业最主要的两个场景,分别是计算机辅助药物设计和基因测序。 1、计算机辅助药物研发21世纪以来,由于疾病复杂程度的不断提升,可成药靶点逐渐减少,新药研发的难度和成本明显增加,同时全球新药研发成功率呈明显下降趋势。创新药物研发是药企构建核心竞争力和持续发展的关键,而药物研发是一项高投入、高技术、高风险、长周期的系统工程。药企开始寻求AI、大数据等计算机技术辅助药物研发。药物研发全流程 新药的诞生通常需要经历药物发现、临床前研究、临床试验和审批等阶段后,最终才可以获批上市。在靶点发现、化合物合成等药物发现阶段,以及化合物筛选等临床前研究阶段,往往需要借助高性能计算强大的计算能力才能加速研发过程辅助药物设计。 在靶点发现环节进行蛋白质结构预测时,既有基于分子动力学和平面波等进行预测的方案,也有基于AI for Science的解决方案。 前者是高性能计算HPC典型的应用场景,有VASP、Gromacs等成熟软件的解决方案,通过计算得到模拟结果。该方案中,模拟问题规模与计算资源数量成正比。 与此同时,业界也逐渐涌现出AlphaFold2等解决方案,通过利用AI技术建立蛋白质序列和结构的关系,不断学习已知序列和结构进而对蛋白质结构进行预测。在强大的算法与算力的支持下,DeepMind将运算时间从数月缩短至数小时。随着网络模型参数规模的增加,对算力的要求也越来越高。 蛋白质三维结构AI预测 同样地,在虚拟化合物筛选时,药企通常需要对数百万级别的分子和蛋白结构做对接。每个配体分子都需要计算资源来获取对接分数,从而筛选出可用于实验验证活性的分子,面对海量的配体分子库,是需要庞大算力支撑分子和蛋白结构的对接工作。显然,单机的算力是很难胜任这样大规模的虚拟筛选任务,因此使用高性能计算HPC集群进行大规模虚拟筛选任务就至关重要。先导化合物发现流程 在靶点发现、化合物筛选和化合物合成等流程中,不同的计算模式、参数和软件,对计算资源的要求往往也是不同的。尤其随着AI的引入,对多资源的多样性配置提出更高的要求。 2、基因测序基因测序的业务流程主要包括样本上机(测序仪)、测序文件生成、基因序列比对及结果分析(计算机),并将结果数据及报告交付至各科研医疗机构。其中,基因序列比对及分析环节极为耗时,涉及大量的生信领域专业软件,计算资源的算力性能及方案优化对生信研发效率起着至关重要的作用。基因测序业务流程 对于基因测序典型的WGS(人类全基因组测序)流程,由于涉及文库索引构建、reads比对、排序、去重、BQSR校正以及Caller等环节,方法多样、流程繁复,且不同步骤对应BWA、GATK等不同的软件及参数,不同的生信软件可能又对应不同的并发能力及性能,不同的筛选任务对计算资源的多样性和规模都是不同的,不仅需要弹性的计算资源,还需要具有多样的实例配置。二代基因测序WGS测序流程生命科学在基础设施层面临的痛点与挑战原来大部分的生命科学企业都是采取自己在线下自建IDC机房的方式。总体来说,生命科学企业的IT基础设施主要面临资源规模固定、建设周期长和硬件资源运维成本高三大问题,具体表现如下: 1、资源固定,无法满足业务增长和资源多样性需求1.1 算力规模固定,影响业务增长速度企业在建设传统IDC之初,资源规模往往是明确规划的,因此整个集群的任务吞吐量是固定的。对于具有周期性的新药研发及测序业务来说,不同的研发周期和研发任务对资源的需求是不一样的,所以通常就会发生:在高峰期出现任务因等待资源而排队的现象,低谷期又出现资源闲置的问题,这就需要有弹性的计算资源来处理业务。1.2 资源配置固定,无法满足资源多样性需求本地IDC机房的计算资源由于是前期规划好的,其资源的配置是限定的,则会导致传统测序方式经常以相同的资源去完成不同测序步骤的执行,无法灵活变配,导致了大量的计算资源浪费。然而如前所述,其所需要的计算资源是灵活多变的。1.3 存储容量固定,无法满足用户不断增长的存储需求对于不断增长的存储规模,生信企业面对极大的线下存储设备运维和存储设备采购成本压力,如何能够获得高效、安全、稳定、高性价比及可持续的存储解决方案,也是生命科学企业面临的一大难题。以蛋白质结构研究为例,一般有X射线晶体学、核磁共振和冷冻电镜三种方法来测定蛋白质结构。以冷冻电镜为例,单个样本的电镜数据一般是10TB级别,企业本地的数据量都是PB级。与此同时,生物信息科研数据包含大量的参考文库数据、样本数据及中间数据文件。其中,单个人类全基因组测序的全流程数据就达1TB大小,由于生信数据的周期性及特殊性,通常的生信企业本地数据的存储量都达到PB级别。2、建设周期长,影响业务增长2.1 交付周期长,无法满足用户即开即用的时效需求传统IDC建设,一般需要经历有立项、招投标、采购和交付等流程,往往需要数月甚至长达一年的建设周期。在立项环节需要对后续业务规模进行评估、明确资源建设方案,这对于发展较快的业务来说,如此长时间的建设周期将成为发展较快的业务的瓶颈。2.2 硬件资源选型迭代慢,无法满足用户不断升级的资源需求在传统IDC建设中,企业往往很难快速地获取最新架构的硬件资源,而这些资源往往可以给业务带来可观的加速。例如,相较于Volta架构,英伟达A100架构的单精训练最高可以提供20倍的加速,这对于借助AI技术来加速的蛋白质结构预测来说,是一个极大的助力。而对于WGS测序,基于GPU或FPGA的异构加速方案研发也存在着大量的选型及验证过程。在线下IDC建设中,不仅需要考虑CPU/GPU/FPGA等产品的发布时间,选择合适的硬件规格,还需要评估业务架构的发展,这将是生命科学各类企业在建设资源时面临的巨大挑战。3、运维成本高线下IDC机房的运维工作也需要较大的人力投入。除了集群计算资源的管理、计算任务的调度、用户权限管理之外,计算资源本身的稳定性,尤其是硬件故障对业务进度将会产生严重影响。如果任务在计算过程中因宕机而终止,在没有checkpoint的情况下只能重新计算。此外,线下存储也需要考虑容灾,避免因硬件故障导致的数据丢失。所以,计算资源的管理、资源稳定性、数据容灾等工作都需要专门的运维团队来负责,无形中又增加了成本。当前,因为传统IDC提供的基础设施存在资源限制、交付周期长、资源无弹性、硬件资源迭代升级慢、运维成本高等问题,越来越多的生命科学企业转向更具弹性、稳定、高性价比的云上高性能计算解决方案,以加快业务的创新发展。阿里云提供EHPC生命科学系列解决方案阿里云相信,云上高性能计算是目前HPC建设使用的最佳途径。针对生命科学行业的相关需求,阿里云依托遍布全球的计算力及领先行业的神龙架构,提供高性能计算公共云解决方案、混合云解决方案、大内存实例性能优化解决方案、容器化解决方案、制药AI解决方案等,可以覆盖解决行业不同场景需求,并拥有以下优势:(1) 丰富算力,按需购买:阿里云在全球四大洲开服运营27个公共云地域、84个可用区;云上自动伸缩能力支持跨数据中心调度,满足大规模并行作业要求计算资源的类型也可根据调度器队列灵活配置支持多规格异构算力,以及大内存型、高主频等规格CPU实例;(2) 弹性伸缩,降本增效:阿里云弹性高性能计算(E-HPC)平台可动态创建/删除计算节点,灵活配置伸缩策略,按实际负载弹性计费,抢占式实例价格最低至1折,降低客户使用成本,提高作业质量及速度;(3) 极简运维,让企业专注核心业务发展:全面兼容HPC业务,自动搭建集群,提供作业运行性能分析,分别基于集群、实例、进程等维度定位热点,支持作业报表可视化输出,提供用户、任务、队列等维度的消费组成;(4) 新技术赋能,快速享受红利:IaaS层,阿里云持续迭代最新算力,SaaS和PaaS有着上百家第三方合作伙伴集成阿里云,让生命科学企业快速获取相关技术服务。阿里云丰富的生态及云上持续迭代的技术能力,帮助企业享受到全流程的技术服务与最新技术红利。阿里云高性能计算目前已经广泛应用于工业仿真(CAD/CAE)、芯片设计(EDA)、生物医药材料、能源勘探与公共服务等多个行业。 「深势科技」利用弹性供应的成本优化策略,结合抢占式实例的价格,以30%的成本完成海量资源的交付。同时云上弹性高性能计算E-HPC自动运维的特性,降低了深势科技的运维成本,提升了集群管理效率。 生命医学企业「圣庭医疗」通过上云优化了传统IDC集群的数据可靠性、运维成本及效率问题,基因比对与分析效率提升了70%。阿里云高性能计算团队还通过结合Slurm业务工作流dependency与自动伸缩的结合,减少了无效的计算资源浪费,有效降低了使用成本。 点击这里,进入“阿里云生命科学最佳实践”专题页了解更多方案与案例详细内容。
预约直播 | 主流的视觉算法及在PAI上的应用
一、直播时间:2022年06月30日(周四)18:00-18:30二、议题介绍:此次议题将会分别介绍主流的视觉算法包括图像分类,目标检测, 语义分割, 同时也会介绍最近较为火热的视觉Transformer和自监督学习技术。 在此基础上将会介绍这些算法在机器学习平台PAI开源的EasyCV视觉算法框架中的实现和应用,以一个实际的图像分类任务为例,使用当前效果SOTA的SwinTransformer进行模型训练、评估、推理过程。三、直播讲师:周文猛(谦言),阿里云机器学习平台PAI高级算法专家。2015年加入阿里,从事计算机视觉技术研究和落地,负责阿里云机器学习平台PAI上CV算法开发和业务落地,推动OCR技术完成云上商业化产品化,从0到1构建PAI-CV算法框架(EasyVision和EasyCV),沉淀了丰富的自监督算法、视觉三大主流领域SOTA算法、自研OCR算法,支持搜索推荐等核心业务,服务10+BU20+业务, 目前研究方向聚焦在自监督学习,视觉transformer以及CV模型的隐私保护。欢迎扫描二维码进群,预约参与观看直播,同技术大牛、同行小伙伴们一起交流分享心得!
2022物联网创新应用大赛 等你来战!
马路自己能收停车费通过穿戴式设备实现在线医疗仓库自动统计包裹状态城市应急永远走在下一次大雨的前面AI养殖摆脱靠天吃饭从万人工厂到无人车间,物联网正在重构人与世界的联结方式。我们惊叹于大家的创造力:在阿里云物联网平台上,发现了能自动统计货品数量的冰柜、预判生产线状态并解决问题的工业网关会省电省能源的大楼用IoT调配色号的染发机、无感解锁一辆电动车、自动统计蜜蜂数的数字蜂箱、甚至一个人就能种植万亩良田……随着技术的进步,数字孪生、元宇宙接踵而来,IoT的想象与创新空间没有边界。阿里云IoT提供Cloud AIoT Native基础产品架构以及行业引擎,帮助用户快速构建硬件智能和场景智能,来让你的idea,成为美好世界的现实。不分年龄、行业,我们向所有心怀创意的你,发出邀约,参加“智物智造”杯2022物联网创新应用大赛。 赛前训练营科普产品使用盲区大咖指导提升作品质量丰厚奖金池等你来赢惊喜奖品拿到手软五个赛道灵活选择 也可点击官网链接了解大赛详情