白话机器学习
10年IT从业经验,人工智能高级算法工程师、优快云博客专家、阿里云专家、《2023博客之星马龄赛道11-15年》第一名、《2023博客之星,城市赛道》长春TOP1,优快云付费资源项目实践专家
展开
-
减少 “重复代码” 的技巧有哪些?
第一种代码重复是,有多个并行的类实现相似的代码逻辑。我们可以考虑提取相同逻辑在父类中实现,差异逻辑通过抽象方法留给子类实现。使用类似的模板方法把相同的流程和逻辑固定成模板,保留差异的同时尽可能避免代码重复。同时,可以使用 Spring 的 IoC 特性注入相应的子类,来避免实例化子类时的大量 if…else 代码。第二种代码重复是,使用硬编码的方式重复实现相同的数据处理算法。原创 2024-06-23 21:07:50 · 123 阅读 · 0 评论 -
Spring Boot 自动装配原理
进入@Configuration,发现@Configuration核心是@Component,说明Spring的配置类也是Spring的一个组件。可以看到它是由 @AutoConfigurationPackage,@Import(EnableAutoConfigurationImportSelector.class)这两个而组成的,我们先说@AutoConfigurationPackage,他是说:让包中的类以及子包中的类能够被自动扫描到spring容器中。他是通过工厂的方式创建的。原创 2024-06-23 21:06:49 · 93 阅读 · 0 评论 -
Transactional 事务注解详解
所谓事务的传播行为是指,如果在开始当前事务之前,一个事务上下文已经存在,此时有若干选项可以指定一个事务性方法的执行行为。在。原创 2024-06-23 21:05:40 · 99 阅读 · 0 评论 -
Redis 如何实现库存扣减操作和防止被超卖?
电商当项目经验已经非常普遍了,不管你是包装的还是真实的,起码要能讲清楚电商中常见的问题,比如库存的操作怎么防止商品被超卖基于redis实现扣减库存的具体实现在日常开发中有很多地方都有类似扣减库存的操作,比如电商系统中的商品库存,抽奖系统中的奖品库存等。在上面的第一种和第二种方式都是基于数据来扣减库存。原创 2024-06-23 21:04:49 · 176 阅读 · 0 评论 -
10大经典排序算法的讲解及Python代码实现,特别适合算法初学者,建议收藏
快速排序的名字起的是简单粗暴,因为一听到这个名字你就知道它存在的意义,就是快,而且效率高!插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。和选择排序一样,归并排序的性能不受输入数据的影响,但表现比选择排序好的多,因为始终都是 O(nlogn) 的时间复杂度。原创 2024-01-04 10:41:21 · 1120 阅读 · 1 评论 -
万字详解18 种传统统计学中的经典数据分析方法,适合收藏
描述统计是通过图表或数学方法,对数据资料进行整理、分析,并对数据的分布状态、数字特征和随机变量之间关系进行估计和描述的方法。描述统计分为集中趋势分析和离中趋势分析和相关分析三大部分。集中趋势分析:集中趋势分析主要靠平均数、中数、众数等统计指标来表示数据的集中趋势。例如被试的平均成绩多少?是正偏分布还是负偏分布?离中趋势分析:离中趋势分析主要靠全距、四分差、平均差、方差(协方差:用来度量两个随机变量关系的统计量)、标准差等统计指标来研究数据的离中趋势。例如,我们想知道两个教学班的语文成绩中,哪个班级内的成绩分原创 2024-01-01 20:23:43 · 1445 阅读 · 0 评论 -
线索二叉树实现
#include #include typedef char ElemType;// 线索存储标志位// Link(0):表示指向左右孩子的指针// Thread(1):表示指向前驱后继的线索typedef enum {Link, Thread} PointerTag;typedef struct BiThrNode{ char data; struct BiThrNod转载 2013-06-04 20:23:33 · 573 阅读 · 0 评论 -
树结构
http://blog.fishc.com/2307.html/2树结构 之前我们一直在讨论的是一对一的线性结构,无论是线性表也好,栈和队列也罢,都是2P模式。可现实生活中,3P、4P等现象比比皆是,例如一个年轻的妈妈生了4个孩子,而每个孩子都不像他们的爸爸,那么这类情况我们用线性结构的形式就不足以描述了! 所以我们需要研究这种一对多的数据结构:转载 2013-06-04 15:11:57 · 593 阅读 · 0 评论 -
树的存储结构2
孩子表示法 我们这次换个角度来考虑,由于树中每个结点可能有多棵子树,可以考虑用多重链表来实现。就像我们虽然有计划生育,但我们还是无法确保每个家庭只养育一个孩子的冲动,那么对于子树的不确定性也是如此。 1. 右图中,树的度为( )2. 如果我们用“孩子表示法”,聪明的鱼油可以想出多少种可行方案? 这里我们不限制大家的答案,小甲鱼转载 2013-06-04 15:48:16 · 565 阅读 · 0 评论 -
二叉树3
原文地址:http://blog.fishc.com/2429.html二叉树的存储结构 树结构在计算机中的存储形式很多,可谓天马行空任你创造,只要能够按照要求完成任务即可。在前边的演示中,我们发觉很难单单只用顺序存储结构或者链式存储结构来存放。但是二叉树是一种特殊的树,由于它的特殊性,使得用顺序存储结构或链式存储结构都能够简单实现。 二叉树转载 2013-06-04 16:25:46 · 624 阅读 · 0 评论 -
树的存储结构1
树的存储结构 不好意思哈,这节课又需要大家搞脑子了。对于知识,你理解的越多,需要记住的就越少!上节课我们简单的介绍了树结构的强大,这节课我们来关心一下如何在内存中安排树这种结构的存放。 说到存储结构,就会想到我们前面章节讲过的顺序存储和链式存储两种基本结构。对于线性表来说,很直观就可以理解,但对于树这种一对多的结构,我们应该怎么办呢?转载 2013-06-04 15:38:07 · 677 阅读 · 0 评论 -
二叉树1
原文地址:http://blog.fishc.com/2399.html二叉树的定义 世上树有万千种,唯有二叉课上讲。这里的二叉是二叉树,因为二叉树使用的范围最广,最具有代表意义,因此我们重点讨论二叉树。二叉树(Binary Tree)是n(n>=0)个结点的有限集合,该集合或者为空集(空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树的二转载 2013-06-04 16:05:15 · 692 阅读 · 0 评论 -
二叉树的遍历
二叉树的遍历(traversing binary tree)是指从根结点出发,按照某种次序依次访问二叉树中所有结点,使得每个结点被访问一次且仅被访问一次。这里有两个关键词小甲鱼给加红了:次序和访问 二叉树的遍历次序不同于线性结构,线性结构最多也就是分为顺序、循环、双向等简单的遍历方式。树的结点之间不存在唯一的前驱和后继这样的关系,在访问一个结点后,下一个被访问的结点转载 2013-06-04 19:09:28 · 561 阅读 · 0 评论 -
字符串——KMP算法实现
// KMP.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include #include #include #include using namespace std;void GetNext(const char *strShort,int *next,int i原创 2013-06-03 21:49:33 · 762 阅读 · 0 评论 -
字符串——Brute Force实现
#include #include using namespace std;int BFStringCmpare(const char *strLong,const char *strShort,int iLong,int iShort){ if(iLong<iShort) return -1; int ipos=0; int i,j; for(i=0;i<iLong;i++)原创 2013-06-03 10:34:28 · 785 阅读 · 0 评论 -
字符串
原文地址:http://blog.fishc.com/2258.html/2字符串 以前的计算机刚被发明的时候,主要作用是做一些科学和工程的计算工作,科学家发明计算机的时候压根儿不可能想到后人还可以用来看毛片。刚开始的计算机都是处理数值工作,后来引入了字符串的概念,计算机开始可以处理非数值的概念了(当然原理还是用数值来模拟非数值,通过ASCII码表)。转载 2013-06-03 09:50:25 · 687 阅读 · 0 评论 -
字符串——KMP算法1
原文:http://blog.fishc.com/2274.html/2KMP算法 相信很多鱼油(包括小甲鱼自己)在刚开始接触KMP算法的时候始终是丈二和尚摸不着头脑,要么完全不知所云,要么看不懂书上的解释,要么自己觉得好像心里了解KMP算法的意思,却说不出个究竟,所谓知其然不知其所以然是也。 KMP算法对大多数初学者来言是一项比较巨大的考验,特别是自学算法转载 2013-06-03 10:41:47 · 726 阅读 · 0 评论 -
队列——顺序存储结构,循环队列
http://blog.fishc.com/2155.html队列的顺序存储结构 为什么小甲鱼上节课说队列的实现上我们更愿意用链式存储结构来存储?我们先按照应有的思路来考虑下如何构造队列的顺序存储结构,然后发掘都遇到了什么麻烦。我们假设一个队列有n个元素,则顺序存储的队列需建立一个大于n的存储单元,并把队列的所有元素存储在数组的前n个单元,数组下标为0的转载 2013-05-31 11:27:16 · 1473 阅读 · 0 评论 -
八皇后问题
八皇后问题(递归解法) 八皇后问题 八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题(这节课小甲鱼先用递归算法来解)。 该问题是十九世纪著名的数学家高斯1850年提出: 在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。转载 2013-05-31 16:13:31 · 842 阅读 · 0 评论 -
汉诺塔
汉诺塔 一位法国数学家曾编写过一个印度的古老传说:在世界中心贝拿勒斯的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针转载 2013-05-31 15:56:21 · 1084 阅读 · 0 评论 -
折半查找法
如果从文件中读取的数据记录的关键字是有序排列的,则可以用一种效率比较高的查找方法来查找文件的记录,这就是折半查找法,又称为二分法搜索。折半查找的基本思想是:减小查找序列的长度,分而治之地进行关键字的查找。折半查找的实现过程是:先确定待查找记录的所在范围,然后逐渐缩小这个范围,直到找到该记录或查找失败(查无该记录)为止。例如有序列:1 1 2 3 5 8 13 21 34转载 2013-05-31 15:11:26 · 1248 阅读 · 0 评论 -
递归和分治
递归定义 在高级语言中,函数自己调用和调用其他函数并没有本质的不同。我们把一个直接调用自己或通过一系列的调用语句间接地调用自己的函数,称作递归函数。 不过,写递归程序最怕的就是陷入永不结束的无穷递归中。切记,每个递归定义必须至少有一个条件,当满足这个条件时递归不再进行,即函数不再调用自身而是返回值。比如之前我们的Fbi函数结束条件是:i转载 2013-05-31 15:10:08 · 686 阅读 · 0 评论 -
二叉树2
二叉树的性质 二叉树的性质一:在二叉树的第i层上至多有2^(i-1)个结点(i>=1)这个性质其实很好记忆,考试的时候懂得画出二叉树的图便可以推出 二叉树的性质二:深度为k的二叉树至多有2^k-1个结点(k>=1)这里一定要看清楚哦,是2^k再-1,老方法理解! 二叉树的性质三:对任何一棵二叉树T,如果其终端结点数为n0,度为转载 2013-06-04 16:14:42 · 604 阅读 · 0 评论 -
二叉树的建立和遍历
#include #include typedef char ElemType;typedef struct BiTNode{ char data; struct BiTNode *lchild, *rchild;} BiTNode, *BiTree;// 创建一棵二叉树,约定用户遵照前序遍历的方式输入数据CreateBiTree(BiTree *T){ char c;转载 2013-06-04 20:02:18 · 542 阅读 · 0 评论 -
线索二叉树
原文:http://blog.fishc.com/2454.html线索二叉树 为什么需要线索二叉树呢?我想正如程序猿发觉单链表并不总能满足他们设计的程序某些要求的时候,发明了双向链表来弥补一样,线索二叉树也是在需求中被创造的! 那普通的二叉树到底有什么缺陷让我们发指呢?一,浪费空间二,浪费时间三,浪费青春 来转载 2013-06-04 20:12:53 · 562 阅读 · 0 评论 -
两种洗牌算法比较
// 洗牌算法.cpp : Defines the entry point for the console application.////算法1原理:/*1.用一个整型数组记录各个位置是否已经放置了数,如果放置了则不为0,否则为0。所以在算法开始的时候,初始化此数组每个元素的值都为0.2.每次产生一个0-53之间的数,看这个位置是否放置了数,如果已经放置了,则继续采用同样的方法找一个原创 2013-07-04 16:37:51 · 896 阅读 · 0 评论 -
轻松搞定KMP算法
对于字符串的匹配,也就是查找是否在主串中包含一个特定的子串,我们能想到的最简单直观的算法就是BF算法。在BF(Brute Force)算法中,我们的处理方式是:1.先在主串中找到一个字符跟子串的第一个字符相同2.如果是在主串的位置i上找到了这个字符,然后主串和子串依次向后移动,对子串剩下的字符串进行匹配。如果匹配成功则返回位置i。3.否则从位置i的下一个位置开始,继续重复步骤1,找原创 2013-06-04 15:06:31 · 930 阅读 · 0 评论 -
字符串的最长公共子序列问题
// 最长公共子序列问题.cpp : Defines the entry point for the console application.///*问题:给出两个字符串,找出它们的最长公共子序列什么是最长公共子序列?最长公共子序列,英文缩写为LCS(Longest Common Subsequence)。其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条原创 2013-06-28 14:57:42 · 1339 阅读 · 0 评论 -
二元查找树转有序双向链表
// 二元查找树转有序的双向链表.cpp : Defines the entry point for the console application.////题目:把二元查找树转变成排序的双向链表//要求:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。//要求不能创建任何新的结点,只调整指针的指向。/* 将下面这个二元查找树转化成 10 / \ 6原创 2013-06-27 10:20:11 · 1030 阅读 · 0 评论 -
二元查找树转有序的双向链表
// 二元查找树转有序的双向链表.cpp : Defines the entry point for the console application.////题目:把二元查找树转变成排序的双向链表//要求:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。//要求不能创建任何新的结点,只调整指针的指向。/* 将下面这个二元查找树转化成 10 / \原创 2013-06-27 10:24:23 · 841 阅读 · 0 评论 -
Trie字典树
Trie树也称字典树,因为其效率很高,所以在在字符串查找、前缀匹配等中应用很广泛,其高效率是以空间为代价的。一.Trie树的原理 利用串构建一个字典树,这个字典树保存了串的公共前缀信息,因此可以降低查询操作的复杂度。 下面以英文单词构建的字典树为例,这棵Trie树中每个结点包括26个孩子结点,因为总共有26个英文字母(假设单词都是小写字母组成)。转载 2013-06-21 10:52:44 · 599 阅读 · 0 评论 -
一个Trie字典树的简单实现
// 字典树.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include using namespace std;const int Max=26;typedef struct Node{ bool isStr; Node *next[Max];}TrieNode原创 2013-06-21 10:56:46 · 1325 阅读 · 0 评论 -
某海量用户网站,用户拥有积分,积分可能会在使用过程中随时更新。现在要为该网站设计一种算法,在每次用户登录时显示其当前积分排名。用户最大规模为2亿;积分为非负整数,且小于100万。
http://www.mianwww.com/html/2012/11/17432.htmlPS: 据说这是迅雷的一道面试题,不过问题本身具有很强的真实性,所以本文打算按照真实场景来考虑,而不局限于面试题的理想环境。存储结构首先,我们用一张用户积分表user_score来保存用户的积分信息。表结构:示例数据:下面的算法会基于这个基本的表结转载 2013-06-20 16:16:43 · 2342 阅读 · 0 评论 -
给定一个字符串,里面会有连续重复出现的字符,比如aabbbcdde,要求把连续重复的字符只保留一个,比如上面的字符串处理之后就变成了abcde。
void WipeOutRepeatStr(char* str){ char *p,*q; p=q=str; while(*q!='\0') { q++; cout<<*p; while(*p==*q) { q++; } p=q; }}原创 2013-06-20 16:56:10 · 2558 阅读 · 0 评论 -
图的邻接矩阵表示法及广度优先遍历
// 广度优先遍历.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include #include using namespace std;#define MAXVEX 10#define INFINITY 65535typedef struct{ char ve原创 2013-06-18 16:41:47 · 1246 阅读 · 0 评论 -
图的存储结构(邻接表)
原文:http://blog.fishc.com/2523.html邻接表(无向图) 邻接矩阵看上去是个不错的选择,首先是容易理解,第二是索引和编排都很舒服~但是我们也发现,对于边数相对顶点较少的图,这种结构无疑是存在对存储空间的极大浪费。邻接表(有向图) 因此我们可以考虑另外一种存储结构方式,例如把数组与链表结合一起来存储,这种方式转载 2013-06-08 20:32:01 · 1288 阅读 · 0 评论 -
C++ 生成三次贝塞尔曲线
// 三次贝塞尔.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include #include #include #define NUM_STEPS 30 //越大,曲线越密,越逼近using namespace std;class CvPoint{public原创 2013-06-08 11:21:54 · 6464 阅读 · 4 评论 -
哈夫曼编码原理
哈弗曼编码几乎是所有压缩算法的基础,其实这个算法并不复杂,简单的理解就是,如何用更短的bit来编码数据。 我们知道普通的编码都是定长的,比如常用的ASCII编码,每个字符都是8个bit:字符编码A00101001B00101010C00101011…… 这样,计算机就能很方便的把转载 2013-06-07 20:52:53 · 3125 阅读 · 0 评论 -
普里姆最小生成树算法
// Prim.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include using namespace std;const int GraphSize=10;const int INFINITY=65535;class MGraph{public: MGra原创 2013-06-19 20:46:59 · 968 阅读 · 0 评论 -
赫夫曼树
赫夫曼树 在数据膨胀、信息爆炸的今天,数据压缩的意义不言而喻。谈到数据压缩,就不能不提赫夫曼(Huffman)编码,赫夫曼编码是首个实用的压缩编码方案,即使在今天的许多知名压缩算法里,依然可以见到赫夫曼编码的影子。 另外,在数据通信中,用二进制给每个字符进行编码时不得不面对的一个问题是如何使电文总长最短且不产生二义性。根据字符出现频率,利用赫夫曼编码可以构造出一种不转载 2013-06-04 20:36:14 · 688 阅读 · 0 评论