随笔分类 -  算法学习

求两个数中的较大值max(a,b)。(不用if,>)
摘要:题目:求两个数的较大值,不能使用if、>。1.不使用if、>,还要比较大小,貌似就只能使用条件表达式: x=?:; (表达式1为true时,返回表达式2;否则返回表达式3)2.本题目中使用条件表达式: max(a.b)=? b:a; (表达式1为true时,返回b;否则返回a)3.如何写表达... 阅读全文

posted @ 2014-04-16 09:52 旭东的博客 阅读(8840) 评论(0) 推荐(1) 编辑

C++ 全排列函数 std::next_permutation与std::prev_permutation
摘要:C++ STL中提供了std::next_permutation与std::prev_permutation可以获取数字或者是字符的全排列,其中std::next_permutation提供升序、std::prev_permutation提供降序。1.std::next_permutation函数原... 阅读全文

posted @ 2014-04-14 15:19 旭东的博客 阅读(27953) 评论(0) 推荐(0) 编辑

使用递归哈希进行精确模式串匹配
摘要:字符串处理是每个编程者都必须掌握的知识,主要看看字符串的搜索查找功能。现在的编程语言如C/C++/Java等都提供了对字符串子串的查找功能,具体如下:(1)C:strchr,strstr。(2)C++:find,rfind,find_first_of,find_first_not_of等等。(3)Java:indexOf,lastIndexOf等。下面说明一种使用递归哈希进行字符串搜索/查找的方法:(1)递归哈希 维护一个窗口,大小为n。如下公式即为起始位置为x,长度为n的窗口的哈希数值。 递归哈希主要体现在哈希数值的更新操作,减少重复的计算。下面是递归哈希的更新公式。 因为窗口[x,x... 阅读全文

posted @ 2013-12-24 09:07 旭东的博客 阅读(2288) 评论(2) 推荐(0) 编辑

哈夫曼编码 哈夫曼树
摘要:1.定义 哈夫曼编码主要用于数据压缩。 哈夫曼编码是一种可变长编码。该编码将出现频率高的字符,使用短编码;将出现频率低的字符,使用长编码。 变长编码的主要问题是,必须实现非前缀编码,即在一个字符集中,任何一个字符的编码都不是另一个字符编码的前缀。如:0、10就是非前缀编码,而0、01不是非前缀编码。2.哈夫曼树的构造 按照字符出现的频率,总是选择当前具有较小频率的两个节点,组合为一个新的节点,循环此过程知道只剩下一个节点为止。 对于5个字符A、B、C、D、E,频率分别用1、5、7、9、6表示,则构造树的过程如下: 上面过程对应的哈夫曼树为: 假设规定左边为0,右边为1,则变长... 阅读全文

posted @ 2013-12-23 15:57 旭东的博客 阅读(1969) 评论(1) 推荐(0) 编辑

二分查找 查找关键字的范围
摘要:二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。二分查找对有序表查找的时间复杂度为lg(n)。一般的二分查找只是查找给定元素在数组中的位置或者是有存在给定的元素。下面的程序实现的功能是: 在顺序保存、有序的数组中查找给定关键字K的范围。程序: 1 #include 2 int values[]={1,2,3,5,7,7,7,7,9,10,10,10,12}; 3 4 /* 5 @low:查找范围的起始坐标 6 @high:查找范围的结束坐标 7 @key:待查找的关键字 8 @tag:查找标记。tag=0,表示查找关键字的最小坐... 阅读全文

posted @ 2013-12-19 14:48 旭东的博客 阅读(2816) 评论(0) 推荐(0) 编辑

Horspool 字符串匹配算法
摘要:Horspool 字符串匹配算法对Boyer-Moore算法的简化算法。Horspool 算法是一种基于后缀匹配的方法,是一种“跳跃式”匹配算法,具有sub-linear亚线性时间复杂度。Horspool 算法: 对于每个搜索窗口,该算法将窗口内的最后一个字符和模式串中的最后一个字符进行比较。如果相等,则需要进行一个校验过程。该校验过程在搜索窗口中从后向前对文本和模式串进行比较,直到完全相等或者在某个字符处不匹配。无论匹配与否,都将根据字符d在模式串中的下一个出现位置将窗口向右移动。 可以使用下图进行理解: (1)窗口大小与模式串大小相同,窗口内容为文本内容的一部分。 (2)对于窗口而... 阅读全文

posted @ 2013-11-22 16:59 旭东的博客 阅读(8090) 评论(0) 推荐(0) 编辑

Aho-Corasick 多模式匹配算法、AC自动机详解
摘要:Aho-Corasick算法是多模式匹配中的经典算法,目前在实际应用中较多。Aho-Corasick算法对应的数据结构是Aho-Corasick自动机,简称AC自动机。搞编程的一般都应该知道自动机FA吧,具体细分为:确定性有限状态自动机(DFA)和非确定性有限状态自动机NFA。普通的自动机不能进行多模式匹配,AC自动机增加了失败转移,转移到已经输入成功的文本的后缀,来实现。1.多模式匹配 多模式匹配就是有多个模式串P1,P2,P3...,Pm,求出所有这些模式串在连续文本T1....n中的所有可能出现的位置。 例如:求出模式集合{"nihao","hao" 阅读全文

posted @ 2013-11-20 14:25 旭东的博客 阅读(42356) 评论(3) 推荐(5) 编辑

一致性哈希算法应用与分析
摘要:一致性哈希算法主要使用在分布式数据存储系统中,按照一定的策略将数据尽可能均匀分布到所有的存储节点上去,使得系统具有良好的负载均衡性能和扩展性。感觉一致性哈希与数据结构中的“循环队列”还是有一点联系的。 1.简单哈希算法 哈希(hash)计箅是常见的数据分布技术,其通过求模运算来计算哈希值,然后据此将 阅读全文

posted @ 2013-09-02 21:15 旭东的博客 阅读(5440) 评论(0) 推荐(0) 编辑

字符串 全排列生成问题
摘要:转自:http://blog.csdn.net/zinss26914/article/details/8939140问题 输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则输出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba思路 1.这是典型的递归求解问题,递归算法有四个特性:必须有可达到的终止条件,否则程序陷入死循环子问题在规模上比原问题小子问题可通过再次递归调用求解子问题的解应能组合成整个问题的解 2.对于字符串的排列问题: 如果能生成n-1个元素的全排列,就能生成n个元素的全排列。对于只有一个元素的集合,可以直接生成全排... 阅读全文

posted @ 2013-07-19 15:54 旭东的博客 阅读(9965) 评论(2) 推荐(1) 编辑

算法导论第九章 第K顺序统计量
摘要:1.第K顺序统计量概念 在一个由n个元素组成的集合中,第k个顺序统计量是该集合中第k小的元素。例如,最小值是第1顺序统计量,最大值是第n顺序统计量。2.求Top K元素与求第K顺序统计量不同 Top K元素:是指求数组中的最大(或者最小的)K个元素,一般K比较小,采用最大(或者最小)堆实现。之前写过的一篇有关文章是:海量数据处理的 Top K算法(问题) 小顶堆实现 第K顺序统计量:只求解数组中的第K大元素,是求解一个元素。一般使用“快速排序”的思想,将数组划分求解。3.第K顺序统计量求解代码 这是求解第K统计量代码,即第k小。如果要求第K大,可以根据数组长度转化为第n-k小。publ... 阅读全文

posted @ 2013-07-14 11:45 旭东的博客 阅读(2326) 评论(0) 推荐(0) 编辑

字符串相似度算法 递归与动态规划求解分析
摘要:1.概念 编辑距离,指的是两个字符串之间,由一个转换成另一个所需的最少编辑操作次数。许可的编辑操作包括:(1)将一个字符替换成另一个字符,(2)插入一个字符,(3)删除一个字符。 相似度,等于“编辑距离+1”的倒数。2.分析 设有字符串a[0...n],b[0...m]。 (1)当a[i]=b[j]时,说明这时候不需要编辑操作。编辑距离保持,即f(i,j)=f(i-1,j-1) (2)当a[i]!=b[j]时,可以有三种编辑操作。 其中删除和插入操作,只对一个下标i或者j产生影响。如在下图中,当前匹配到(t1,t2)处,如果采用删除'g',只改变t1的下标。 其中替换操作,会. 阅读全文

posted @ 2013-07-11 14:25 旭东的博客 阅读(4854) 评论(0) 推荐(0) 编辑

二路归并排序 代码实例
摘要:感觉好久没有写排序程序了,C语言有qsort()函数,C++有sort()函数,java语言有Arrays类(主要这个不是Array)。今天写了一下归并排序还有点费劲呀。晚上回来写写。 归并排序就是采用分治法进行排序: (1)将一个数组分成小的2个数组分别进行排序; (2)之后将分出来的已经拍好序的数组进行合并;晚上写的java二路归并排序代码如下:import java.util.Scanner;public class MergeSort { int[] a=null; int[] b=null; int n; Scanner sin=null; ... 阅读全文

posted @ 2013-07-02 22:47 旭东的博客 阅读(2175) 评论(0) 推荐(0) 编辑

海量数据处理的 Top K算法(问题) 小顶堆实现
摘要:问题描述:有N(N>>10000)个整数,求出其中的前K个最大的数。(称作Top k或者Top 10) 问题分析:由于(1)输入的大量数据;(2)只要前K个,对整个输入数据的保存和排序是相当的不可取的。 可以利用数据结构的最小堆来处理该问题。 最小堆如图所示,对于每个非叶子节点的数值,一定不大于孩子节点的数值。这样可用含有K个节点的最小堆来保存K个目前的最大值(当然根节点是其中的最小数值)。 每次有数据输入的时候可以先与根节点比较。若不大于根节点,则舍弃;否则用新数值替换根节点数值。并进行最小堆的调整。 实现代码以及说明:#include<stdio... 阅读全文

posted @ 2013-03-20 15:24 旭东的博客 阅读(49763) 评论(4) 推荐(3) 编辑

斐波那契数列 矩阵求法 优化
摘要:在做编程题目的时候经常会遇到“斐波那契数列”相关的题目,尤其在做OJ中。下面说一些方法: (一)递归 递归是最慢的会发生重复计算,时间复杂度成指数级。long long fac(int n){ if(n==1) return 1; else if(n==2) return 2; else return fac(n-1)+fac(n-2);} (二)循环 利用临时变量来保存中间的计算过程,加快运算。long long fac(int n){ long long a=1,b=2,c; if(n==1) return 1; else if(n=... 阅读全文

posted @ 2013-03-19 10:39 旭东的博客 阅读(21199) 评论(2) 推荐(4) 编辑

物件捆绑 背包问题 动态规划 求解
摘要:物件捆绑背包问题:给定N元钱,要购买一些器件。器件有主件和附件之分,也即主件可以单独购买,然而购买附件必须购买对应的主件。下表就是一些主件与附件的例子:主件附件电脑 打印机、扫描仪书柜图书书桌 台灯工作椅无 把每件物品规定一个重要度,分为5等:用整数1~5表示,第5等最重要。在花费不超过N元(可以等于N元)的前提下,使每件物品的价格与重要度的乘积的总和最大。设第j件物品的价格为v[j],重要度为p[j],共选中了k件物品,编号依次为j1,j2,……,jk,则所求的总和为:v[j1]*p[j1]+v[j2]*p[j2]+…+v[jk]*p[jk]。 输入 第1行,为两个正整... 阅读全文

posted @ 2013-03-18 17:10 旭东的博客 阅读(1284) 评论(0) 推荐(0) 编辑

砝码称重问题求解:动态规划与母函数方法
摘要:砝码称重问题:设有1g、2g、3g、5g、10g、20g的砝码各若干枚(其质量<=1000g),求出用他们能称出的质量的种类数(不包括质量为0的情况)。 一、动态规划方法求解 设dp[1000]数组为标记数组。当dp[i]=0时,表示质量为i的情况,目前没有称出;当dp[i]=1时,表示质量为i的情况已经称出。 本题目中有多个砝码,我们顺序处理每一个砝码。 当处理第j个砝码,质量为wj时,有下列推导公式: 完整程序代码如下:#include<stdio.h>#include<string.h>int sum; ///表示输入的砝码的总质量int ... 阅读全文

posted @ 2013-03-17 21:53 旭东的博客 阅读(9231) 评论(0) 推荐(2) 编辑

最长公共子序列求解:递归与动态规划方法
摘要:在做OJ题目的时候,经常会用到字符串的处理。例如,比较二个字符串相似度。这篇文章介绍一下求两个字符串的最长公共子序列。 一个字符串的子序列,是指从该字符串中去掉任意多个字符后剩下的字符在不改变顺序的情况下组成的新字符串。 最长公共子序列,是指多个字符串可具有的长度最大的公共的子序列。 (1)递归方法求最长公共子序列的长度 1)设有字符串a[0...n],b[0...m],下面就是递推公式。 当数组a和b对应位置字符相同时,则直接求解下一个位置;当不同时取两种情况中的较大数值。 2)代码如下:#include#includechar a[30],b[30]... 阅读全文

posted @ 2013-03-15 14:46 旭东的博客 阅读(47332) 评论(10) 推荐(4) 编辑

导航