算法

如何模仿人的学习模式来教计算机程序解数学题?

旧时模样 提交于 2020-03-01 20:26:42
周末,看关于专家系统方面的书,其中有关于规则方面的内容,忽然就想,能不能模仿人的学习方式来提升计算机程序的计算能力呢? 试想,一个小孩子,他一开始什么也不会,首先,你要告诉他什么是数字,然后告诉他什么是加、减;然后告诉他什么是乘、除,还要告诉他有乘、除要先计算乘除,然后又引入了括号说,有括号永远要先计算括号。如此,随着告诉他的技能越多,他的解题能力也就越强。 于是就想着试验一下。 第一步,教计算机学习什么是数字。 下面的正则表达式,就是告诉“孩子”,数字就是前面可能有“-”号,当然也可能没有,接下来连续的数字0-9,组成的数字,后面可能还会有小数点开始加一堆0-9的数字,当然没有也没有关系。如此,它就算懂得认数字了。 public final class MathNumber { private MathNumber() { } public static String numberPattern = "[-]?[0-9]+([.][0-9]*)?"; public static Pattern pattern = Pattern.compile(numberPattern); public static Matcher match(String string) { Matcher match = pattern.matcher(string); if (match.find())

波束形成算法综述

白昼怎懂夜的黑 提交于 2020-03-01 16:32:34
作者:凌逆战 地址: https://www.cnblogs.com/LXP-Never/p/12051532.html 波束成型 (Beamforming)又叫 波束赋形 、 空域滤波 作用 :对多路麦克风信号进行合并处理, 抑制非目标方向 的干扰信号, 增强目标方向 的声音信号。 原理 :调整相位阵列的基本单元参数,使得某些角度的信号获得相长干涉,而另一些角度的信号获得相消干涉。对各个阵元输出信号加权求和、滤波,最终输出期望方向的语音信号,相当于形成一个“波束”。 远场 :由于信号源到阵列的距离远大于阵元间距, 不同阵元接收信号的 幅度差异较小 ,因此把不同阵元采集的语音信号的幅值认为都是一样的,只需对各阵元接收信号的 相位差异 进行处理即可。 近场 :不同阵元 接收到的信号幅度 受信号源到各 阵元距离差异 的影响非常明显,需考虑信号源到达不同阵元的 波程差 。 问题: 通常的阵列处理多为窄带,使得传统的窄带信号处理方法的缺点逐渐显现出来。语音信号的频率范围为300~3400Hz,没有经过调制过程,且高低频相差比较大,不同阵元的相位延时与声源的频率关系密切,使得现有的窄带波束形成方法不再适用 信噪比比较低和混响影响比较高的环境下难以准确估计波达方向 传统的后置滤波只考虑散射噪声或只从波束形成后的单通道输出中估计噪声不足 根据 获取加权矢量时采用的方法 不同

学了C++不知道怎么搞后台开发?先看看这份学习路线吧!

♀尐吖头ヾ 提交于 2020-03-01 15:41:47
作者: AJ 在去年结束的秋季招聘中,后台开发或服务器开发的岗位需求一度火热,甚至超过了算法岗。不少同学从诸神黄昏的算法岗战场上退下,转向更偏向工程能力的后台开发岗,从而造成后台开发岗位竞争的大爆发。 后台开发工程师主流使用的编程语言有C++、Java、PHP以及目前慢慢流行的Golang等。本文就将以C++的角度,讲讲如何学习和准备后台开发的岗位。 一、语言基础 无论是C++开发还是Java开发,对于一个码农而言,最重要的就是对于编程语言的熟悉。同样,无论从事哪种类型的岗位,首当其冲的就是要掌握好语言基础。 C++是一门博大精深的编程语言,不仅拥有继承于C语言的过程化程序设计思想,还包含有面对对象(OOP)的设计理念。强大而又复杂。相对来说,C++的学习成本较高,语言里面的坑较多。语言基础的学习路线如下: 1 语法基础 重点掌握:(务必熟悉底层机制原理) 指针和引用的概念 指针与内存关系 程序编译过程 static、const、#define的用法和区别 C和C++区别 内存模型 内存中的栈和堆分配 2 面对对象基础 (务必熟悉底层机制原理) 面向对象理解 析构函数 构造函数 拷贝构造 多态 纯虚函数和虚函数 虚函数实现机制 虚函数表 访问限定符 public、private、protected 继承原理、虚继承、菱形继承 静态绑定和动态绑定 new/delete和malloc

算法分析与设计 MST kruskal

爷,独闯天下 提交于 2020-03-01 12:01:02
算法分析与设计 最小生成树 kruskal算法 问题描述: 一个带权连通图,其中顶点集合为V,边集合为E,任选一些点∈V,边∈E,这些点,边构成的新图连通性不变并且边权最小。 下面是百度百科给出的描述: 在一给定的无向图G = (V, E) 中,(u, v) 代表连接顶点 u 与顶点 v 的边(即),而 w(u, v) 代表此边的权重,若存在 T 为 E 的子集(即)且为无循环图,使得 的 w(T) 最小,则此 T 为 G 的最小生成树。 算法思路: kruskal: 假设 WN=(V,{E}) 是一个含有 n 个顶点的连通网,则按照克鲁斯卡尔算法构造最小生成树的过程为:先构造一个只含 n 个顶点,而边集为空的子图,若将该子图中各个顶点看成是各棵树上的根结点,则它是一个含有 n 棵树的一个森林。之后,从网的边集 E 中选取一条权值最小的边,若该条边的两个顶点分属不同的树,则将其加入子图,也就是说,将这两个顶点分别所在的两棵树合成一棵树;反之,若该条边的两个顶点已落在同一棵树上,则不可取,而应该取下一条权值最小的边再试之。依次类推,直至森林中只有一棵树,也即子图中含有 n-1条边为止。 具体步骤可以参照下面的样例 假设有m条边,将所给出的m条边的权值从小到大排序,从小的边开始建树,如果这条边的两端定点没有处于一棵树中,那么就将这两端顶点的树合并。否则就跳过这条边

Java数据结构和算法(八)——递归

雨燕双飞 提交于 2020-03-01 11:08:33
记得小时候经常讲的一个故事:从前有座山,山上有座庙,庙里有一个老和尚和一个小和尚,一天,老和尚给小和尚讲了一个故事,故事内容是“从前有座山,山上有座庙,庙里有一个老和尚和一个小和尚,一天,老和尚给小和尚讲了一个故事,故事内容......”   什么是递归,上面的小故事就是一个明显的递归。以编程的角度来看,程序调用自身的编程技巧称为递归( recursion)。   百度百科中的解释是这样的:递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。 1、递归的定义   递归,就是在运行的过程中调用自己。   递归必须要有三个要素:   ①、边界条件   ②、递归前进段   ③、递归返回段   当边界条件不满足时,递归前进;当边界条件满足时,递归返回。 2、求一个数的阶乘:n! 1 n! = n*(n-1)*(n-2)*......1    规定:   ①、0!=1   ②、1!=1   ③、负数没有阶乘   上面的表达式我们先用for循环改写: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

"二分查找(Binary Search)"与"斐波那契查找(Fibonacci Search)"

╄→гoц情女王★ 提交于 2020-03-01 06:50:35
首先,我们来看一个笔者的拙作,一段二分查找代码 //返回值是key的下标,如果A中不存在key则返回-1 template <class T> int BinSearch(T* A, const T &key, int lo, int hi) { int mid; while(lo<hi) { mid = lo + (hi-lo)/2; if(key < A[mid]) hi = mid-1; else if(key > A[mid]) lo = mid+1; else return mid; if(lo==hi && A[lo]==key) return lo; } return -1; } 可以证明,算法的时间复杂度为O(nlogn),考虑前面的系数的话,大致是O(1.5nlogn)。 但是,这一实现仍有改进的余地。注意到循环 只需要1次 判断来决定是否转进到左侧,但需要2次判断来决定是否转进到右侧。也就是进入左、右分支前的关键码比较次数不等。 而斐波那契查找正是优化了这点。利用斐波那契数来对传入的数组进行黄金分割,这样前半部分较多而后半部分较少。另外,进入前半部分继续搜索所需的判断只有一次,而进入后半部分继续搜索所需的判断却有两次。如此而来,我们人为造成的这种不平衡,反倒是助长了搜索成本的平衡。 template <class T> int FibSearch(T* A,

基于高维聚类技术的中文关键词提取算法

若如初见. 提交于 2020-03-01 04:34:44
[摘要] 关键词 提取是中文信息处理技术的热点和难点,基于统计信息的方法是其中一个重要分支。本文针对基于统计信息关键词提取方法准确率低的问题,提出基于高维聚类技术的中文关键词提取 算法 。算法通过依据小词典的快速分词、二次分词、高维聚类及关键词甄选四个步骤实现关键词的提取。理论分析和实验显示,基于高维聚类技术的中文关键词提取方法具备更好的稳定性、更高的效率及更准确的结果。 引言     关键词提取是通过对一篇输入文章做内容分析,按一定比例或字数要求提取出重要且语义相似性凝聚的关键词的过程。关键词自动提取是文本挖掘领域的一个重要分支,在自动摘要、文本分类、文本聚类、文本过滤、话题跟踪、信息检索、自动问答等很多领域有重要作用。   迄今为止,关键词自动提取吸引了不少国内外学者的关注和研究,其理论成果主要包括基于统计信息的方法、机器学习方法和浅层式语义分析方法三大类。其中应用最为广泛的是基于统计信息的关键词提取方法,具备简洁易懂、通用性强等优势。   本文针对基于统计信息关键词提取方法准确率不高的问题,引入高维聚类思想进行改进,提出基于高维聚类技术的中文关键词自动提取算法。经过基于小词典的快速分词、二次分词、高维聚类、关键词甄选四个步骤,算法抽取出的关键词更加准确,并且具有更好的稳定性和更高的效率。 关键词提取方法   关键词自动提取方法分为基于统计信息的方法

算法的窥探

那年仲夏 提交于 2020-03-01 03:41:39
计算机语言能对计算的控制是有限的, 最大程度的交互就是游戏, 而计算机对问题的求解是无限度的.本篇是对计算机数据结构以及算法的使用做一些探索. 本篇探讨的是: 什么是数据结构? 为什么需要数据结构 ? 为什么使用算法? 怎样掌握他们? 在探索之前, 先要提到的是数学建模. 一个苹果从空中落下来, 它的运动情况是符合这个公式的. H= 1/2g t^2 你可以依据这个模型, 知道不同T情况下的H , 对这个现实问题的情况进行更好的预测和处理. 这个过程, 就是对现实问题的求解, 是数学建模. 编程也是对现实问题的求解. 而数据结构与算法是在计算机领域的建模. 程序建模一般符合这样的三个过程. 1. 数据结构 最基本的数据结构, 其实是变量, 我们通常编程用到的最简单的数据结构, 基于变量之上的编程, 是最初级的编程. 使用了复杂一点数据结构, 并在其上编程, 取决于面对的问题. 通常情况下 , 使用的数据结构越复杂, 其编程能力越强, 对去现实问题的求解越强 选择合适的数据结构, 应当考虑所选择结构的排列规则, 以及利用该的运算特性 2. 算法 算法是问题求解的一个子模块, 又是一个庞大的体系, 初学使用, 应每一个数据结构下着重掌握其中一个算法, (例如线性结构, 就掌握快速排序; 图形结构, 掌握最短路径) 将精力集中于, 使用而不是在算法的理论的掌握上, 理论的掌握需要日积月.

TF-IDF算法介绍及实现

时间秒杀一切 提交于 2020-03-01 02:26:52
目录 1、TF-IDF算法介绍 (1)TF是词频(Term Frequency) (2) IDF是逆向文件频率(Inverse Document Frequency) (3)TF-IDF实际上是:TF * IDF 2、TF-IDF应用 3、Python3实现TF-IDF算法 4、NLTK实现TF-IDF算法 5、Sklearn实现TF-IDF算法 1、TF-IDF算法介绍 TF-IDF(term frequency–inverse document frequency,词频-逆向文件频率)是一种用于信息检索(information retrieval)与文本挖掘(text mining)的常用加权技术。 TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。 TF-IDF的主要思想是:如果某个单词在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。 (1)TF是词频(Term Frequency) 词频(TF)表示词条(关键字)在文本中出现的频率。 这个数字通常会被归一化(一般是词频除以文章总词数), 以防止它偏向长的文件。 公式: 即: 其中 ni,j 是该词在文件 dj 中出现的次数

文本关键词提取算法总结

放肆的年华 提交于 2020-03-01 02:19:11
1.TF-IDF 昨天给大家演示简单的文本聚类,但要给每个聚类再提取一两个关键词用于表示该聚类。我们还是用TFIDF算法来做,因为这是比较简单的提取特征算法,不过这里的TF是指某词在本聚类内所有文章的词频,而不是本文章内出现的次数,IDF还是在所有文章里出现的倒文档频率。 原理:1、先给本聚类内的所有文档进行分词,然后用一个字典保存每个词出现的次数 2、遍历每个词,得到每个词在所有文档里的IDF值,和在本聚类内出现的次数(TF)相乘的值 3、用一个字典(key是词,value是TF*IDF权重)来保存所有的词信息,然后按value对字典排序,最后取权重排名靠前的几个词作为关键词。 2.基于语义的统计语言模型 文章关键词提取基础件能够在全面把握文章的中心思想的基础上,提取出若干个代表文章语义内容的词汇或短语,相关结果可用于精化阅读、语义查询和快速匹配等。 采用 基于语义的统计语言模型 ,所处理的文档不受行业领域限制,且能够识别出最新出现的新词语,所输出的词语可以配以权重。 文章关键词提取组件的主要特色在于: 1、 速度快 :可以处理海量规模的网络文本数据,平均每小时处理至少50万篇文档; 2、 处理精准 :Top N的分析结果往往能反映出该篇文章的主干特征; 3、 精准排序 :关键词按照影响权重排序,可以输出权重值; 4、 开放式接口