算法
文章平均质量分 63
sanqima
这个作者很懒,什么都没留下…
展开
-
求矩阵里的岛屿个数 C++或Go实现
给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。原创 2021-09-08 23:58:35 · 441 阅读 · 0 评论 -
单例模式的懒汉模式与饿汉模式之间的对比 C++
单例模式,是GOF 23种设计模式中的一种,有2种方法可以实现单例模式,分为懒汉式、饿汉式。它们的区别为,懒汉式,是在程序运行起来后调用getInstance()函数创建的,它需要加锁或使用std::call_one()方法,来保证唯一性。而饿汉式,是在程序编译时,单例对象就已经创建了,不需要加锁。原创 2021-09-07 16:30:36 · 299 阅读 · 0 评论 -
顺序查找、折半查找的区别与联系
顺序查找、折半查找,都是在一个线性表中,查找指定的关键字。它们的区别是,折半查找需要该线性表本身是有序的,而顺序查找则没有这个限制。原创 2021-09-05 15:55:11 · 3495 阅读 · 0 评论 -
直接插入排序、希尔排序、归并排序的区别与联系
直接插入排序、希尔排序,都属于插入排序,即每一趟选择一个关键字,把它插入到已排序序列的适当位置,直到整个序列都有序为止。而归并排序,比如,2路归并,是将2个子有序表,合并成一个新的有序表,这个新的有序表再跟其他字表合并,循环往复,两两归并,直到整个序列都成有序的。原创 2021-09-05 14:59:33 · 873 阅读 · 0 评论 -
直接选择排序、堆排序的联系与区别
在数据结构中,直接选择排序、堆排序,都属于选择排序,即每次从待排序的序列中选出最小的关键字,把它放到已排序的末尾,直到整个序列变成有序为止。对比它们的时间复杂度、空间复杂度等信息。原创 2021-09-05 10:07:03 · 527 阅读 · 0 评论 -
冒泡排序、快速排序的区别与联系
在数据结构中,冒泡排序和快速排序,都属于交换排序,即两两比较待排序的关键字,交换不满足次序的那些偶对,直到整个序列满足从小到大或从大到小的次序为止。当初始数据越接近有序时,推荐使用冒泡排序,这时候的时间复度接近于O(n);当初始数据越接近无序时,推荐使用快速排序,这时候的时间复制度接近于O(nlogn)。原创 2021-09-04 23:23:54 · 3201 阅读 · 0 评论 -
Java里的冒泡排序、直接选择排序和反转排序
冒泡排序:通过对数组中相邻元素的比较与位置交换,使得数值较小的元素如气泡一般逐渐往上"漂浮"到"水面"。反转排序的基本思想,将一个数组的头尾元素进行对调,即第1个元素与倒数第1个元素对调,第2个元素与倒数第2个元素,直到全部元素对调完成。原创 2021-04-28 19:22:13 · 271 阅读 · 0 评论 -
分苹果里的模运算思维
A和B这2个人,轮流拿苹果,每个人每次最少拿1个,最多拿5个,共有100个苹果,如果以最后一次拿到苹果的为冠军,请问有什么方法使A获得冠军? 方法:采用逆向思维+取模运算 假设最后只有5+1 = 6个苹果,这时,让B先拿,A后拿,A才能得冠军; 然而,100%6 = 16…4,现在有100个苹果,多了4个, 则需要A先拿多的4个,然后B拿n(1<=n<=5)个,A接着拿(6-n)个,即每次剩余的苹果个数能被6整除即可, 这样循环往复,最后一轮就是6个苹果,原创 2020-08-20 23:45:14 · 451 阅读 · 0 评论 -
单链表的创建、打印、删除和反转
单链表是一种非常重要的数据结构,它的优点是采用指针方式来增减结点,非常方便(它只用改变指针的指向即可,不需要移动结点);缺点是不能进行随机访问,只能顺着指针的方向进行顺序访问。 下面,介绍单例表的创建、打印和反转。 1、定义单链表struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {}}; 2、创建单链表ListNode* createLinkedList原创 2020-08-08 11:00:38 · 348 阅读 · 0 评论 -
测试二分查找、直接选择排序等算法的时间复杂度
一、二分查找 二分查找,又称折半查找,进行二分查找的前提是,该线性表或者树已经排好序,这里以线性表为例,假设线性表已经按关键字有序排列,且为递增有序排列。 二分查找的思路:设线性表R[left, right]是当前的查找区间,首先确定该区间的中点位置mid = (left+right)/2, 然后将待查的K值与R[mid].key进行比较,分原创 2020-07-25 16:05:34 · 1053 阅读 · 0 评论 -
判断整数是否为回文数
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。示例 1: 输入: 121 输出: true示例 2: 输入: -121 输出: false &n原创 2020-06-20 09:47:05 · 1241 阅读 · 0 评论 -
求每一轮滑动窗口里的最大值
给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回滑动窗口中的最大值。进阶: 你能在线性时间复杂度内解决此题吗?示例: 输入: nums = [1,3,-1,-3,5,3,6原创 2020-06-19 17:38:09 · 291 阅读 · 0 评论 -
STL模拟演讲比赛
某市举行一场演讲比赛(speech_contest),共有24个人参加,比赛共三轮,前两轮为淘汰赛,第三轮为决赛。 比赛方式:分组比赛,每组6个人,选手每次要随机分组,进行比赛; 第一轮分为4组,每组6个人,比如编号为100~123...原创 2020-01-05 09:57:36 · 317 阅读 · 0 评论 -
vector和deque的使用场景
vector使用场景:比如软件历史操作记录的存储,我们经常要查看历史记录;再比如,上一次的记录,上上次的记录,但却不会删除记录,因为记录是事实的描述。deque的使用场景:比如排队购票系统,对排队者的存储可以采用deque,支持头端的快速移除,尾端的快速添加。如果采用vector,则头端移除时,会移动大量的数据,速度慢。vector与deque的比较:3.1 vector.at()比deq...原创 2019-12-30 09:41:41 · 1791 阅读 · 2 评论 -
使用STL给选手打分
有5名选手,选手ABCDE,10个评委分别对每一名选手打分,去除最高分,去除评委中最低分,取平均分。 1、创建五名选手,放到vector中, 2、遍历vector容器,取出来每一个选手,执行for循环,可以把10个评委打分存到deq...原创 2019-12-28 15:14:38 · 225 阅读 · 0 评论 -
2个顺序表合并
在数据结构中,常常把2个有序的顺序表进行合并,这里以从小到大进行排序的有序表A、B合并为有序表C为例,代码如下:// SQListAI.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <stdlib.h>#define Maxsize 100typedef in...原创 2019-12-07 20:39:19 · 2555 阅读 · 0 评论 -
用栈对算术表达式求值
假设算术表达式只包含”+”、“-”、“*”、“/”、正整数和括号的合法数学表达式。求算术表达式值的过程是:先将算术表达式转换成后缀表达式(逆波兰式),然后对该后缀表达式求值。 1)将算术表达式exp转换成后缀表达式postexp; 2)对后缀表达式postexp求值。 完整代码如下:原创 2015-09-30 19:30:53 · 5180 阅读 · 0 评论 -
基于用户的协同过滤算法(Java实现或R语言实现
协同过滤的步骤是: 创建数据模型 —> 用户相识度算法 —>用户近邻算法 —>推荐算法。 基于用户的协同过滤算法在Mahout库中已经模块化了,通过4个模块进行统一的方法调用。首先,创建数据模型(DataModel),然后定义用户的相似度算法(UserSimilarity),接下来定义用户近邻算法(UserNeighborhood ),最后调用推荐算法(Recommender)完成计算过原创 2015-12-24 10:53:33 · 15435 阅读 · 5 评论 -
PCA方法的应用场景
PCA(Principal Component Analysis , PCA )是主成分分析方法,是一种较为粗糙的降维方法,对于小样本量的数据来说,它不如因子分析方法实用。但是当数据量较大时,主成分分析方法就有了用武之地了。PCA方法常用于人脸识别。 当样本数据成千上万时,维数上千时,PCA是非常有效的一种降维方法,它能起到的作用有两个:一个是节约存储空间,当数据量过多时,通过减少减少几个维度原创 2016-04-19 18:33:32 · 12574 阅读 · 0 评论 -
原假设与备择假设的联系与区别
1.假设的陈述 (1) 原假设与备择假设 在参数假设检验中,总体的分布类型已知,假设检验的目的是对总体参数进行检验,为此,研究者需要事先提出某个假设,才能根据样本统计量判断假设是否真实。在参数假设检验中,“假设”是对总体参数的具体数值所作的陈诉。为了使得作为证据的样本统计量必然支持且仅支持一个假设,要建立对于总体参数在逻辑上完备互斥的一对假设,即原假设(null hypothesis,原创 2016-05-03 22:22:03 · 66753 阅读 · 9 评论 -
Dpark与Spark的区别
Dpark 是Spark 的Python克隆版本,是一个用Python 实现的分布式计算框架,可以非常方便地实现大规模数据处理和低延时的迭代计算。该计算框架类似于MapReduce,但是比其更灵活,可以用Python 非常方便地进行分布式计算,并且提供了更多的功能,以便更好地进行迭代式计算。Dpark 由国内的豆瓣公司开发实现和负责维护,据豆瓣公司的描述,目前豆瓣公司内部的绝大多数数据分析都使用Dp原创 2016-04-20 15:28:29 · 5034 阅读 · 0 评论 -
什么是NoSQL数据库
NoSQL也称为Not only SQL,是对不同于传统的关系型数据库的数据库系统的统称,它具有非关系型、分布式、不提供ACID的数据库设计模式等特征。 NoSQL数据库和关系型数据库存在许多显著的不同,其中以最重要的不同点就是,NoSQL数据库不使用SQL作为自己的查询语言,而且数据的存储模式也不再是表格模型,NoSQL常常采用key-value格式或Document格式,来存储数据。原创 2016-04-20 15:47:53 · 7513 阅读 · 0 评论 -
Hive的适用场景
Hive是建立在Hadoop之上的数据仓库软件工具,它提供了一系列的工具,帮助用户对大规模的数据进行提取、转换和加载,即通常所称的ETL(Extraction,Transformation,and Loading)操作。Hive可以直接访问存储在HDFS或者其他存储系统(如Hase)中的数据,然后将这些数据组织成表的形式,在其上执行ETL操作。 Hive定义了简单的类SQL查询语言,称为Hiv原创 2016-04-20 16:17:49 · 10637 阅读 · 0 评论 -
Ackerman的递归与非递归算法
已知Ackerman函数的定义如下: akm(m,n)=⎧⎩⎨n+1,akm(m−1,1),akm(m−1,akm(m,n−1)),m = 0m≠0,n=0m≠0,n≠0akm(m,n)= \begin{cases}n+1, & \text{m = 0} \\akm(m-1,1),& m \neq 0, \, n = 0 \\akm(m-1,akm(m,n-1)),& m \ne原创 2015-11-06 16:46:15 · 14653 阅读 · 5 评论 -
Eclat算法Python实现
Eclat算法是Zaki博士于2000年提出了来的,利用垂直数据库和数据格,采用前缀等价关系划分搜索空间,该算法只需要1次扫描数据库,利用数据垂直表示形式的优势通过交叉计数来计算支持度,能够很快地挖掘出频繁集。 下面是Eclat算法的Python实现代码:原创 2016-06-01 22:00:09 · 6898 阅读 · 0 评论 -
KNN算法中常用的距离计算公式
KNN,英文全称为K-nearst neighbor,中文名称为K近邻算法,它是由Cover和Hart在1968年提出来的。 KNN算法流程: 输入:训练数据集 T=(x1,y1),(x2,y2),...,(xN,yN)T={(x_1,y_1),(x_2,y_2),...,(x_N,y_N)} 其中,xi∈X⊆Rnx_i \in \mathcal{X} \subseteq R原创 2016-04-28 19:52:33 · 47253 阅读 · 3 评论 -
机器学习中常见的字母解析及MarkDown代码
在机器学习中,有很多符号,下面介绍这些符号的含义,以及它对应的MarkDown代码。 1. 实数集RR$R$ 2.n维空间向量,n维欧式空间, RnR^n$R^n$ 3. 输入空间 XX ,输出空间YY 或者输入空间 X\mathcal{X} , 输出空间 Y\mathcal{Y}$X$$Y$ 4. 输入,实例x∈Xx \in \mathcal{X}; 输出,标记y∈Yy原创 2016-04-28 17:31:04 · 5056 阅读 · 1 评论 -
在Excel里根据参数生成图片
Excel有根据参数生成柱形图、饼图和折线图的功能。下面,介绍在WPS Excel2016中,根据表格里的参数动态的生成折线图。 1. 打开WPS Excel2016,在单元格里分别输入A组:0.62 0.56 0.53 0.51 0.49 0.45 0.43 0.4,B组:0.54 0.5 0.48 0.46 0.43 0.39原创 2016-04-26 22:38:36 · 5609 阅读 · 1 评论 -
模式匹配(第一篇
模式匹配的定义: 设有主串s和子串t,子串t定位是指在主串s中找到一个与子串t相等的子串。通常把主串s称为目标串,把子串t称为模式串,因此定位也称为模式匹配。匹配成功,是指在目标串ss中有一个子串等于模式串t;匹配失败,是指目标串s不存在子串等于模式串t。 关于模式匹配,常见的算法有Brute-Force(BF)算法、KMP算法。 BF算法的思想是:从目标串s="s0原创 2015-10-05 22:33:59 · 1202 阅读 · 0 评论 -
模式匹配(第二篇KMP算法
KMP算法是由D.E.Knuth、J.H.Morris和V.R.Pratt等人共同提出的,所以称为Knuth-Morris-Pratt算法,简称为KMP算法。KMP算法分析了模式串中隐藏的有利于模式匹配的信息。这种信息就是模式串中的“部分匹配”信息,或者,模式串中某个位置“前串等于后串”的最大长度信息。 模式串t的next[j]数组公式如下: next[j]=⎧⎩⎨Max{k|0<k<j原创 2015-10-05 22:32:23 · 704 阅读 · 0 评论 -
求二叉树的深度、宽度和叶子结点数
二叉树的深度,也叫二叉树的高度,二叉树的深度等于从根结点到叶子结点的最长路径加1。用递归的观点来看,二叉树的深度,等于其最大左右子树的深度加1,而每个左子树(右子树)又可以分解为次左子树+次右子树,它们是深度也是最大子树深度加1。也就是二叉树深度的递归模型f(b)如下:原创 2015-10-04 22:07:52 · 10719 阅读 · 0 评论 -
将链串s中的所有子串"abc"删除
用p、q、r、t分别指向链串s的连续4个结点,p首先指向头结点。当q、r、t所指结点的值分别为’a’、’b’、’c’时,删除这3个结点并释放其空间,在后移q、r和t指针;否则p、q、r和t指针分别后移一个结点,算法如下: //删除子串"abc"void delSub(LiString *&s){ int n=0; LiString *p=s->next,*q,*r,*t;原创 2015-10-02 21:13:54 · 2717 阅读 · 0 评论 -
迷宫求解(使用队列
在迷宫中,从入口到出口往往有一条或者多条最短路径。可以使用队列来求解迷宫的最短路径,使用队列时,搜索路径是一层一层向前推进,第一次找到出口是搜索的层数最少,这种搜索方法与广度优先算法类似。 使用队列Qu记录走过的方块,该队列的结构如下:struct{ int i; //方块的行号 int j; //方块的列号 int pre; //前一方块在队列中的下标}Qu原创 2015-10-01 19:54:53 · 9783 阅读 · 6 评论 -
用循环单链表来表示队列
假设用一个循环单链表来表示队列,并且只设置一个指针rear指向队尾结点,但不设置头指针,设计出相应的初始化、入队、出队和判断队列是否为空的算法。 方法一:使用不带头结点的循环单链表 1.1)队空条件 rear==NULL 1.2) 入队, 在*rear结点之后插入结点,并让rear指向该结点 1.3) 出队,删除*rear结点之后的一个结点原创 2015-10-01 22:07:50 · 24977 阅读 · 8 评论 -
逆波兰表达式
逆波兰表达式,也叫后缀表达式,比如,表达式”(56-20)/(4+2)”的逆波兰表达式为“56 20 - 4 2 + /”。将算术表达式用一颗二叉树表示,然后后序遍历该二叉树,即可得到它的逆波兰表达式。如图(1)所示: 可以用栈将算法表达式转化为逆波兰式,代码如下: #include <stdio.h>#define MaxSize 100//符号栈struct{ c原创 2015-09-30 19:18:50 · 850 阅读 · 0 评论 -
用顺序表求集合的交集、并集和差集
使用顺序表时, 需要定义一个数组来存储顺序表中的所有元素和定义一个整型变量来存储顺序表的长度。假定数组用data[MaxSize]表示,长度整型变量用length表示,并采用结构体类型表示,元素类型采用通用类型标识符ElemType,则顺序表的存储结构定义如下: #define MaxSize 50typedef int ElemType;typedef struct{ ElemTyp原创 2015-09-26 19:07:13 · 36168 阅读 · 12 评论 -
单链表中结点删除、排序与反转
在单链表中,假定每个结点的类型用LinkListLinkList表示,它应包括存储元素的数据域,这里用datadata表示,其类型用通用类型标识符ElemTypeElemType表示,还包括存储元素位置的指针域,这里用next表示。LinkListLinkList类型的定义如下: typedef int ElemType;typedef struct LNode{ //定义单链表结点类型原创 2015-09-27 22:17:02 · 2863 阅读 · 0 评论 -
算法的时间复杂度
在算法中,以频次最高的语句作为时间复杂度的度量标准。一般不必精确地计算出算法的时间复杂度,只要估计出相应的数量级即可,比如O(1)、O(log2n)、O(n)、O(n2)O(1)、O(log_2n)、O(n)、O(n^2) 等。 设m为频繁语句(也叫循环语句,或者递归语句)执行的次数,n为问题的规模,则 m=f(n)=O(f(n))m=f(n) = O(f(n)) 即 执行次数mm原创 2015-09-25 16:33:04 · 2645 阅读 · 3 评论 -
连通图里的深度优先和广度优先遍历
从图中的某个顶点出发,按照某种搜索方法沿着图的边访问图中的所有顶点,使得每个顶点仅被访问一次,这个过程称为图的遍历。图的遍历有两种:深度优先遍历和广度优先遍历。 图分为连通图和非连通图,这里主要讨论连通图的深度、广度优先遍历。 一、深度优先遍历 图的深度优先遍历类似于树的先序遍历,它的基本思想是:首先访问指定的起始顶点vv, 然后选取与vv邻接的未被访问的任意一个顶点ww, 访问之原创 2015-10-05 21:31:20 · 12749 阅读 · 0 评论 -
克鲁斯卡尔算法(Kruskal)
克鲁斯卡尔(Kruskal)算法是一种按权值的递增次序选择合适的边来构造最小生成树的方法。假设G=(V,E)G=(V,E)是一个具有nn个顶点的带权连通图,T=(U,TE)T=(U,TE)是G的最小生成树,则构造最小生成树的步骤如下: 1) 设置UU的初值等于VV(即包含有GG中的全部顶点), TETE的初值为空集(即图TT中每一个顶点都构成一个分量)。 2) 将图GG中的边按权值从小原创 2015-10-05 21:59:43 · 1995 阅读 · 0 评论