算法

字符串匹配KMP算法

亡梦爱人 提交于 2020-01-14 11:06:19
字符串匹配KMP算法   KMP 算法是 D.E.Knuth、J,H,Morris 和 V.R.Pratt 三位神人共同提出的,称之为 Knuth-Morria-Pratt 算法,简称 KMP 算法。该算法相对于 Brute-Force(暴力)算法有比较大的改进,主要是消除了主串指针的回溯,从而使算法效率有了某种程度的提高。 一、问题描述 给定一个主串S及一个模式串P,判断模式串是否为主串的子串;若是,返回匹配的第一个元素的位置(序号从1开始),否则返回0;如S=“abcd”,P=“bcd”,则返回2;S=“abcd”,P=“acb”,返回0。 二、KMP算法 上面说道 KMP 算法主要是通过消除主串指针的回溯来提高匹配的效率的,那么,它是则呢样来消除回溯的呢?就是因为它提取并运用了加速匹配的信息! 朴素算法中,P的第j位失配,默认的把P串后移一位。 但在前一轮的比较中,我们已经知道了P的前(j-1)位与S中间对应的某(j-1)个元素已经匹配成功了。这就意味着,在一轮的尝试匹配中,我们get到了主串的部分内容,我们能否利用这些内容,让P多移几位(我认为这就是KMP算法最根本的东西),减少遍历的趟数呢?答案是肯定的。再看下面改进后的动图:      这个模拟过程即KMP算法,每次失配,S串的索引i不动,P串的索引j定位到某个数。T(n)=O(n+m),时间效率明显提高 而这

算法笔记------C/C++快速入门

拥有回忆 提交于 2020-01-14 09:06:17
C/C++快速入门    C语言语言相对于C++以此来作为上机算法题编程语言确实有些语句过于累赘,有些题目的解决的有些复杂,但是对于算法消耗时间有要求的题目,C语言往往表现的更好,所以我们上机算法题解决上,我们可以统筹二者的优点,因为C++向下兼容C语言,所以我们可以将文件命名为cpp文件,这样可以使用一些C++简便库来方便问题解决,也可以在一些语句上面用C语言的表达方式来节省时间。 C++中的cin和cout与C语言中scanf和printf区别 //C版本 # include <stdio.h> int main ( ) { int a , b ; scanf ( "%d%d" , & a , & b ) ; printf ( "%d" , a + b ) ; return 0 ; } //C++版本 # include <iostream> int main ( ) { int a , b ; cin << a << b ; cout << a + b ; return 0 ; }    C++中cin和cout比C语言中scanf和printf写法简便很多,但是运行时间效率上C语言明显占优势,所以我推荐尽量写scanf和printf。 2.1基本数据类型 2.1.1变量定义    定义变量是变量类型+变量名,也可以定义变量的同时赋初值。 变量类型 变量名; 变量类型 变量名

0-1背包自顶向下非递归算法

三世轮回 提交于 2020-01-14 09:00:34
//0-1背包动态算法 //给出两点地杰斯特拉算法满足动态规划算法的需求 // A 到 b c d e f h 已知学生家的距离,求老师家到每个学生家的最短路径,好让王老师做出计划 // 写出0-1背包自顶向下的非递归动态规划算法 # include <iostream> # include <string> using namespace std ; int n ; int * input1 ( ) { cout << "请输入物品总数n:" << endl ; cin >> n ; int * w = new int [ n ] ; cout << "请输入个物品的重量:" << endl ; for ( int i = 0 ; i < n ; i ++ ) { cin >> w [ i ] ; } return w ; } int * input2 ( ) { int * v = new int [ n ] ; cout << "请输入各个物品的价值:" << endl ; for ( int i = 0 ; i < n ; i ++ ) cin >> v [ i ] ; return v ; } int min ( int a , int b ) { if ( a < b ) return a ; else return b ; } int max ( int a ,

推荐系统之概述

只愿长相守 提交于 2020-01-14 06:34:07
1.什么是推荐系统 1.推荐系统的背景 (1)随着信息技术和互联网的发展,人们逐渐从信息匮乏的时代走入了信息过载的时代。在这个时代,无论是信息消费者还是生产者都遇到了很大的挑战 (2)无明确需求 (3)信息过载 由此引出推荐系统的概念: 从上图中可以看到,左边是没有明确需求的用户,但是商品信息量过大,推荐系统就是在大量商品中找到用户喜欢的商品推荐给用户,推荐系统是连接用户和商品的一个桥梁。 作用,它能解决信息过载问题,使得消费者和生产者达到一个共鸣的状态。 2.推荐系统和搜索引擎 1.相同点: 帮助用户快速发现有用信息的工具 2.不同点: 搜索引擎需要用户主动提供准确的关键词来寻找信息 推荐系统不需要用户提供明确的需求,而是通过分析用户的历史行为给用户的兴趣建模 3.关系: 搜索引擎满足了用户有明确目的时的主动查找需求 推荐系统能够在用户没有明确目的的时候帮助他们发现感兴趣的新内容 3.推荐系统的工作原理 以看电影为例: 1.社会化推荐:向朋友咨询,即让好友给自己推荐物品 2.基于内容的推荐:打开搜索引擎,输入自己喜欢的演员名,然后看看返回结果中还有什么电影是自己没有看过的。 3.基于流行度的推荐:查看排行榜 4.基于协同过滤的推荐:找到和自己历史兴趣相似的一群用户,看看他们最近在看什么电影。 2.推荐系统的设计 1.需求分析和用户调研 目标用户: 新用户->兴趣未知,着重促销

WAV格式中常见的压缩编码

僤鯓⒐⒋嵵緔 提交于 2020-01-14 05:52:36
WAV 格式中常见的压缩编码 (compression code) WAV为微软公司(Microsoft)开发的一种声音文件格式,它符合RIFF(Resource Interchange File Format)文件规范,用于保存Windows平台的音频信息资源,被Windows平台及其应用程序所广泛支持,该格式也支持MSADPCM,CCITT A LAW等多种压缩运算法,支持多种音频数字,取样频率和声道。标准格式化的WAV文件采样频率为44100Hz,采样比特为16bit,因此标准的(这里说标准,只是一种广泛采用的波形音频方案)WAV文件和CD音频格式一样,也是44.1KHz的取样频率,16位量化数字,在声音文件质量和CD音频相差无几。  下面由 useiee 详细介绍一下WAV格式文件常见的10种压缩码形式(Compression Code)。[1]  1. PCM/uncompressed   Pulse Code Modulation,脉码调制信号。是模拟音频信号经模数转换(A/D变换)直接形成的二进制序列,该文件没有附加的文件头和文件结束标志。Windows的Convert工具可以把PCM音频格式的文件转换成Microsoft的WAV格式的文件。   PCM脉码调制数字音频格式是70年代末发展起来的,80年代初由飞利浦和索尼公司共同推出。PCM的音频格式也被DVD

FM与FFM算法

五迷三道 提交于 2020-01-14 04:23:21
FM算法全称叫因子分解机( Factorization Machines ),而FFM( Field-aware Factorization Machines )算法是FM算法的特例,这两个算法通常解决稀疏数据下的特征组合问题。 1. FM 算法 FM算法的模型是多项式模型,模型的表达式如下: \[y(\boldsymbol{x}) = {w_0} + \sum\limits_{i = 1}^n {{w_i}{x_i}} + \sum\limits_{i = 1}^{n - 1} {\sum\limits_{j = i + 1}^n {{w_{ij}}{x_i}{x_j}} } \] 上式中, x 表示样本向量, x i 表示样本的第 i 个特征值, w 0 、 w i 和 w ij 是模型参数。由于在数据稀疏普遍存在的应用场景中,二项式系数 w ij 是很难训练的,因此将二项式系数 w ij 拆分为两个特征隐向量的点积,故FM算法的模型公式为: \[y(\boldsymbol{x}) = {w_0} + \sum\limits_{i = 1}^n {{w_i}{x_i}} + \sum\limits_{i = 1}^{n - 1} {\sum\limits_{j = i + 1}^n { < {\boldsymbol{v}_i},{\boldsymbol{v}_j} > {x_i

算法提高 合并石子

强颜欢笑 提交于 2020-01-14 04:21:18
---恢复内容开始--- 算法提高 合并石子 时间限制:2.0s 内存限制:256.0MB 问题描述   在一条直线上有n堆石子,每堆有一定的数量,每次可以将两堆相邻的石子合并,合并后放在两堆的中间位置,合并的费用为两堆石子的总数。求把所有石子合并成一堆的最小花费。 输入格式   输入第一行包含一个整数n,表示石子的堆数。   接下来一行,包含n个整数,按顺序给出每堆石子的大小 。 输出格式   输出一个整数,表示合并的最小花费。 样例输入 5 1 2 3 4 5 样例输出 33 数据规模和约定   1<=n<=1000, 每堆石子至少1颗,最多10000颗。 #include <iostream> #include <cstdio> #include <vector> #include <queue> #include <map> #include <stack> #include <cstring> #include <algorithm> #include <cstdlib> #define FOR(i,x,n) for(long i=x;i<n;i++) #define ll long long int #define INF 0x3f3f3f3f3f3f3f3f #define MOD 1000000007 #define MAX_N 50005 using

ShardingSphere系列(二) 分片策略

旧城冷巷雨未停 提交于 2020-01-14 02:27:47
本文章适用于初学者demo;或概念理解中策略都在git中打好了tag想要学习那种策略仔细阅读redme即可; 具体代码与明细见: https://github.com/ssy-githup/shardingjdbc 1.1 标准策略: 对应算法:精确分片算法,范围分片算法;提供sql语句中的=,IN和BETWEEN AND 的分片操作支持,只支持单分片键 1.2 复合策略 对应算法:复和分片算法 对应算法:精确分片算法,范围分片算法;提供sql语句中的=,IN和BETWEEN AND 的分片操作支持,支持多分片键 1.3 行表达式策略 使用Groovy的表达式,提供对sql语句中的=和in的分片操作支持,只支持单分片键 1.4 Hint策略 对应算法:hint分片算法 通过Hint而非SQL解析的方式分片的策略 分片策略 io.shardingsphere.core.routing.strategy.none.NoneShardingStrategy 分片算法:ShardingAlgorithm io.shardingsphere.api.algorithm.sharding.standard.PreciseShardingAlgorithm io.shardingsphere.api.algorithm.sharding.standard

3.1、Factorization Machine模型

时光怂恿深爱的人放手 提交于 2020-01-14 02:25:10
Factorization Machine模型   在Logistics Regression算法的模型中使用的是特征的线性组合,最终得到的分隔超平面属于线性模型,其只能处理线性可分的二分类问题,现实生活中的分类问题是多中多样的,存在大量的非线性可分的分类问题。   为了使得Logistics Regression算法能够处理更多的复杂问题,对Logistics Regression算法精心优化主要有两种,(1)对特征进行处理,如核函数的方法,将非线性可分问题转换为近似线性可分的问题(2)对Logistics Regression算法进行扩展,因子分解机(Factorization Machine,FM)是对基本Logistics Regression算法的扩展,是由Steffen Rendle提出的一种基于矩阵分解的机器学习算法。 1、Logistics Regression算法的不足:    由于Logistics Regression算法简单,易于实现的特点,在工业界中得到广泛的使用,但是基本的Logistics Regression算法只能处理线性可分的二分类问题,对于下图的非线性可分的二分类问题,基本的Logistics Regression算法却不能够很好的进行分类。 基本的Logistics Regression算法不能很好的将上述的数据分开

YUV420P旋转算法

人走茶凉 提交于 2020-01-13 19:23:28
本次整理了顺时针旋转90度、逆时针旋转90度、逆时针旋转180度、逆时针旋转180度再水平翻转、水平翻转。如有有需要请留言,我会再添加其他旋转算法。 算法可以直接看下面的代码,如果需要代码中的yuv420p.yuv文件及vs工程可以到这里下载: https://pan.baidu.com/s/1z2S5o-Oqbf-_oUyFYGz0zg // Yuv420pRotate.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" // clockwise 顺时针 // contrarotate 逆时针旋转 // flip horizontal 镜像翻转/水平翻转 /** * 顺时针旋转90。 * 取元素:从左下方第一个点开始,从下往上,从左往右取点; * 放元素:从左上方第一个位置开始放,从左往右,从上往下;把每一列转换成每一行。 * * @param yuvFileaName 一帧YUV420P格式的文件 * @param width 图像的宽 * @param height 图像的高 * * @return 空 */ void clockwiseRotate90(const char* yuvFileaName, int width, int height){ FILE* fp = NULL; fopen_s(&fp, yuvFileaName,