
算法设计(Practice)
To_be_thinking
不积跬步,无以至千里。因为热爱而充满激情与斗志!!!
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
ProblemSet of Union Find
并查集模板:快速查找 并查集这是一个eager的并查集,就是在合并两个节点的时候将这两个节点的组份id修改成同一个根节点的编号.public class QuickFindUF { private int[] componentID; //各个节点(数组索引)所属的组份(数组值) private int count; // number of components public Q...原创 2019-08-30 16:50:47 · 231 阅读 · 0 评论 -
前缀树(Trie树、字典树)(三)
这一篇是关于三向Trie的数据结构设计,该数据结构克服了前两篇Trie实现出现大量空引用浪费内存的问题,但是算法更加复杂。树节点设计包括一个字符变量(表示该节点的字符),单词对象(可以为null)和三个指向树节点的引用指针,代码如下:private static class TernaryTrieNode<T>{ private T val; ...原创 2019-01-13 15:26:37 · 322 阅读 · 0 评论 -
前缀树(Trie树、字典树)(二)
上一篇https://blog.youkuaiyun.com/To_be_to_thought/article/details/86321842介绍了在字母表下Trie树的两种实现方式,如果不是字母表,而是一些具有层次关系、包含关系的对象呢,比如如下问题:测试数据如下:机器学习,线性模型,线性回归,最小二乘法,神经网络,神经元模型,激活函数,,多层网络,感知机,,,连接权,强化学习,有模...原创 2019-01-12 22:42:51 · 225 阅读 · 0 评论 -
前缀树(Trie树、字典树)(一)
字典树是一种是十分强大的高级数据结构,常用于字典和文件目录。首先是树节点的设计,我们是用一个数组(字母与数组索引的映射关系时常用的tricky操作)和值对象来表达一个树节点,而键对象是由沿着树的路径搜索字符拼接而成的,当某节点键对象为空时,表明当前路径组成的字符串不存在于字典中,不为空则存在。举个例子:假设字母表只有ABCD四个字母,依次插入ABAB、ABBAB、BADA、BCDA、AB、...原创 2019-01-11 22:33:52 · 302 阅读 · 0 评论 -
LRU Cache(Least Recent Used缓存)
在有限内存空间中,抛弃距当前时间最远被使用(访问)的元素的缓存的数据结构,能够添加元素,读取元素。这个数据结构在操作系统中经常被使用到,见wikipedia链接https://en.wikipedia.org/wiki/Cache_replacement_policies#Least_recently_used_(LRU)。使用一个双端链表和一个HashMap可以在O(1)时间、O(n)空间内...原创 2019-01-11 20:53:56 · 359 阅读 · 1 评论 -
字符串匹配——Rabin–Karp algorithm(二)
上一篇https://blog.youkuaiyun.com/To_be_to_thought/article/details/84890018只是介绍了朴素的Rabin–Karp algorithm,这一篇主要说说朴素Rabin–Karp algorithm的优化。 模式串P长度为L,文本串S长度为n,在S的一轮遍历中找到P的位置,上文提到的hash(P)的复杂度为O(L),对S...原创 2018-12-16 17:16:08 · 459 阅读 · 0 评论 -
Knuth-Morris-Pratt Algorithm(KMP算法)探赜索隐(一)
KMP是指Donald Knuth、 Vaughan Pratt和James H. Morris三个算法牛人的合并简称,Donald Knuth就是那个写《计算机程序设计艺术》的ACM图灵奖得主。这个算法是在线性时间复杂度下完成字符串匹配任务,这个算法太牛逼了,简洁优美但十分太晦涩,充满技巧性,给大神跪了。问题定义: 字符串匹配问题:在文本串S中寻找...原创 2018-12-06 17:18:41 · 779 阅读 · 0 评论 -
回文串问题与动态规划
回文串的算法问题几乎都是用动态规划解决的。5. Longest Palindromic Substring算法一:从对称中心扩展,算法时间复杂度O(N2)O(N^2)O(N2),空间复杂度为O(1)O(1)O(1);class Solution { public String longestPalindrome(String s) { int n = s.length...原创 2019-05-07 16:57:58 · 669 阅读 · 0 评论 -
Support Vector Machine实现(二)
soft margin的优化目标: 最终转为: 该等式优化问题使用SMO算法(sequential minimaloptimization)进行训练面向对象风格代码如下:im...原创 2019-06-08 15:00:27 · 336 阅读 · 0 评论 -
高精度加、减、乘、除
算法模板高精度加法两个位数很多的正数相加#include<iostream>#include<vector>using namespace std;vector<int> add(vector<int> a,vector<int> b){ vector<int> res; int t=0; ...原创 2019-08-25 15:19:36 · 216 阅读 · 0 评论 -
记忆化搜索(递归)
#include<iostream>#include<cstring>#include<vector> using namespace std;typedef long long LL;const int N=110;vector<int> G[N]; //记录图的邻接表LL memo[N][200]; LL getNum(i...原创 2019-08-15 16:40:22 · 819 阅读 · 0 评论 -
ProblemSet of Graph Algorithms
二分图算法import java.util.Scanner; public class Main{ public static int n_vertex; public static int n_edges; public static int[][] adjMatrix; public static int[] color; publi...原创 2019-07-30 16:22:45 · 286 阅读 · 0 评论 -
ProblemSet of Hash Algorithms
1044. Longest Duplicate Substringtypedef unsigned long long ULL;const int N=100010,base=131;ULL POW[N],HASH[N];set<ULL> record;int startIndex;using namespace std;class Solution { pu...原创 2019-07-16 21:46:45 · 175 阅读 · 0 评论 -
ProblemSet of Dynamic Programming Algorithms
44. Wildcard Matchingclass Solution { public boolean isMatch(String s, String p) { char[] text=s.toCharArray(); char[] pattern=p.toCharArray(); //模式串的简化 ...原创 2019-07-16 21:45:40 · 245 阅读 · 0 评论 -
中缀表达式、前缀表达式(波兰表达式)、后缀表达式(逆波兰表达式)算法分析与Java实现
在计算器中输入表达式,然后得出计算结果,是一个比较常见的过程,对于含有括号的运算表达式的运算顺序计算机需要自动识别,这里就涉及到表达式的转换。我们手写或者输入的都是中缀表达式,比如“1+(2-3)*45+41/(2*10)”,“1+(2-3)*45+41/2*10”。当然也可以支持其它函数表达式比如exp()等。通常要转化为波兰表达式或者逆波兰表达式,方便计算机进行运算。也就是说第一步是中缀表...原创 2019-07-14 17:35:05 · 505 阅读 · 0 评论 -
AdaBoost从原理推导到源代码实现(二)
我使用的是决策树桩(单层决策树)作为基学习器,先实现这个决策树桩算法。import numpy as npimport math# 决策树树桩模型,只有一层的决策树class DecisionStump: def __init__(self): self.bestFeature = -1 #数据集中特征索引的序数(从0开始) self.thr...原创 2019-06-17 22:19:29 · 410 阅读 · 1 评论 -
最长公共子串和最长公共子序列
最长公共子串和最长公共子序列是两个不一样的问题,前者要求连续出现在两个字符串中,后者只要顺序一致即可。两者的解决方法类似,都是使用动态规划(DP)。最长公共子序列:状态转移方程: package LeetCode;public class LongestCommonSubsequence { public static in...原创 2019-06-17 16:14:03 · 239 阅读 · 0 评论 -
高斯混合模型(GMM)源代码实现(二)
第一篇(https://blog.youkuaiyun.com/To_be_to_thought/article/details/90759715)讲了原理推导,网上有很多讲解原理的很少有实现的。Talk is cheap,show the code.第二篇主要是GMM的实现,先用面向过程的方式实现并检验算法的正确性,再用面向对象的方式进行封装。然后再对比sklearn的源代码库进行分析比较。算法流程...原创 2019-06-03 23:06:41 · 5464 阅读 · 5 评论 -
高斯混合模型原理推导与实现(一)
Gaussian Mixture Model1.Jensen Inequality(琴生不等式): , 离散形式:...原创 2019-06-03 22:24:41 · 1557 阅读 · 0 评论 -
计数排序(counting sort)
基于比较的排序算法的时间复杂度下限是O(nlogn),本文介绍另外一种整数排序算法——计数排序。计数排序是一种非比较排序稳定排序算法,它的运行效率为O(n+m),正比于数值范围大小(n),设待排序元素个数(m),所以它只适用于n相对于m不是特别大的情况,当m>>n时尤其适合。当然对于负整数或小数以及字符排序可以进行适当的预处理将原来待排序元素映射成自然数即可。下面看算...原创 2018-12-13 15:57:19 · 301 阅读 · 0 评论 -
基数排序(radix sort)
上一篇介绍了计数排序,本文详解另一种线性复杂度的排序——基数排序(radix sort)。基数排序是也是一种非比较整数排序算法。可以用于给字符串集合的“按字典序”排序。问题定义:给定n个d位数据(不足d为的字符串在尾部用""补齐以达到长度为d),每位上是有k个可能取值的一位数值,如果用到的稳定排序在O(n+k)的时间内完成,则基数排序可以在O(d(n+k))时间内完成排序。当每一位的数值在0~...原创 2018-12-14 20:52:46 · 1976 阅读 · 0 评论 -
字符串匹配——Rabin-Karp algorithm(一)
在https://blog.youkuaiyun.com/To_be_to_thought/article/details/84679263这篇使用的是朴素的字符串匹配方法,算法复杂度为O(mn)(m为模式串长度,n为文本串长度)。在字符串匹配任务中,Rabin–Karp算法通过hash函数试图加速文本子串与模式串的匹配过程的“逐一比对过程”。 这里的hash函数可以将每个子串...翻译 2018-12-08 10:44:11 · 1713 阅读 · 1 评论 -
线性回归(LinearRegression)、梯度下降(GD)、随机梯度下降(SGD)与批量梯度下降(MinibatchGD)原理
本节只简要讲述原理,下一篇附有代码和图形比较说明。输入向量 残差平方和(Residual sum of squares) 矩阵表达式: ...原创 2018-08-17 17:12:45 · 1511 阅读 · 0 评论 -
朴素贝叶斯、线性判别准则、平方判别准则(代码,附测试样例)
朴素贝叶斯、线性判别准则、二次判别准则的概率统计原理请看这一篇https://blog.youkuaiyun.com/To_be_to_thought/article/details/81223561围绕上一篇原理部分用python编码如下:import numpy as npimport mathfrom matplotlib import pyplot as pltfrom sklear...原创 2018-07-26 19:20:35 · 1115 阅读 · 0 评论 -
Union-Find再探并查集
Union-Find初探并查集中提到:如果在合并的过程中就将两个对象的组份ID设为一致,查找的时候就相当容易;如果在合并的过程中只是将一个对象与另一个对象相连,则查找的时候需要确定某个对象的始祖对象才能确定其所属的组份ID。现在介绍方便快速查找的并查集:public class QuickFindUF { private int[] componentID; private int coun...原创 2018-06-18 22:05:32 · 245 阅读 · 0 评论 -
Union-Find并查集初探
并查集是一种将同类或者相互联系事物归并并赋予同一类别标签的数据结构,这在现实世界中应用非常普遍。顾名思义,并查集包含两个重要操作Union和Find,Union将两个对象合并,Find是查找某一个对象属于的类别或组份。因此我们需要如下数据结构:1.由对象编号(0,1,2...)索引的组份数组componentID,开始每一个对象都属于以自己为唯一元素的组分中。2.记录组份数count3.为了让树尽...原创 2018-06-18 21:58:22 · 494 阅读 · 0 评论 -
索引最大堆
普通堆(本文仅以最大堆为例)的局限性主要有以下两点: 1.如果原始待排序或者求最值的数据元素很大,交换它们的位置性能损耗。 2.元素在堆化后的数组中位置不确定,只能过遍历找到。 解决上述两个弊端就是用索引的方式,二叉树的节点里存储的不再是原始数据,而是原始数据在数组中的索引。在插入弹出操作中的上浮下沉比较交换中,比较大小仍然是原始数据,但交换和、上浮下沉就是对于原始数据...原创 2018-05-30 15:00:10 · 219 阅读 · 0 评论 -
优先队列
优先队列是一种特殊的队列,只是弹出元素时弹出的是(权重或者某个指定key)最大的元素。基于有序数组、无序数组、有序链表的实现类似于栈和队列的算法,这里说说基于完全二叉树的最大堆实现。 完全二叉树的层次遍历序列和数组的索引顺序完全一致,这里用数组来存储二叉树的节点值,数组索引之间的关系可以表示树节点的父子关系:某节点在数组中索引为k,其父节点索引为k/2,左右子节点为2k和...原创 2018-05-30 14:38:37 · 385 阅读 · 0 评论 -
八皇后问题
八皇后问题规则:8*8棋盘上,棋子所在行、列、主对角线、副对角线方向没有棋子,最终摆满8个棋子。在棋盘问题上经常采用深度优先搜索来解决,搜索每前进一步都要判断位置的合法性,合法则继续向前搜索,不合法则后退到上一个位置,尝试上一个位置的其他方向。从棋盘行来看,每行(列)必然有一个棋子。我们可以逐列摆一个棋子,这样的话不存在两个棋子在同一列上,在设置三个全局变量用于记录棋盘的8、15条主对角线...原创 2018-05-07 12:39:47 · 389 阅读 · 0 评论 -
哈希算法初探
在java中,任何对象的HashCode()方法在默认情况下把对象物理地址先转成整数,再把整数计算Hash码,当然对于一些复杂的抽象数据类型也可以把自定义key转换成Hash码。 这里计算Hash码的过程就是哈希函数的工作,哈希函数在理想条件下要具有3个性质:1.确定性 2.便于计算 3.将key均匀映射散布。当然现实情况肯定不可能,那就要解决hash码冲突的问题。因...原创 2018-05-18 16:45:29 · 373 阅读 · 0 评论 -
线性回归(LinearRegression)、局部加权回归(LOWESS)、梯度下降(GD)、随机梯度下降(SGD)与批量梯度下降(MinibatchGD)代码实现与比较
上述算法实现具体原理请看这一篇https://blog.youkuaiyun.com/To_be_to_thought/article/details/81780397线性回归的标准方程法:import numpy as npimport mathimport matplotlib.pyplot as plt#标准方程法——线性回归#x_matrix为数据集矩阵,返回参数向量def Li...原创 2018-08-17 17:38:40 · 1905 阅读 · 2 评论 -
模拟退火算法(附python代码)
https://www.cnblogs.com/ranjiewen/p/6084052.html这篇文章把模拟退火的来龙去脉讲得十分清楚,下面直接上代码。值得注意的是对于不同的问题,其中的关键一步随机扰动的选择是不一样的,如果选择不当会导致搜索域变小或者很难达到最优解(较优),并且求得的解不一定就是最优解。Q1:第一个例子就是求一个一元函数y=x+10sin(5x)+7cos(4x)的最小值:...原创 2018-08-21 22:19:12 · 16823 阅读 · 8 评论 -
Bloom Filter(布隆过滤器)
最早看到这个精巧的数据结构是在《数学之美》上,今天梳理一下它的特点。布隆过滤器: Bloom Filter是一个节省空间的概率型数据结构,被用来测试一个元素是否存在于集合中。“元素实际不存在于集合中但判定为存在“的这类错误(False positive)在该数据结构上可能发生(概率很低可以人为控制),但是“实际存在于集合中但是判定为不存在”的错误(False Negative)...原创 2018-12-07 21:34:13 · 277 阅读 · 0 评论 -
二叉树遍历算法与重构(2)
上一篇(https://blog.youkuaiyun.com/To_be_to_thought/article/details/84668630)介绍了二叉树的性质和常用的相关的递归、非递归算法,这一篇想接着写从二叉树的遍历结果重构一棵树,主要是重构的过程思路。1.中序遍历和先根遍历结果重构二叉树算法: ...原创 2018-12-01 16:46:22 · 311 阅读 · 0 评论 -
递归(recursion)算法与二叉树(1)
笔者按:曾经刚开始学习数据结构和算法时,总会为简洁隽永的递归代码而惊叹,也想写出如此优雅的代码,但是思考过程真的实属不易!!!那时候递归都会尽量用显式栈来规避。生活中的递归! 首先,对递归要有一个类似盗梦空间或者平行世界的认识,就像现实世界和你的梦境,当你开始进入梦境,这两个世界完全隔离(平行世界和平行万物)除了你的(思想、记忆),思想记忆可以看成从现实世界传到梦境里的(传入参...原创 2018-11-30 23:25:07 · 525 阅读 · 0 评论 -
Maximum subarray problem(“最大和子数组”问题)与Kadane’s algorithm
最大和子串:在计算机科学中,最大子数组问题就是在给定一维数组中寻找和最大的连续的子数组,并确定起点索引i,终点索引j和最大和。(该定义翻译自wikipedia) 最直接的方法就是穷举每一个子串计算和:暴力搜索1(Brute force)def findMaxSum(arr...原创 2018-11-21 19:14:49 · 516 阅读 · 0 评论 -
LeetCode-142. Linked List Cycle II(详细证明)与龟兔赛跑算法
这道题目是141. Linked List Cycle的加成版https://leetcode.com/problems/linked-list-cycle/,思路都是“龟兔赛跑追及问题必相遇”,但这条需要确定环的入口节点。我们需要定量化一下: pSlow是慢指针,pFast为2倍速指针当pSlow经过i(i=4)“单位步长”首次到达Entry节点时,p...原创 2018-11-11 15:20:41 · 1844 阅读 · 1 评论 -
LeetCode-92. Reverse Linked List II(附思考过程和debug过程)
https://leetcode.com/problems/reverse-linked-list-ii/题意比较简单,要求在一轮遍历中将第m个节点到第n个节点逆转,其他节点保持不变,核心代码与https://leetcode.com/problems/reverse-linked-list/有所不同。关键是从逆转操作中抽象出“循环不变式”。请看如下详解:如下图是一个要逆转第3(m)到第5(n...原创 2018-11-10 17:24:16 · 428 阅读 · 0 评论 -
快速排序(Quicksort)详解(动画代码)
快速排序只一种基于分治策略(divide and conquer)的经典排序算法,并且是一种原地(in-place)排序,实现原地排序的依据是用两个数组下标(start,end)来确定当前待排序子数组的范围,其关键步骤就是切分。切分(partition)步骤(关键):在对子数组进行排序时,本质上是在确定子数组中某个数(不妨设就是子数组中第一个数字pivot=arr[start])在排序后子...原创 2018-11-09 11:05:19 · 2286 阅读 · 0 评论 -
优化梯度下降算法 Momentum、RMSProp(Root mean square propagation)和Adam( Adaptive Moment Estimation)
https://blog.youkuaiyun.com/To_be_to_thought/article/details/81780397阐释Batch Gradient Descent、Stochastic Gradient Descent、MiniBatch Gradient Descent具体原理。对于梯度下降算法,当参数特别多时容易发现,速度会变慢,需要迭代的次数更多。优化速度与学习率、梯度变化量...原创 2018-09-26 21:48:18 · 3001 阅读 · 2 评论