
算法
文章平均质量分 56
楚兴
这个作者很懒,什么都没留下…
展开
-
八大排序算法总结
插入排序1.直接插入排序原理:将数组分为无序区和有序区两个区,然后不断将无序区的第一个元素按大小顺序插入到有序区中去,最终将所有无序区元素都移动到有序区完成排序。要点:设立哨兵,作为临时存储和判断数组边界之用。实现:Void InsertSort(Node L[],int length){Int i,j;//分别为有序区和无序区指针转载 2014-07-29 20:13:06 · 727 阅读 · 0 评论 -
二叉查找树
二叉查找树,也称二叉排序树,二叉搜索树。 它或者是一棵空树;或者是具有下列性质的二叉树: 若左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若右子树不空,则右子树上所有结点的值均大于它的根结点的值; 左、右子树也分别为二叉排序树查找操作步骤:若根结点的关键字值等于查找的关键字,成功。否则,若小于根结点的关键字值,递归查左子树;若大于根结点的关键字值,递归查右子树。若子树为空原创 2015-06-27 15:50:03 · 1168 阅读 · 0 评论 -
求一个字符串中连续出现次数最多的子串
解题思路例如字符串“abababc”,最多连续出现的为ab,连续出现三次。要和求一个字符串中的最长重复子串区分开来,还是上面的字符串,那么最长的重复子串为abab。两个题目的解法有些类似,都用到了后缀数组这个数据结构。求一个字符串中连续出现的次数最多的子串,首先生成后缀数组例如上面的字符串为:abababcbababcababcbabcabcbcc可以看出第一个后缀数组和第三个后缀数组的原创 2015-07-14 21:07:50 · 7956 阅读 · 1 评论 -
找出所有最长连续重复子串及其个数
问题描述: 找出字符串中所以最长连续重复子串及其个数 比如: 输入:123234,最大连续重复字符串为23,个数为2 输入:5555,最大连续重复字符串为555,个数为2 输入:aaabbb 最大连续重复字符串为aa,个数为2;和bb,个数为2 必须存在重复的字符串才算,只出现一次的不算。可能存在多个相同长度的不同字符串,比如aaabbb。解题思路与[求一个字符串中连续出现次数最多的子串原创 2015-07-15 09:47:59 · 7427 阅读 · 0 评论 -
N皇后问题
八皇后问题是一个古老而著名的问题,它是回溯算法的典型例题。该问题是十九世纪德国著名数学家高斯于1850年提出的:在8行8列的国际象棋棋盘上摆放着 八个皇后。若两个皇后位于同一行、同一列或同一对角线上,则称为它们为互相攻击。 现在要求使这八个皇后不能相互攻击,即任意两个皇后都不能处于同一行、同一列或同一对角线上,问有多少种摆法。解题思路在递归方式中,pos[i]表示第i行的皇后摆在第pos[i]列上原创 2015-08-09 21:54:18 · 896 阅读 · 0 评论 -
前缀中缀后缀表达式
它们都是对表达式的记法,它们之间的区别在于运算符相对于操作数的位置不同:前缀表达式的运算符位于与其相关的操作数之前;中缀和后缀同理。将中缀表达式转换为前缀表达式(1) 初始化两个栈:运算符栈S1和储存中间结果的栈S2; (2) 从右至左扫描中缀表达式; (3) 遇到操作数时,将其压入S2; (4) 遇到运算符时,比较其与S1栈顶运算符的优先级: (4-1) 如果S1为空,或栈顶运算符为右括号原创 2015-07-30 15:51:26 · 1354 阅读 · 0 评论 -
部分链表操作总结
部分链表操作总结#include <iostream>#include <cstdlib>using namespace std;// definition of Nodestruct Node{ int val; Node *next; Node(int x) : val(x), next(NULL){}};// create a linklist with n原创 2015-07-20 17:07:15 · 848 阅读 · 0 评论 -
二叉树遍历
递归遍历比较简单,本文主要总结非递归遍历。前序遍历前序遍历按照“根结点-左孩子-右孩子”的顺序进行访问。 对于任一结点P:访问结点P,并将结点P入栈;判断结点P的左孩子是否为空,若为空,则取栈顶结点并进行出栈操作,并将栈顶结点的右孩子置为当前的结点P,循环至1);若不为空,则将P的左孩子置为当前的结点P;直到P为NULL并且栈为空,则遍历结束。void preorder(TreeNode原创 2015-07-17 17:25:21 · 1056 阅读 · 0 评论 -
两个栈实现一个队列
用两个栈实现一个队列的功能。解题思路假设两个栈A和B,且都为空。 栈A提供push()功能,栈B提供pop()功能。入队列:入栈A。出队列: 如果栈B不为空,直接弹出B的元素。如果栈B为空,则依次弹出栈A的元素并压入栈B中,再弹出B中的元素。实现代码#include <iostream>#include <stack>using namespace std;template<clas原创 2015-07-20 20:10:57 · 1158 阅读 · 0 评论 -
约瑟夫环问题
约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。通常解决这类问题时我们把编号从0~n-1,最后结果+1即为原问题的解。数组方式假设下标从0开始,0,1,2 .. m-1共m个人,从1开始报数,报到k则此人从原创 2015-06-15 15:10:09 · 1838 阅读 · 0 评论 -
15道使用频率极高的基础算法题
1、合并排序,将两个已经排序的数组合并成一个数组,其中一个数组能容下两个数组的所有元素;合并排序一般的思路都是创建一个更大数组C,刚好容纳两个数组的元素,先是一个while循环比较,将其中一个数组A比较完成,将另一个数组B中所有的小于前一个数组A的数及A中所有的数按顺序存入C中,再将A中剩下的数存入C中,但这里是已经有一个数组能存下两个数组的全部元素,就不用在创建数组了,但只能从后往前面存,从原创 2015-05-26 18:59:39 · 1734 阅读 · 0 评论 -
模拟退火算法
模拟退火算法来源于固体退火原理,将固体加温至充分高,再让其徐徐冷却,加温时,固体内部粒子随温升变为无序状,内能增大,而徐徐冷却时粒子渐趋有序,在每个温度都达到平衡态,最后在常温时达到基态,内能减为最小。 模拟退火算法(Simulated Annealing,SA)最早由Kirkpatrick等应用于组合优化领域,它是基于Monte-Carlo迭代求解策略的一种随机寻优算法,其出发点是基于物理中固体物原创 2015-03-26 16:41:52 · 2950 阅读 · 0 评论 -
动态规划之最长公共子序列
给定两个序列x和y,称z是x和y的公共子序列,如果z既是x的子序列,又是y的子序列;最长的公共子序列称作最长公共子序列LCS(longest common subsequence)。解题思路(1)LCS的最优子结构 设zk是xm和yn的一个LCS,则,如果x和y的最后一个元素相同,则z中去掉最后一个元素之后zk-1仍为xm-1和yn-1的LCS。 如果xm!=yn,若zk!=xm,则z是xm-1原创 2015-03-27 16:51:33 · 1092 阅读 · 0 评论 -
KMP算法字符串匹配
对于暴力搜索法,当搜索词对应的字符与字符串中的字符不匹配时。将搜索词整个后移一位,再从头逐个比较。这样做虽然可行,但是效率很差,因为你要把”搜索位置”移到已经比较过的位置,重比一遍。应用KMP算法之后,则有: 移动位数 = 已匹配的字符数 - 对应的部分匹配值 “部分匹配值”就是”前缀”和”后缀”的最长的共有元素的长度。KMP算法实现代码如下:void prefixFun(char *pat原创 2015-03-29 20:38:31 · 1451 阅读 · 0 评论 -
爬山算法
爬山算法是一种局部择优的方法,采用启发式方法,是对深度优先搜索的一种改进,它利用反馈信息帮助生成解的决策。 属于人工智能算法的一种。算法描述从当前的节点开始,和周围的邻居节点的值进行比较。 如果当前节点是最大的,那么返回当前节点,作为最大值(既山峰最高点);反之就用最高的邻居节点来,替换当前节点,从而实现向山峰的高处攀爬的目的。如此循环直到达到最高点。function HillClimbing(pr原创 2015-03-26 16:20:48 · 6605 阅读 · 0 评论 -
遗传算法
遗传算法(Genetic Algorithm)是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。遗传算法是从代表问题可能潜在的解集的一个种群(population)开始的,而一个种群则由经过基因(gene)编码的一定数目的个体(individual)组成。每个个体实际上是染色体(chromosome)带有特征的实体。染色体作为遗传物质的原创 2015-03-26 17:28:40 · 15268 阅读 · 0 评论 -
动态规划之背包问题
背包问题有N件物品和一个容量为V的背包,第i件物品的体积是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。状态转移方程: f[i][v]=maxf[i−1][v],f[i−1][v−c[i]]+w[i]f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]} 这个方程非常重要,基本上所有跟背包相关的问题的方程都是由它衍生出来的 伪码如下:for原创 2015-04-20 14:59:11 · 1408 阅读 · 0 评论 -
递归之台阶问题
跳台阶题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。解题思路当n=1时,次数f(n)=1。 当n=2时,次数f(n)=2。(11或2) 当n>2时,当前一步可以跳一级,也可以跳两级,次数f(n)=f(n-1)+f(n-2)。实现代码class Solution {public: int jumpFloor(int number) {原创 2015-04-27 18:16:06 · 1675 阅读 · 0 评论 -
二维数组中的查找
题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。解题思路从右上角元素开始遍历,若小于目标,则删除整行;若大于目标,则删除整列。每次执行都会删除一行或一列,最多执行2n次。实现代码class Solution {public: bool Find(vector<v原创 2015-04-27 20:02:08 · 833 阅读 · 0 评论 -
九大排序算法总结
九大排序算法实现插入排序算法实现希尔排序算法实现选择排序算法实现冒泡排序算法实现归并排序算法实现快速排序算法实现堆排序算法实现基数排序算法实现原创 2015-02-15 13:35:47 · 13707 阅读 · 5 评论