算法实现
文章平均质量分 86
DreamMakers
凡办大事,以识为主,以才为辅,凡成大事,人谋居半,天意居半。
展开
-
编辑距离,最长公共子序列,最长公共子串,最长递增子序列
1.编辑距离编辑距离,又称Levenshtein距离(也叫做Edit Distance),是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。俄罗斯科学家Vladimir Levenshtein在1965年提出这个概念。例如将kitten一字转成sitting:sitten (k→s)sitti转载 2013-09-25 23:11:26 · 998 阅读 · 0 评论 -
KMP算法详解
KMP字符串模式匹配详解来自CSDN A_B_C_ABC 网友KMP字符串模式匹配通俗点说就是一种在一个字符串中定位另一个串的高效算法。简单匹配算法的时间复杂度为O(m*n);KMP匹配算法。可以证明它的时间复杂度为O(m+n).。一. 简单匹配算法先来看一个简单匹配算法的函数:int Index_BF ( char S [ ], char T [ ], int po转载 2013-03-24 23:08:31 · 802 阅读 · 0 评论 -
二分查找在数组中应用的若干实例
在编程之美3.11一节中,我们遇到这么一个问题:找出一个有序(字典序)字符串数组中等于指定字符串的序号,如果有多个元素存在,则返回其中序号最大的。对于这个问题,我们首先从非降序整形数组来看看如何实现,二分查找的思想很简单,就是不断判断数组中中间位置的元素与关键元素的大小关系,从而确定是在数组的左半部分继续查找还是在数组的右半部分继续查找。下面是Java实现二分查找的代码:package原创 2013-03-24 10:05:28 · 1502 阅读 · 0 评论 -
计算字符串的相似度
1.百度百科介绍: Levenshtein 距离,又称编辑距离,指的是两个字符串之间,由一个转换成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。 编辑距离的算法是首先由俄国科学家Levenshtein提出的,故又叫Levenshtein Distance。2.用途模糊查询3.实现过程 a.首先是有两个字符串,这里转载 2013-03-22 21:03:52 · 847 阅读 · 0 评论 -
用于最小生成树的Kruskal算法实现
Kruskal算法和Prim算法,作为最古老和最知名的算法,是用于求解一个连通图最小生成树问题的。在下一节我们我们会讲解另一种算法,在这一节里我们来学习一下什么是Kruskal算法。首先我们来看看什么是生成树,什么是最小生成树?生成树是指在一个连通图中由图中所有顶点和一些边所组成的无环连通子图。在加权无向图中,最小生成树是指权值和最小的生成树。在上个算法中我们学习了加权无向图该如何表示,由原创 2013-03-21 17:05:15 · 1433 阅读 · 0 评论 -
用于最小生成树的Prim算法实现
Prim算法,同Kruskal算法一样,也是解决最小生成树的算法。在讲这个算法前,我们先来看看其他的一些概念。什么是割?在无向图中,割指的是对图的一种划分。当一条边(u,v)的一个顶点属于S,另一个顶点属于V-S,则我们称(u,v)边通过割(S,V-S)。如果一个边的集合A中没有任何一条边通过割,则我们称该割不妨害边集A。如果某条边的权值在通过某个割的所有边中是最小的,则称该边是通过该割的一条原创 2013-03-21 17:08:23 · 942 阅读 · 0 评论 -
寻找数组的最大值与最小值
问题:寻找数组中的最小值和最大值。 一道很简单的题目,一般有下面4种解法:1 遍历两次,每次分别找出最小值和最大值。2 只遍历一次,每次取出的元素先与已找到的最小值比较,再与已找到的最大值比较。3 每次取两个元素,将较小者与已找到的最小值比较,将较大者与已找到的最大值比较。4 分治:将数组划分成两半,分别找出两边的最小值、最大值,则最小值、最大值分别是两边最小值的较转载 2012-11-20 21:55:17 · 2706 阅读 · 0 评论 -
字符串移位包含问题研究
问题:给定两个字符串s1和s2,要求判定s2是否能够通过s1做循环移位得到字符串包含,例如s1=AABCD,s2=CDAA,则返回true,如果s1=ABCD,s2=ACBD,则返回false。解法1:对字符串做循环移位,然后判断移位后的字符串是否包含s2.这种方法需要穷举,效率较低。 public static boolean containStr1(String s1,String s原创 2012-11-18 17:36:26 · 877 阅读 · 0 评论 -
数组中最长递增子序列问题研究(2)
在上一篇文章中,我们知道如何得到一个一维数组的最长递增子序列的长度,但是我们并不知道这个子序列是什么!如何去列举出来一个满足要求的这样一个最长递增子序列呢?在之前讲述的第二种方法中,我们借助了一个minV数组,这个数组对于接下来的实现是有帮助的。我们从一个数组的第一个元素开始遍历,一直遍历到这个元素对应的lis数组中的值不大于最长递增子序列的长度。我们假设使用current指示想获得的最终最长原创 2012-11-18 14:21:23 · 900 阅读 · 0 评论 -
最长公共子序列求解
给定两个序列X和Y,如果Z既是X的子序列,也是Y的子序列,则Z是X与Y的公共子序列,如果Z在X和Y的所有公共子序列中长度最长,则称Z为X和Y 的最长公共子序列。需要说明的是:公共子序列并不要求在原序列中是连续出现的,只要保证公共子序列在原序列中是顺序出现的即可。下面的程序是按照算法导论中的思想用Java语言实现的,代码如下所示:package com.application.sampl原创 2012-11-16 23:39:27 · 770 阅读 · 0 评论 -
数组中最长递归子序列问题研究(1)
问题:对于一个一维数组,求这个一维数组中的最长递增子序列的长度。例如:如果一维数组为{1,-1,2,-3,4,-5,6,-7},则得到的一个最长递增子序列为{1,2,4,7},长度为4。下面是java语言编写的两种实现方法。package com.application.sample;import java.util.Arrays;//求一个序列的最长递增子序列原创 2012-11-17 22:05:07 · 1235 阅读 · 0 评论 -
回溯法及举例分析
回溯法,按照百度百科的介绍,是指一种选优的搜索法,按照选优条件向前搜索,以达到目标,但当搜索到某一步时发现原先的选择并不优或者不能达到目标,则退回上一步重新选择,这种走不通就退回重新选择再走的方法就是回溯法。可用回溯法求解的问题P一般可以被如下描述:对于已知的由n元组(x1,x2,…,xn)组成的一个状态空间E={(x1,x2,…,xn)∣xi∈Si ,i=1,2,…,n},给定关于n元组中的原创 2012-11-13 22:29:57 · 2677 阅读 · 0 评论 -
如何用一个加号计算三个数的和
计算三个数字加和的方法是 ( a ^ b ^ c ) + ( ( ( a & b ) | ( b & c ) | ( a & c ) ) ... 但如果你要问这个公式是哪里来的 ... 你就要先弄明白什么是 加法 ...还没学会如何迈开脚步又怎么能跑起来 ... 三个数字之前 ... 我们先要从两个数字相加开始 ...首先你要知道计算机里面的数字都是以二进制存储的 ...转载 2013-04-28 21:32:22 · 1384 阅读 · 0 评论 -
从1到n的整数中1出现的次数
在和上都有这么一道题目,那就是求从1到n的整数中1出现的次数。这两本书中都给出了两种算法,本人觉得上的算法更胜一筹。现将两种算法实现如下。方法1:一个直观的方法就是遍历从1到n的每一个整数,利用一个子函数求出一个整数中所含1的个数,然后将所有整数中包含1的次数相加得到最后的结果。C代码实现:#include unsigned int totalnumberofone(un原创 2013-04-19 17:49:13 · 1040 阅读 · 0 评论 -
不用‘+’号实现两个数相加
加法很简单,可是如何不使用'+'号怎么来实现两个数相加呢?这个问题,实际可以通过位运算来解决,具体来说,就是将加法分解成两个部分,一个部分是不会进位的部分,另一部分就是可能产生进位的二进制位。我们只要将可能产生进制的二进制位通过位运算添加到之前不会进位的部分中去就可能得到最终的结果了。可能讲的并不太清楚,可以参考我博客中另外一篇相关的文章。由于时间的原因,现在仅给出程序代码,大家自己想想具原创 2013-08-15 00:45:52 · 1310 阅读 · 0 评论 -
AC 经典多模式匹配算法
今天说说多模式匹配AC算法(Aho and Corasick),感谢追风侠帮忙整理资料,while(1) {Juliet.say("3Q");}。前面学习了BM、Wu-Manber算法,WM由BM派生,不过AC与它们无染,是另外一种匹配思路。 1. 初识AC算法Step1: 将由patterns组成的集合(要同时匹配多个patterns嘛)构成一个有限状转载 2013-08-25 10:11:05 · 1131 阅读 · 0 评论 -
Boyer-Moore 经典单模式匹配算法
O了O了!我现特想说:一个人Boyer-Moore都敢闹明白,他还有什么不敢的呢^_^ 经典单模式匹配算法:KMP、BM;经典多模式匹配算法:AC、Wu-Manber。貌似实用中,KMP跟C库strstr()效率相当,而BM能快上3x-5x。于是小女不才花了小天的功夫来研究这个BM算法。BM如何快速匹配模式?它怎么跳跃地?我今儿一定要把大家伙儿讲明白了,讲不明白您佬跟帖,我买单,包教包会。转载 2013-08-25 09:28:56 · 876 阅读 · 0 评论 -
面试题之斐波那契数列(Fibonacci)系列
[定理1] 标准Fibonacci序列(即第0项为0,第1项为1的序列)当N大于1时,一定有f(N)和f(N-1)互质其实,结合“互质”的定义,和一个很经典的算法就可以轻松证明 对,就是辗转相除法 互质的定义就是最大公约数为1数学归纳法是很有用的证明方法,我们接下来这个定理用数学归纳法就很好证明: [定理2]若i为奇数, f(i)*f(i)=f(i-1)*f(i+1)+转载 2013-08-13 00:19:37 · 3209 阅读 · 0 评论 -
面试题之二叉树系列
1 求二叉树中相距最远的两个节点之间的距离2 判断二叉树是否平衡二叉树3 指定二叉树,给定两节点求其最近共同父节点4 二叉树的广度遍历、逐层打印二叉树节点数据、只打印某层节点数据5 在二叉树中找出和(叶子到根节点路径上的所有节点的数据和)为指定值的所有路径。6 将二叉查找树转为有序的双链表7 求转载 2013-08-13 00:01:30 · 983 阅读 · 0 评论 -
编程之美4.2 瓷砖覆盖地板
题目这个题目的题意很容易理解,在一个N*M的格子里,我们现在有两种类型的 砖块,1 * 2 和 2 * 1,问一共有多少种方案,可以将整个N*M的空间都填满。最简单的例子就是下面的了:编程之美中题目:某年夏天,位于希格玛大厦四层的微软亚洲研究院对办公楼的天井进行了一次大 规模的装修.原来的地板铺有 N×M 块正方形瓷砖,这些瓷砖都已经破损老化了,需要予以 更新.原创 2013-08-10 10:21:53 · 1373 阅读 · 1 评论 -
排列与组合问题
排列和组合问题是算法中比较常见的问题,在这一节里,我们将对常见的排列和组合问题进行探讨。(1)给定数字位数和进制,打印出所有的组合。对于这个问题,按照人的思维,就是对数字的每一个位进行不断选值,如3位2进制数,那么我们首先取最高位为0,取好后,再对次高位进行选值,次高位选好后,再对最低位取值位0,此时已经对所有位都取完值,直接输出即可。需要说明的是,这里需要事先声明一个数组用来保存每一位的原创 2013-08-06 15:50:39 · 704 阅读 · 0 评论 -
判断二叉树是否是二叉搜索树
问题给定一棵二叉树,判定该二叉树是否是二叉搜索树(Binary Search Tree)? 解法1:暴力搜索首先说明一下二叉树和二叉搜索树的区别。二叉树指这样的树结构,它的每个结点的孩子数目最多为2个;二叉搜索树是一种二叉树,但是它有附加的一些约束条件,这些约束条件必须对每个结点都成立:结点node的左子树所有结点的值都小于node的值。结点node的右子树所有结点的值都大转载 2013-07-19 23:58:53 · 1662 阅读 · 0 评论 -
程序员必知算法----BM字符串查找算法
BM字符串查找算法,由Boyer,Moore提出,因而得名。该算法和KMP算法思想一样,都是需要先进行预处理,然后在每次进行匹配失败时,根据预处理的结果,快速找到下一次继续匹配的位置。与KMP不同的是,BM算法在每次匹配时都从后往前开始匹配,这样可以确保在模式字符串的后面字符出现匹配失败时能够快速的进行下面的匹配。如果我们从前往后进行匹配检查,那么当出现前面字符匹配正确,而在最后一个字符出原创 2013-07-10 16:26:24 · 2562 阅读 · 0 评论 -
输出程序文件本身及删除程序中的注释
记得在我的以前的一篇文章中曾经写过一篇输出程序文件本身的文章,今天对那篇文章稍作拓展。一般程序员在写程序的时候,为了能够让以后理解更加方便容易,往往会添加上一些注释。注释在C/C++中有两种类型,分别如下所示:(1)//注释内容(2)/* 注释内容 [\n]*/下面我们就对这这两种情况进行分析,看看如何删去这些注释部分。对于第一种情况,以两个双斜杠开头的注释写法,只要我们在原创 2013-05-25 17:24:12 · 1262 阅读 · 0 评论 -
调整数组顺序使奇数位于偶数前面
题目:输入一个整数数组,实现一个函数调整数组的元素顺序,使得奇数位于偶数的前半部分,偶数位于数组的后半部分。对于这个问题,最直接的办法就是遍历这个数组,如果是奇数就往后遍历,如果是偶数,则将后面所有的元素往前移一位,并将这个偶数插入到数组的末尾位置。C语言实现如下:void adjustOddEven1(int *number,int n){ int i,j,key,co原创 2013-05-22 15:09:43 · 1934 阅读 · 0 评论 -
使用数组实现栈和循环队列(JAVA语言)
这篇文章将讲述两个问题。一是如何使用数组实现一个栈,栈的大小可以伸缩。二是使用数组实现一个队列,为了充分的利用数组的空间,这里实现一个循环,构成循环队列。(1)基于数组实现栈package com.datastructure.stack;import java.util.*;public class MyStack { private Object[] array=nu原创 2012-11-05 22:19:15 · 2067 阅读 · 0 评论 -
两道华为上机题目解答(Java语言)
给定一个数组input[] ,如果数组长度n为奇数,则将数组中最大的元素放到 output[] 数组最中间的位置,如果数组长度n为偶数,则将数组中最大的元素放到 output[] 数组中间两个位置偏右的那个位置上,然后再按从大到小的顺序,依次在第一个位置的两边,按照一左一右的顺序,依次存放剩下的数。例如:input[] = {3, 6, 1, 9, 7} output[] = {3, 7,原创 2012-11-06 11:37:45 · 1027 阅读 · 0 评论 -
透彻明白红黑树(3)
本套源码剖析把重点放在红黑树的3种插入情况,与红黑树的4种删除情况。其余的能从略则尽量简略。目录:一、左旋代码分析二、右旋三、红黑树查找结点四、红黑树的插入五、红黑树的3种插入情况六、红黑树的删除七、红黑树的4种删除情况八、测试用例好的,咱们还是先从树的左旋、右旋代码,开始(大部分分析,直接给注释):[cpp:nogutter] view转载 2012-10-17 15:49:10 · 1199 阅读 · 0 评论 -
数据结构之二叉树(1)
树形结构是一类很重要的非线性数据结构,它可以很好的描述客观世界中具有分支结构或者层次结构的对象,如操作系统的文件管理,编译程序中的语法结构和数据库系统信息组织形式等。树的定义如下:树是n(n>=0)个节点的有限集T,当T为空时为空树,否则满足一下两个条件:(1)有且仅有一个特定的称为根的节点;(2)其余的节点可以分为m个互不相交的子集,其中每个子集又是一棵树,称为根节点的子树。原创 2012-10-02 12:02:12 · 1249 阅读 · 0 评论 -
Stack基础知识1
栈(stack)在计算机科学中是限定仅在表尾进行插入或删除操作的线性表。栈是一种数据结构,它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据。在各种语言环境下,比如C++,JAVA或者C#中,对于栈都会提供两个基本的函数,即push和pop函数,分别用于向栈中压入对象和从栈中弹出对象。栈的实现可以有两种方式,如下所示:(1)链原创 2012-09-28 16:12:15 · 1105 阅读 · 0 评论 -
不使用*、/、+、-、%操作符求一个数的1/3
问:在不使用*、/、+、-、%操作符的情况下,如何求一个数的1/3?(用C语言实现)第一种方法:使用位操作符并实现“+”操作// 替换加法运算符 int add(int x, int y) { int a, b; do { a = x & y; b = x ^ y; x = a y = b; } whi转载 2012-09-26 23:18:29 · 726 阅读 · 0 评论 -
最新九月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试三十题
最新九月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试三十题引言 自发表上一篇文章至今(事实上,上篇文章更新了近3个月之久),blog已经停了3个多月,而在那之前,自开博以来的21个月每月都不曾断过。正如上一篇文章支持向量机通俗导论(理解SVM的三层境界)末尾所述:”额,blog许久未有更新了,因为最近实在忙,无暇顾及blog。“与此同时,工作之余,也一直在闲心研究数据挖掘:"转载 2012-09-27 10:02:41 · 5303 阅读 · 0 评论 -
字符串相关问题
目录曲之前奏第一节、一道俩个字符串是否包含的问题 1.1、O(n*m)的轮询方法 1.2、O(mlogm)+O(nlogn)+O(m+n)的排序方法 1.3、O(n+m)的计数排序方法第二节 2.1、O(n+m)的hashtable的方法 2.2、O(n+m)的数组存储方法第三节、O(n)到O(n+m)的素数方法第四节、字符串是否包含问题的继续补充转载 2012-05-23 18:31:27 · 1326 阅读 · 0 评论 -
数据结构之Hash算法
什么是Hash Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数转载 2012-05-18 10:00:43 · 2961 阅读 · 0 评论 -
查找算法的总结
查找算法从总体上来说可以分为四类,它们分别是顺序查找,二分查找,分块查找以及散列表。下面简单的介绍一下各种查找算法。(一)顺序查找原理:让关键字与队列中的数从第一个(或最后一个)开始逐个进行比较,直到找出与关键字相同的数为止,否则查找失败。顺序查找适用于线性表的顺序存储结构和链式存储结构。算法如下所示(其中ElemType为数据类型):int search(ElemType a原创 2012-05-15 20:25:15 · 1491 阅读 · 1 评论 -
排序问题的算法实现
在“排序问题总结”这篇文章中介绍了各种的排序算法,给出了各种算法的思想,并没有给出各种算法的实现。这篇文章对应上面的各种方法写出算法的实现。(欢迎转载,但请标明转载链接,谢谢)(一)直接插入排序#include "stdafx.h"#includeusing namespace std;int _tmain(int argc, _TCHAR* argv[]){原创 2012-05-09 11:05:27 · 922 阅读 · 0 评论 -
三种查找算法简介
一、顺序查找的基本思想:从表的一端开始,顺序扫描表,依次将扫描到的结点关键字和给定值(假定为a)相比较,若当前结点关键字与a相等,则查找成功;若扫描结束后,仍未找到关键字等于a的结点,则查找失败。 说白了就是,从头到尾,一个一个地比,找着相同的就成功,找不到就失败。很明显的缺点就是查找效率低。 适用于线性表的顺序存储结构和链式存储结构。计算平均查转载 2012-05-15 15:39:10 · 1599 阅读 · 0 评论 -
三色旗排序问题
三色旗的问题最早由E.W.Dijkstra所提出,他所使用的用语为Dutch Nation Flag(Dijkstra为荷兰人),而多数的作者则使用Three-Color Flag来称之。 假设有一条绳子,上面有红、白、蓝三种颜色的旗子,起初绳子上的旗子颜色并没有顺序,您希望将之分类,并排列为蓝、白、红的顺序,要如何移动次数才会最少,注意您只能在绳子上进行这个动作,而且一次只能调换原创 2012-05-08 10:22:37 · 6161 阅读 · 1 评论 -
排序问题总结
每天都在叫嚣自己会什么技术,什么框架,可否意识到你每天都在被这些新名词、新技术所迷惑,.NET、XML等等技术固然诱人,可是如果自己的基础不扎实,就像是在云里雾里行走一样,只能看到眼前,不能看到更远的地方。这些新鲜的技术掩盖了许多底层的原理,要想真正的学习技术还是走下云端,扎扎实实的把基础知识学好,有了这些基础,要掌握那些新技术也就很容易了。 要编写出优秀的代码同样要扎实的基础,如果排序和转载 2012-05-09 09:41:17 · 1182 阅读 · 0 评论 -
数据结构之二叉树(2)
遍历二叉树就是遵循某种次序,访问二叉树中的所有节点,每个节点只访问一次。二叉树的遍历有三种方式:前序遍历,中序遍历和后序遍历。所谓的前序,中序和后序是针对根节点来说的。前序遍历:首先访问根节点,然后访问左子树,最后访问右子树。中序遍历:首先访问左子树,然后访问根节点,最后访问右子树。后续遍历:首先访问左子树,然后访问右子树,最后访问根节点。下面我们对链式存储的二叉树进行遍历。原创 2012-10-02 13:43:20 · 749 阅读 · 0 评论