自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(30)
  • 收藏
  • 关注

原创 模型评估方法

常用的模型评估方法总结混淆矩阵(常用于二分类问题的模型评估)ROC曲线AUC值

2022-06-08 07:12:19 1353

原创 SQL语句性能分析

explain 命令explain命令的Extra字段常见值含义:1、Using index,表示的是使用了覆盖索引。2、Using where,表示MySQL将对存储引擎层提取的结果进行过滤,过滤条件字段无索引。只有在使用了索引,且Extra是Using where的情况下,才代表回表查询数据。3、Using temporary,使用了临时表来处理数据。查询的表来自于select产出的表,不是直接查找数据库的表。临时表是经过处理的表,比如group by,distinct 等。4、Usi

2021-03-19 11:57:06 1057

原创 经典排序算法

经典排序算法总述快速排序算法递归代码功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入总述你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一

2021-03-17 16:11:38 237

原创 数据库之order by

概述MySQL有两种方式可以实现ORDER BY:1、使用文件排序(filesort)2、通过索引扫描生成有序的结果InnoDB存储引擎以B+树作为索引的底层实现,B+树的叶子节点存储着所有数据页,中间节点不存放数据信息,并且所有叶子节点形成一个(双向)链表。如果MySQL可以直接遍历索引的叶子节点链表,不需要进行额外的排序操作。这就是用索引扫描来排序。如果相关orderby的字段上没有任何索引,MySQL就只能先扫表筛选出符合条件的数据,再将筛选结果根据排序。这个排序过程就是filesort。

2021-03-17 12:23:25 7286

原创 链表常见面试题

链表注意点1、警惕指针丢失和内存泄漏(单链表)(1)插入节点在节点a和节点b之间插入节点x,b是a的下一节点,p指针指向节点a。造成指针丢失和内存泄漏的代码:p—>next = x; x—>next = p—>next; 这会导致x节点的后继指针指向自身。正确的写法是2句代码交换顺序,即:x—>next = p—>next; p—>next = x;(2)删除节点在节点a和节点b之间删除节点b,b是a的下一节点,p指针指向节点a:p—>next

2021-03-15 15:35:02 168

原创 分别用链表和数组实现LRU

基本概念链表的概念:链表通过指针将一组零散的内存块串联在一起,属于线性结构。链表的种类:单链表、循环链表、双向链表链表与数据的区别:1、复杂度方面。2、读取方面。数组使用的是连续的内存空间,可以借助 CPU 的缓存机制,访问效率更高。而链表在内存中并不是连续存储,对 CPU 缓存不友好。3、存储方面。数组大小固定,占用连续内存空间,扩容麻烦;链表本身没有大小限制,支持动态扩容。链表实现LRU思路维护一个有序双链表,越靠近链表尾部的结点是越早之前访问的。当有一个新的数据被访问时,如下处理操作

2021-03-11 17:12:27 284

原创 常见数据库面试题

MYSQL的两种存储引擎区别Innodb引擎:提供了对数据库ACID事务的支持,并且实现了sql标准的四种隔离级别,事务安全的。如果在应用中执行大量的insert和update操作,应选择innodb引擎。支持行级锁不支持全文索引。支持外键MyIASM引擎:没有提供对数据库事务的支持,非事务安全的,如果在应用中执行大量的select操作,应选择MYIASM引擎。锁的粒度是表级的,插入数据时,锁定整个表。支持全文索引类型相对简单性能优。不支持外键数据库三范式第一范式:1NF是对属性的

2021-03-11 13:56:38 428

转载 数据库锁

锁简介开始之前,先说一下DML、DDL区别DML(data manipulation language):它们是SELECT、UPDATE、INSERT、DELETE,就象它的名字一样,这4条命令是用来对数据库里的数据进行操作的语言DDL(data definition language):DDL比DML要多,主要的命令有CREATE、ALTER、DROP等,DDL主要是用在定义或改变表(TABLE)的结构,数据类型,表之间的链接和约束等初始化工作上,他们大多在建立表时使用DCL(Data Co

2021-03-10 20:06:16 409

原创 MySQL架构浅谈

MySQL基本架构MySQL可以分为Server层和存储引擎层两部分。Server层包括连接器、查询缓存、分析器、优化器、执行器等。所有的内置函数(如日期、时间、数学等函数)、所有的跨存储引擎功能(存储过程、触发器、视图等)都在这里。不同的存储引擎共用一个Server层。存储层,负责数据的存储和提取,架构模式是插件式。支持 InnoDB、MyISAM、Memory 等多个存储引擎。最常用的存储引擎是 InnoDB,从 MySQL 5.5.5 版本开始已是默认存储引擎。连接器连接器负责跟客户端建立

2021-03-09 09:27:09 164 3

原创 C++常见面试题

1、new、delete、malloc、free关系new和delete对应,malloc和free对应。new调用构造函数,delete会调用对象的析构函数。malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内

2021-03-08 14:43:59 255

原创 C++中的构造函数/拷贝构造函数

构造函数构造函数的两阶段执行1、初始化阶段;所有类型的成员都会在初始化阶段被初始化,即使该成员没有出现在构造函数的初始化列表中。(1)、初始化列表中显示初始化的成员,按照列表中圆括号内的值初始化。(2)、初始化列表中没有显式列出的成员,若是类成员,则调用该类型的默认构造函数初始化,若是内置类型或者复合类型,则按照变量初始化的原则,在局部作用域中的不做初始化,全局作用于中的初始化为0。注意:成员变量的初始化顺序,成员是按他们在类中出现的顺序初始化的.而不是按初始化列表的顺序.2、普通的计算阶段。

2021-03-08 13:15:54 235

原创 C++多态

什么是多态定义:在面向对象中,多态是指通过基类的指针或者引用,在运行时动态调用实际绑定对象函数的行为。与之相对应的编译时绑定函数称为静态绑定。多态是设计模式的基础,多态是框架的基础。静态多态是编译器在编译期间完成的,编译器会根据实参类型来选择调用合适的函数,如果有合适的函数就调用,没有的话就会发出警告或者报错;动态多态是在程序运行时根据基类的引用(指针)指向的对象来确定自己具体该调用哪一个类的虚函数。为什么要引入动态多态C++中的父子类间的赋值兼容:子类对象可以当作父类对象使用(兼容性);具体

2021-03-08 11:31:21 460

原创 leetcode 括号匹配相关题目

leetcode 20. 有效的括号给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。示例 1:输入:s = "()"输出:true示例 2:输入:s = "()[]{}"输出:true示例 3:输入:s = "(]"输出:false分析:此题借助栈,逐一分析即可。class Solution {public: bool isVali

2021-03-04 18:56:16 168 1

原创 Palo/Doris介绍

什么是Palo名字的由来:OLAP<>PALOPalo是百度大数据部数据团队所开发的一套面向大规模数据分析的并行数据库系统。主要目标是支撑稳定的、在线的、交互式的数据报表(Reporting)和数据多维分析(OLAP)服务。Palo 的一个很大的特色是:将会满足报表和OLAP分析这两类不同的需求。以前,报表(跑批处理任务,结果存MYSQL),数据分析(hadoop+hive)。现在可以用Palo搞定这两个。Palo在整个分析体系中所承担的是数据库的角色,只是这个数据库是并行的、面向分析的

2021-02-24 10:29:46 2247

原创 常见设计模式之单例设计模式

单例设计模式设计模式经典GoF定义的单例模式需要满足以下两个条件:1、保证一个类只创建一个实例。2、提供对该实例的全局访问点。如果系统有类似的实体(有且只有一个,且需要全局访问),那么就可以将其实现为一个单例。单例模式的优点:1、在内存中只有一个对象,节省内存空间2、避免频繁的创建销毁对象,可以提高性能3、避免对共享资源的多重占用4、可以全局访问实际工作中常见的应用举例:1、日志类,一个应用往往只对应一个日志实例。2、配置类,应用的配置集中管理,并提供全局访问。3、管理器,比如wi

2021-02-23 11:09:43 80

原创 用栈实现队列和用队列实现栈

用栈实现队列leetcode题目请你仅使用两个栈实现先入先出队列。队列应当支持一般队列的支持的所有操作(push、pop、peek、empty):实现 MyQueue 类:void push(int x) 将元素 x 推到队列的末尾int pop() 从队列的开头移除并返回元素int peek() 返回队列开头的元素boolean empty() 如果队列为空,返回 true ;否则,返回 false说明:你只能使用标准的栈操作 —— 也就是只有 push to top, peek/pop

2021-02-21 15:50:44 92

原创 python 发送短信 / 邮件

在介绍发送短信功能前,先说一说socketsocketsocket(简称 套接字) 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页、QQ 聊天、收发 email 等等。socket的编程思路TCP服务端:1、创建套接字,绑定套接字到本地IP与端口socket.socket(socket.AF_INET,socket.SOCK_STREAM) , s.bind()

2021-02-20 17:03:17 744

原创 python并行计算

python多线程是否真并行?Python有一个名为Global Interpreter Lock(GIL)的结构,全局解释器锁。Python的代码执行由Python虚拟机(也叫解释器主循环,CPython版本)来控制,python在设计之初,考虑在解释器的主循环中,同时只有一个线程在运行。即在任意时刻只有一个线程在解释器中运行。对Python虚拟机访问的控制由全局解释锁GIL控制,正是这个锁来控制同一时刻只有一个线程能够运行。也就是说,GIL确保每次只能执行一个“线程”。一个线程获取GIL,然后执行相

2021-02-20 16:52:29 1617 1

转载 微服务接口限流的设计与思考

微服务拆分之后,系统之间的调用关系错综复杂,平台的整体复杂熵升高,出错的概率、debug 问题的难度都高了好几个数量级。所以,服务治理便成了微服务的一个技术重点。服务治理本身的概念比较大,包括鉴权、限流、降级、熔断、监控告警等等,本文聚焦于限流,根据笔者的实战经验,分享一些对微服务接口限流的思考。本文试图讲清楚以下问题,如果您对限流也有类似的疑问或对某一话题感兴趣,欢迎阅读本文。微服务架构中没有接口限流,可能会遇到哪些问题?针对微服务接口限流,如何选择合适的限流算法?如何根据场景和性能要求权衡选择单

2021-02-18 15:10:28 366

原创 Disruptor和Kafka

disruptor和kafka区别disruptor,内存队列,使用场景一般在系统内部,提高在高并发的情况下系统的性能,一般作用于线程间的消息传递kafka,分布式消息队列,使用场景一般在系统和系统间的消息传递,吞吐量高,也适用于消息流数据处理的中间件队列队列有两种实现思路。一种是基于链表实现的链式队列,另一种是基于数组实现的顺序队列。不同的需求背景下,我们会选择不同的实现方式。无界队列,指的是队列的大小事先不确定,这种情况下,我们适合选用链表来实现队列。因为链表支持快速地动态扩容。有界队列,指

2021-02-18 15:06:57 1252

原创 进程和线程

进程(process)是一块包含了某些资源的内存区域。操作系统利用进程把它的工作划分为一些功能单元。进程中所包含的一个或多个执行单元称为线程(thread)。进程还拥有一个私有的虚拟地址空间,该空间仅能被它所包含的线程访问。线程只能归属于一个进程并且它只能访问该进程所拥有的资源。当操作系统创建一个进程后,该进程会自动申请一个名为主线程或首要线程的线程。主线程将执行运行时宿主, 而运行时宿主会负责载入CLR。应用程序(application)是由一个或多个相互协作的进程组成的。例如,Visual Stu

2021-02-18 14:39:52 149

原创 搜索引擎涉及的数据结构

系统介绍搜索引擎大致可以分为四个部分:搜集、分析、索引、查询。搜集,就是我们常说的利用爬虫爬取网页。分析,主要负责网页内容抽取、分词,构建临时索引,计算 PageRank 值这几部分工作。索引,主要负责通过分析阶段得到的临时索引,构建倒排索引。查询,主要负责响应用户的请求,根据倒排索引获取相关网页,计算网页排名,返回查询结果给用户。搜集搜索引擎把整个互联网看作数据结构中的有向图,把每个页面看作一个顶点。如果某个页面中包含另外一个页面的链接,那我们就在两个顶点之间连一条有向边。我们可以利用图的遍

2021-02-18 13:51:44 1102

原创 如何过滤垃圾短信

如果你是一名手机应用开发工程师,让你实现一个简单的垃圾短信过滤功能以及骚扰电话拦截功能,该用什么样的数据结构和算法实现呢?算法解析基于黑名单的过滤器我们可以维护一个骚扰电话号码和垃圾短信发送号码的黑名单。这个黑名单的收集,有很多途径,比如,我们可以从一些公开的网站上下载,也可以通过类似“360 骚扰电话拦截”的功能,通过用户自主标记骚扰电话来收集。对于被多个用户标记,并且标记个数超过一定阈值的号码,我们就可以定义为骚扰电话,并将它加入到我们的黑名单中。如果黑名单中的电话号码不多的话,我们可以使用散列

2021-02-18 11:33:14 1274

转载 位图与布隆过滤器

位图的概念位图的引出在谈什么是位图之前我们先来看一道"非常简单的题":有40亿个无符号的整型数据,现在给定一个目标数字,判断这个数字是否在这40亿数据中。题目看起来确实非常简单,有的同学说直接遍历一遍不就ok了吗?还有的同学给出了更高效的查找方式就是将这些数字排序然后进行二分查找。但是,这是有问题的,问题并不在于你搜索这个数字的效率问题,而是你在遍历也好排序也罢,这些数字在内存中放的下么?一个整型int就是4个字节,10亿个int差不多已经需要4G的内存了,40亿个int就是16G。所以这里方法行不通

2021-02-18 10:15:57 137

原创 数据结构-图-A*算法

A*算法概述算法背景:Dijkstra算法类似BFS算法,每次找到跟起点最近的顶点然后往外扩展。这种往外扩渣的思路有点盲目,可能会导致路线搜索方向跑偏。没有考虑顶点到终点的距离。比如如下从S点到T点,Dijkstra算法会先遍历1,2,3这些顶点。算法核心:估算顶点到终点的距离,增加启发函数/估价函数。算法对Dijkstra改造之处:1、顶点Vertex类定义多了x,y坐标,以及f(i)估价函数2、优先级队列构造方式不同,A算法根据f值f=g+h来构建优先级队列,其中g是起始点与顶点的距离,h

2021-02-09 20:31:23 661

原创 数据结构-图-Dijkstra算法

最短距离Dijkstra算法算法思想:使用广度优先搜索解决赋权有向图或者无向图的单源最短路径,最终得到一个最短路径树。算法初始化:1、最短距离数组dis,起点能直接到达的顶点相应的设置其值,起点不能直接达到的顶点的路径长度设为无穷大。2、最短路径顶点集合T,初始集合中只有起点。算法过程:1、从最短距离数组dis中选择最小值,将其加入T集合2、判断加入的该顶点是否可以到达其他顶点,如果可以到达的其他顶点的路径长度比起点直接到达短,那么更新这些顶点在dis中的值。3、继续从dis中选择最小值,重

2021-02-09 19:49:41 268

原创 C++初始化

数组初始化内置数据类型与类类型数组初始化区别1、对于内置数据类型元素的数组,必须使用()来显示指定程序执行初始化操作,否则程序不执行初始化操作int *pia = new int[10]; // 每个元素都没有初始化int *pia2 = new int[10] (); // 每个元素初始化为02、类类型元素的数组,无论是否使用(),都会自动调用其默认构造函数来初始化。string *psa = new string[10]; // 每个元素调用默认构造函数初始化string

2021-02-09 17:04:13 479

原创 数据结构-图-概念及DFS/BFS算法

图的概念图中包含两个元素:顶点vertex、边edge图的分类:1、有向图:边有方向,(比如微博)2、无向图:边没有方向(比如微信)3、带权图:每条边都有一个权重weight度的概念:无向图的度表示一个顶点有多少条边,有向图的度又分为入度和出度图的存储1、邻接矩阵:Adjaceny Matrix优点:简单,直观,获取两个顶点的关系时非常高效,计算方便可以将图的运算转换成矩阵之间的运算缺点:浪费存储空间2、邻接表存储:Adjacency List每个顶点对应一条链表,链表中存储的是与

2021-02-08 18:36:50 283

原创 数据结构-堆

堆的概念堆是一个完全二叉树,堆中的每一个节点的值都必须大于等于(或者小于等于)其子树中每个节点的值。大顶堆:每个节点的值都大于等于子树中每个节点值的堆小顶堆:每个节点的值都小于等于子树中每个节点值的堆堆的存储:使用数组存储比较节省空间堆的操作堆化1、插入数据自下而上,将数据插入到末尾,然后与父节点比较并进行调整,直到合适或者达到顶点2、删除堆顶元素自上而下,将末尾的数据移动到堆顶,然后与左右子节点进行比较并调整,直到合适或者到达叶子节点class Heap {private:

2021-02-08 16:55:59 175

原创 数据结构-二叉树-路径求和

二叉树-路径求和难度:简单问题:给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。说明: 叶子节点是指没有子节点的节点。示例:给定如下二叉树,以及目标和 sum = 27, 10 / \ 4 2 / / \ 11 11 1 / \ \ 6 2 1返回 true, 因为存在目标和为 27 的根节点到叶子

2021-02-05 17:44:28 820

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除