
基础算法
介绍一些基础的查找、匹配、搜索算法
嘉木空青
工科硕士,从事信号处理,数据分析,人工智能算法研究。19年入职场,现从事机器学习工作。
展开
-
matlab中digits函数和vpa函数的应用及关系
MATLAB中vpa函数和digits函数都是用来控制运算精度的 一,要修改运算的精度,需要digits()函数和vpa()函数同时执行,单独使用digits函数不会改变运算精度;二,vpa()函数对函数内部的变量运算过程不修改精度,如,vpa(pi)的值为3.1,vpa(2*pi)的值为6.3,所以vpa()并没有对函数内部的变量进行精度修改;三,vpa()可以单独使用,但前提是...原创 2016-10-24 17:00:57 · 9374 阅读 · 0 评论 -
拉格朗日插值法
概念:在数值分析中,拉格朗日插值法是一种多项式插值方法。许多实际问题中都用函数来表示某种内在联系或规律,而不少函数都只能通过实验和观测来了解。如对实践中的某个物理量进行观测,在若干个不同的地方得到相应的观测值,拉格朗日插值法可以找到一个多项式,其恰好在各个观测的点取到观测到的值。这样的多项式称为拉格朗日(插值)多项式。定义:对于给定的个点,其中对应着自变量,对应着该函数的取值。定义拉格...原创 2018-11-05 19:46:25 · 1547 阅读 · 0 评论 -
奇异值分解
从几何 的角度上来看奇异值分解: 上图表明任意的矩阵 A 是可以分解成三个矩阵相乘的形式。V表示了原始域的标准正交基,U表示经过A 变换后的co-domain的标准正交基,Σ表示了V 中的向量与U中相对应向量之间的关系。我们仔细观察上图发现,线性变换A可以分解为旋转、缩放、旋转这三种基本线性变换。 ,Σ是对角阵,表示奇异值,A矩阵的作用...转载 2016-10-31 09:59:27 · 531 阅读 · 0 评论 -
matlab中二次规划函数quadprog
二次规划 二次规划为非线性规划的一种,若某非线性规划的目标函数为自变量x 的二次函数,约束条件又全是线性的,就称这种规划为二次规划。 Matlab 中二次规划的数学模型可表述如下:这里H 是实对称矩阵,f ,b 是列向量,A 是相应维数的矩阵。 Matlab 中求解二次规划的函数为quadprog,用法如下:x = quadprog(H,f)x = quadprog(H,f,...转载 2016-10-08 11:42:06 · 8119 阅读 · 1 评论 -
二叉树的最小深度(C/C++)
用递归去实现:struct TreeNode{ int val; TreeNode *left; TreeNode *right; TreeNode (int x): val(x), left(NULL), right(NULL) {}};int func(TreeNode *root){ if(root == NULL) r...原创 2018-08-21 15:40:27 · 1092 阅读 · 0 评论 -
LeetCode:二叉树的前序遍历(递归与非递归法)
二叉树结点类:struct TreeNode{ int val; TreeNode *left; TreeNode *right; TreeNode(int x): val(x), left(NULL), right(NULL) {}};递归法: class Solution{public: void preOrder(TreeNo...原创 2018-09-14 17:43:21 · 661 阅读 · 0 评论 -
LeetCode:二叉树的后序遍历(递归与非递归法)
二叉树结点类:struct TreeNode{ int val; TreeNode *left; TreeNode *right; TreeNode(int x): val(x), left(NULL), right(NULL) {}};递归法: class Solution{public: void postOrder(Tr...原创 2018-09-14 17:35:11 · 795 阅读 · 0 评论 -
LeetCode:二叉树的中序遍历(递归与非递归法)
二叉树结点类:struct TreeNode{ int val; TreeNode *left; TreeNode *right; TreeNode(int x): val(x), left(NULL), right(NULL) {}};递归法: class Solution{public: void inOrder(TreeNod...原创 2018-09-14 21:29:46 · 1005 阅读 · 0 评论 -
假设检验之T检验
假设检验也叫显著性检验,是以小概率反证法的逻辑进行推理,是判断假设是否成立的统计方法。一般,首先假设样本对应的总体参数或分布是与已知的总体参数或分布相同的,然后根据统计量的分布规律来分析样本数据,利用样本信息判断是否支持当前假设,并对检验假设作出取舍抉择。该方法作出的结论是概率性的,不是绝对的肯定或否定。[]T检验的概念:T检验是用于两个样本(或样本与总体)平均值差异程度的...原创 2019-06-15 19:57:58 · 8571 阅读 · 0 评论 -
启发式算法:模拟退火算法
爬山算法:是一种简单的贪心搜索算法,该算法每次从当前解的临近空间中选择一个最优解作为当前解,直到达到一个局部最优解。该算法实现简单,其主要缺点是会陷入局部最优解。如,按箭头的方向搜索,当达到A点时,无论朝哪个方向小幅度移动都不能得到更优的解。模拟退火算法模拟退火算法来源于固体退火原理,是一种基于概率的算法,将固体加温至充分高,再让其冷却,加温时,固体内部粒子随温升变为无序状,内...原创 2018-09-10 15:17:27 · 2953 阅读 · 0 评论 -
指数平滑法:预测中短期事件发展趋势
简单移动平均法简单移动平均的各元素的权重都相等。简单的移动平均的计算公式如下: Ft=(At-1+At-2+At-3+…+At-n)/n加权移动平均法加权移动平均给固定跨越期限内的每个变量值以不同的权重。其原理是:历史各期产品需求的数据信息对预测未来期内的需求量的作用是不一样的。除了以n为周期的周期性变化外,远离目标期的变量值的影响力相对较低,故应给予较低的权重。 加权移动平均...原创 2018-09-11 12:36:53 · 1809 阅读 · 0 评论 -
最长递增子序列详解(longest increasing subsequence)
对于动态规划问题,往往存在递推解决方法,这个问题也不例外。要求长度为i的序列的Ai{a1,a2,……,ai}最长递增子序列,需要先求出序列Ai-1{a1,a2,……,ai-1}中以各元素(a1,a2,……,ai-1)作为最大元素的最长递增序列,然后把所有这些递增序列与ai比较,如果某个长度为m序列的末尾元素aj(j<i)比ai要小,则将元素ai加入这个递增子序列,得到一个新的长度为m+1的新...转载 2018-09-04 11:03:37 · 1084 阅读 · 0 评论 -
基于数组的归并排序--递归与非递归法(C++/C)
目录递归法非递归法思想:分而治之:参考网上其他的示意图递归法自顶向下归并排序是建立在归并操作上的一种时间复杂度为,空间复杂度为有效排序算法,思想是分而治之。// 归并排序_递归.cpp: // 以数组为例子#include "stdafx.h"#include<iostream>using namespace std;// 在原始数组...原创 2018-08-24 11:27:37 · 1372 阅读 · 0 评论 -
贪心算法
贪心算法 一、基本概念: 所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。 贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择。必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性,即某个状态以后的过程不会影响以前的状态,只与当前状...原创 2016-10-17 14:54:57 · 272 阅读 · 0 评论 -
排序算法--冒泡、选择、插入排序
1、经典的冒泡排序外层循环控制大排序次数,内层循环控制每次大排序的排序次数一次大排序就可以把最小的数据放在最前面。1)对数组中的各数据,依次比较相邻的两个元素的大小2)如果前面的数据大于后面的数据,就交换着两个数据。经过第一轮大排序后,便可把最小的数据排好。3)然后再用同样的方法吧剩下的数据逐个比较,最后得到从小到大排好的数组。void BubbleSort(int ...原创 2018-08-22 20:15:37 · 181 阅读 · 0 评论 -
Shell排序与插入排序算法
目录基于链表的插入排序基于数组的插入排序基于数组的Shell排序基于链表的插入排序https://blog.youkuaiyun.com/Doutd_y/article/details/81557320ListNode * InsertionSort(ListNode *head){ if (head == NULL) return 0; ListN...原创 2018-08-22 21:31:32 · 359 阅读 · 0 评论 -
快速排序算法(C++/C)
快速排序与冒泡排序类似,都是基于交换排序的思想。1)首先设定一个分界值,通过该分界值将数组分成左右两个部分2)将大于分界值的数据集中到数组右边,小于分界值的数据集中在左边3)然后左边和右边的数据可以独立排序,分别对左右边的数据组进行第1,2步操作(递归操作)void quickSort(int *a, int left, int right){ if (left > r...原创 2018-08-23 22:22:27 · 279 阅读 · 0 评论 -
堆排序(Heap Sort)算法(C++/C)
堆排序算法基于选择排序的思想,利用堆结构和二叉树的一些性质来完成数据的排序。对堆中的结点按层进行编号,将其映射到数组中会有以下特点:小顶堆:每个结点的值都小于或等于其左右子结点的值。a[i] <= a[2*i+1] && a[i] <= a[2*i+2]大顶堆:每个结点的值都大于或等于其左右子结点的值。a[i] >= a[2*i+1] &a...原创 2018-08-24 11:19:54 · 1059 阅读 · 0 评论 -
基于链表的插入排序(C++/C)
对于近乎有序的数据而言插入排序算法十分高效。 对于规模很小的数据插入排序也是极佳的选择,由于其所进行的操作很简单所以平均每次操作的开销都很小。这一点使得像快速排序以及归并排序等算法都用插入排序来处理自己划分出来的小区间以优化性能 插入排序是稳定的排序算法,即不改变相同大小元素的原始次序关系。链表类:struct ListNode{ int val; ListNode ...原创 2018-08-10 11:05:30 · 2619 阅读 · 0 评论 -
基于数组的二分查找法--递归与非递归(C++/C)
目录概述非递归法递归法主函数概述折半查找:时间复杂度:,空间复杂度:元素存储在数组中;有序排列。 非递归法int binarySearch(const int arr[], int search_val, int low, int high){ while (low <= high) { int middle ...原创 2018-08-09 23:53:19 · 942 阅读 · 0 评论 -
两个有序链表的合并--递归与非递归(C/C++)
目录链表类非递归法递归法主函数调用链表类// 链表类:struct ListNode{ int val; ListNode *next; ListNode (int x): val(x), next(NULL) {}};非递归法// 合并两个有序链表:ListNode *mergeTwoLists(ListNode *l1, Lis...原创 2018-08-09 22:28:51 · 3322 阅读 · 0 评论 -
两个有序数组的合并--非递归(C++/C)
以从小到大排序为例:思路:每次比较两个数组的第一个数,取较小的那一个,取完之后将该数从对应数组中删除,然后继续比较,如果某一数组为空,则直接将另外一个数组的元素依次复制到新的合并数组中即可。#include <iostream>using namespace std;void mergeTwoArray(int *a, int n, int *b, int m, int ...原创 2018-08-09 22:20:48 · 765 阅读 · 0 评论 -
基于链表的归并排序--递归法(C++/C)
目录定义链表类递归法定义链表类struct ListNode{ int val; ListNode *next; ListNode(int x): val(x), next(NULL) {}};递归法需要几个辅助函数:1)找到单链表的中间节点ListNode *findMiddle(ListNode *head){ List...原创 2018-08-09 21:56:42 · 1909 阅读 · 2 评论 -
二项式系数表--杨辉三角形
( a + b ) 0 = 1( a + b ) 1 = 1a + 1b( a + b ) 2 = 1a2 + 2ab + 1b2( a + b ) 3 = 1a3 + 3a2b + 3ab2 + 1b3( a + b ) 4 = 1a4 + 4a3b + 6a2b2 + 4ab3 + 1b4杨辉三角形11 11 2 11 ...原创 2018-08-15 16:29:23 · 2255 阅读 · 0 评论