
算法
文章平均质量分 58
ustcyy91
这个作者很懒,什么都没留下…
展开
-
深度优先搜索算法(迷宫最短路径问题)
#include int min=99999,p,q,m,n;int a[50][50],book[50][50];void dfs(int x,int y,int step){int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}};int tx,ty,k;if(x==p&&y==q){if(step{min=step;原创 2017-02-21 11:23:35 · 2067 阅读 · 0 评论 -
排序算法总结
排序算法经过了很长时间的演变,产生了很多种不同的方法。对于初学者来说,对它们进行整理便于理解记忆显得很重要。每种算法都有它特定的使用场合,很难通用。因此,我们很有必要对所有常见的排序算法进行归纳。 我不喜欢死记硬背,我更偏向于弄清来龙去脉,理解性地记忆。比如下面这张图,我们将围绕这张图来思考几个问题。 上面的这张图来自一个PPT。它概括了数据结构中的所有常见转载 2017-05-22 20:45:10 · 365 阅读 · 0 评论 -
查找算法——二叉查找树
概要 本章先对二叉树的相关理论知识进行介绍,然后给出C语言的详细实现。关于二叉树的学习,需要说明的是:它并不难,不仅不难,而且它非常简单。初次接触树的时候,我也觉得它似乎很难;而之所产生这种感觉主要是由于二叉树有一大堆陌生的概念、性质等内容。而当我真正的实现了二叉树再回过头来看它的相关概念和性质的时候,觉得原来它是如此的简单!因此,建议在学习二叉树的时候:先对二叉树基本的概念、转载 2017-08-29 16:13:22 · 527 阅读 · 0 评论 -
VLAN
为什么需要VLAN 1. 什么是VLAN? VLAN是二层技术(数据链路层),用来隔离广播域。不同的VLAN之间 不能直接通信,需要三层技术(网络层)实现通信。VLAN(Virtual LAN),翻译成中文是“虚拟局域网”。LAN可以是由少数几台家用计算机构成的网络,也可以是数以百计的计算机构成的企业网络。VLAN所指的LAN特指使用路由器分割的网络——转载 2017-08-30 21:38:05 · 567 阅读 · 1 评论 -
栈混叠的次数-------Catalan数(卡特兰数)
一、关于卡特兰数 卡特兰数是一种经典的组合数,经常出现在各种计算中,其前几项为 : 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, 477638700, 1767263190, 6564120420, 24466转载 2018-03-13 16:47:58 · 502 阅读 · 0 评论 -
面试算法---01字符串交换次数
题目:把一个只包含01的字符串 进行排序,问最少可以交换多少次?1,0,1,1,0,1,0,0,1,0,1,1,1,1,0,1解题思路:利用快排思想 左边i 右边j 左边遇到1 右边遇到0 时交换 并计数一次 直到i=j位置public class zerooneswitch { public static void main(String[] args) { // TODO Auto-...原创 2018-04-08 16:25:53 · 2376 阅读 · 0 评论 -
递归———整数划分问题
递归的核心是找到1.边界条件 边界条件是递归函数的出口2.递归方程 以斐波拉切数列为例边界条件是 f(0)=0 f(1)=1递归方程是 f(n)=f(n-1)+f(n-2) 整数划分问题的难点在于怎么找出递归方程?构造函数q(n,m) n代表目标数 m代表最大划分数根据n和m的关系,考虑以下几种情况: (1)当n=1时,不论m的值为多少(m>0),只有一种划分即{1}; (2...原创 2018-04-25 17:26:29 · 359 阅读 · 0 评论 -
动态规划------以最长递增子序列为例深入剖析动态规划
引言:剖析递推、搜索、贪心、动态规划的区别(部分摘自知乎)。先上结论一个问题是该用递推、贪心、搜索还是动态规划,完全是由这个问题本身阶段间状态的转移方式决定的!每个阶段只有一个状态->递推;每个阶段的最优状态都是由上一个阶段的最优状态得到的->贪心(本质就是一阶马尔科夫模型);每个阶段的最优状态是由之前所有阶段的状态的组合得到的->搜索;每个阶段的最优状态可以从之前某个阶段的某个...原创 2018-04-26 10:14:34 · 212 阅读 · 0 评论 -
字符串--------循环左移
已知字符数组 abcdef循环左移2位 输出cdefab方法:三次反转public class Solution { public static void main(String[] args) { char[] s=new char[]{'a','b','c','d','e','f'}; leftReverse(s, 6, 2); System.ou原创 2018-04-26 20:22:46 · 614 阅读 · 0 评论 -
动态规划————最长公共子序列长度
public class Solution { public static void main(String[] args) { String str1="ABCBDAB"; String str2="BDCABA"; System.out.println(longestCommonSubsequence(str1, str2)); } public static int lon...原创 2018-04-26 21:58:16 · 263 阅读 · 1 评论 -
字符串----交换星号
class Solution { public static void main(String[] args) { Solution test=new Solution(); System.out.println(test.fun("*01*2234*4")); } public String fun(String s) { char[] ch=s.toCharArray();...原创 2018-04-27 15:30:03 · 276 阅读 · 0 评论 -
字符串----反转单词不反转单词内容
反转句中的单词 单词内容不变比如 输入WuHan is Dog 输出 Dog is WuHan和字符串循环左移类似 两次反转 先整体反转 再用split函数 分割 再依次反转合并class Solution { public static void main(String[] args) { Solution test=new Solution(); Syst原创 2018-04-27 16:29:30 · 1281 阅读 · 0 评论 -
字符串-----最长不重复子字符串(leetcode3)
import java.util.HashMap;public class Solution { public int lengthOfLongestSubstring(String s) { //记录最大长度 int max=0; //left存放左边界 int left=0; HashMap<Character, Integer> map=new HashM...原创 2018-04-27 20:55:16 · 259 阅读 · 0 评论 -
字符串-------最长回文串(leetcode5)
Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.Example 1:Input: "babad"Output: "bab"Note: "aba" is also a valid answer.Example 2:...原创 2018-04-27 21:48:35 · 264 阅读 · 0 评论 -
写循环体的技巧-----循环不变式(loop invariant)
循环不变式是一种条件式(必须满足的条件,对循环而言是保持不变的,无论循环执行了多少次),循环语句没执行一次,就要求中间的结果必须符合不变式的要求。(1)进入循环语句时,不变式必须成立;(2)循环语句的循环体不能破坏不变式。也就是说,循环体开始循环时不变式成立,结束时也必须成立;(3)如果循环语句终止时不变式,依旧成立,那么至少说明,循环在保持循环不变式上没有犯错。 // (**) 不...原创 2018-05-19 16:58:52 · 2106 阅读 · 0 评论 -
LCS最长公共子序列与最长公共子串
import java.util.ArrayList; import java.util.List; public class Solution { public static void main(String[] args) { System.out.println(longestSub("abcde","aebacec")); ...原创 2018-06-19 15:22:05 · 223 阅读 · 0 评论 -
倒排索引
见其名知其意,有倒排索引,对应肯定,有正向索引。 正向索引(forward index),反向索引(inverted index)更熟悉的名字是倒排索引。 转载自:https://www.cnblogs.com/zlslch/p/6440114.html 在搜索引擎中每个文件都对应一个文件ID,文件内容被表示为一系列关键词的集合(实际上在搜索引擎索引库中,关键词也已经转换为关键词...转载 2018-07-11 11:04:29 · 1685 阅读 · 0 评论 -
今日头条2018.8.12笔试题总结
今日头条笔试题1(经典的floodfill问题):具体可以参考leetcode 200题:Number of Islands1. 一个球场C的球迷看台可容纳M*N个球迷。官方想统计一共有多少球迷群体,最大的球迷群体有多少人。球迷选座特性:1.1.同球迷群体会选择相邻座位,不同球迷群体选择不相邻的座位。(相邻包括前后相邻、左右相邻、斜对角相邻);2.给定一个M*N的二位球场,0...原创 2018-08-14 10:34:32 · 8234 阅读 · 0 评论 -
Java Arrays.sort源代码解析
Java Arrays.sort源代码解析 Java Arrays中提供了对所有类型的排序。其中主要分为Primitive(8种基本类型)和Object两大类。 基本类型:采用调优的快速排序; 对象类型:采用改进的归并排序。一、对于基本类型源码分析如下(以int[]为例): Java对Primitive(int,float等原型数转载 2017-08-28 15:53:35 · 225 阅读 · 0 评论 -
排序算法——堆排序
堆排序与快速排序,归并排序一样都是时间复杂度为O(N*logN)的几种常见排序方法。学习堆排序前,先讲解下什么是数据结构中的二叉堆。二叉堆的定义二叉堆是完全二叉树或者是近似完全二叉树。二叉堆满足二个特性:1.父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值。2.每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆)。当父结点的键值总原创 2017-08-28 14:38:43 · 437 阅读 · 0 评论 -
递归方程的Master定理
什么是Master定理简介Master定理也叫主定理。它提供了一种通过渐近符号表示递推关系式的方法。应用Master定理可以很简便的求解递归方程。然而,Master定理也有其不适用的地方,下面会讲到。定义假设有如下递归方程:T(n)=aT(nb)+f(n)其中n为问题规模,a为递推的子问题数量且a≥1,nb为每个子问题的规模(假设每个转载 2017-02-23 22:06:27 · 4196 阅读 · 1 评论 -
归并算法
MergeSort归并排序就是将一组数分割成两个子数组,再对子数组进行排序,然后再归并起来。在这个过程中,通过递归的方式对子数组进行归并排序。过程(Wikipedia):申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列设定两个指针,最初位置分别为两个已经排序序列的起始位置比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位转载 2017-02-15 22:07:14 · 202 阅读 · 0 评论 -
隐马尔科夫模型(HMM)
隐马尔可夫模型(Hidden Markov Model,HMM)是统计模型,它用来描述一个含有隐含未知参数的马尔可夫过程。其难点是从可观察的参数中确定该过程的隐含参数。然后利用这些参数来作进一步的分析,例如模式识别。是在被建模的系统被认为是一个马尔可夫过程与未观测到的(隐藏的)的状态的统计马尔可夫模型。下面用一个简单的例子来阐述:假设我手里有三个不同的骰子。第一个骰子是我们转载 2017-03-28 15:19:15 · 309 阅读 · 0 评论 -
算法——分治法之棋盘覆盖
问题描述在一个2^k×2^k 个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。在棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。解题思路分析:当k>0时,将2k×2k棋盘分割为4个2^k-1×2^k-1 子棋盘(a)所示。特殊方格必位于4个较小转载 2017-03-12 01:45:39 · 9901 阅读 · 1 评论 -
动态规划之 最优流水调度问题
最优流水调度问题问题描述: 设有n个作业,每一个作业i均被分解为m项任务: Ti1, Ti2, ┅ , Tim(1≤i≤n,故共有n*m个任务),要把这些任务安排到m台机器上进行加工。 现在有三条限定: 1、 每个作业i的第j项任务Tij (1≤i≤n, 1≤j≤m)只能安排在机器Pj上进行加工; 2、 作业i转载 2017-05-23 21:41:10 · 5776 阅读 · 3 评论 -
活动安排问题的 动态规划和贪心算法
这篇文章主要用来记录我对《算法导论》 贪心算法一章中的“活动选择问题”的动态规划求解和贪心算法求解 的思路和理解。主要涉及到以下几个方面的内容:①什么是活动选择问题---粗略提下,详细请参考《算法导论》②活动选择问题的DP(Dynamic programming)求解--DP求解问题的思路③活动选择问题的贪心算法求解④为什么这个问题可以用贪心算法求解?转载 2017-05-24 21:28:08 · 22856 阅读 · 4 评论 -
回溯法———n皇后问题
#include #include int n,m=1; int a[1024]={0}; int check(int a[],int n) { for(int i=1;i<n;i++) { if(abs(a[i]-a[n])==abs(i-n) || a[i]==a[n])//////////////见下面注释原创 2017-05-05 16:36:37 · 270 阅读 · 0 评论 -
算法的时间复杂度和空间复杂度-总结
算法的时间复杂度和空间复杂度-总结 通常,对于一个给定的算法,我们要做 两项分析。第一是从数学上证明算法的正确性,这一步主要用到形式化证明的方法及相关推理模式,如循环不变式、数学归纳法等。而在证明算法是正确的基础上,第二部就是分析算法的时间复杂度。算法的时间复杂度反映了程序执行时间随输入规模增长而增长的量级,在很大程度上能很好反映出算法的优劣与否。因此,作为程序员,掌握基本的转载 2017-04-25 16:39:35 · 706 阅读 · 1 评论 -
分支界限法——0/1背包问题
原创 2017-05-09 17:25:27 · 608 阅读 · 0 评论 -
回溯法与分支界定法的区别
在学习数据结构算法的时候,常常会被N多个算法思想绕昏头脑,比如有蛮力法、分治法、动态规划法、贪心法、回溯法、分支界定法等等。我常常易混淆的就是回溯法和分支界定法。两者都是建立解空间树,然后按照一定的约束条件进行遍历,找到解。1、回溯法:是按照深度优先搜寻建立解空间树分支界定法:是按照广度优先搜寻建立解空间树2、回溯法:是蛮力法的改进,蛮力法构造全部解,而回溯法每次只转载 2017-05-22 21:39:26 · 1118 阅读 · 0 评论 -
排序算法——选择排序
a) 原理:每一趟从待排序的记录中选出最小的元素,顺序放在已排好序的序列最后,直到全部记录排序完毕。也就是:每一趟在n-i+1(i=1,2,…n-1)个记录中选取关键字最小的记录作为有序序列中第i个记录。基于此思想的算法主要有简单选择排序、树型选择排序和堆排序。(这里只介绍常用的简单选择排序)b) 简单选择排序的基本思想:给定数组:int[] arr={里面n个数据};第1趟排序,在待排序原创 2017-08-25 09:42:00 · 181 阅读 · 0 评论 -
图解排序算法(一)之3种简单排序(选择,冒泡,直接插入)
图解排序算法(一)之3种简单排序(选择,冒泡,直接插入) 排序是数据处理中十分常见且核心的操作,虽说实际项目开发中很小几率会需要我们手动实现,毕竟每种语言的类库中都有n多种关于排序算法的实现。但是了解这些精妙的思想对我们还是大有裨益的。本文简单温习下最基础的三类算法:选择,冒泡,插入。 先定义个交换数组元素的函数,供排序时调用 /** * 交换转载 2017-08-25 10:40:30 · 383 阅读 · 0 评论 -
排序算法——插入排序
直接插入排序基本思想是每一步将一个待排序的记录,插入到前面已经排好序的有序序列中去,直到插完所有元素为止。 package suanfa;public class Insert { public static void main(String[] args) { int i,j,k,temp,len; int[] a={13,11,7,14,9}; len=a.原创 2017-08-25 10:47:46 · 116 阅读 · 0 评论 -
排序算法——希尔排序
希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破O(n2)的第一批算法之一。本文会以图解的方式详细介绍希尔排序的基本思想及其代码实现。基本思想 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的原创 2017-08-25 15:13:23 · 234 阅读 · 0 评论 -
排序算法——归并排序
步骤:1.递归拆分,并对两个拆分的数组进行排序 2.合并两个有序数组时间复杂度为O(nlogn)原理图:代码实现:package suanfa;public class Merge { private static int[] temp; public static void main(String[] args) {原创 2017-08-26 14:20:07 · 94 阅读 · 0 评论 -
排序算法——快速排序
步骤:1.先分割2.再递归调用进行切分排序快速排序的基本思想是:1.先从数列中取出一个数作为基准数。2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。3.再对左右区间重复第二步,直到各区间只有一个数。虽然快速排序称为分治法,但分治法这三个字显然无法很好的概括快速排序的全部步骤。因此我的对快速排序作了进一步的说明:挖原创 2017-08-26 21:59:57 · 196 阅读 · 0 评论 -
排序算法——优先队列(基于堆得优先队列)
一:数据结构 堆的概念1.堆 堆数据结构是一种数组对象,它可以被视为一科完全二叉树结构。它的特点是父节点的值大于(小于)两个子节点的值(分别称为大顶堆和小顶堆)。它常用于管理算法执行过程中的信息,应用场景包括堆排序,优先队列等。堆有两个很基本的操作:增加、删除。先来说说增加元素,假设有下面这样一个堆:这时候,有一个元素1要添加进来,这时候应原创 2017-08-27 11:26:20 · 452 阅读 · 0 评论 -
Leetcode----------区间合并(数组)
最近在做今日头条的笔试题碰到了区间合并问题所以趁机把类似的问题总结一下LeetCode 56 给出一个区间的集合,请合并所有重叠的区间。示例 1:输入: [[1,3],[2,6],[8,10],[15,18]]输出: [[1,6],[8,10],[15,18]]解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].示例 2:输入: [[1...原创 2018-08-14 16:21:00 · 6108 阅读 · 0 评论